智能医学工程-云计算技术与应用-实验09-Kubernetes Monitor

233 阅读4分钟

一、实验目的

1、了解 Prometheus和HertzBeat;

2、掌握 Prometheus的部署;

3、实现Prometheus监控K8s集群;

4、实现HertzBeat监控K8s集群。

二、实验学时

2学时

三、实验类型

设计性

四、实验任务

1、完成Prometheus和Grafana的部署;

2、完成Prometheus监控K8s主机;

3、完成Prometheus监控K8s集群;

4、完成HertzBeat监控K8s集群;

5、完成监控数据可视化。

五、实验环境

1、硬件

本实验基于实验教学中心网络运维实验室服务器集群开展,每个实验小组分配集群中的1台物理服务器作为实验基础平台,提供云计算资源。每个人配备计算机1台。(学生可根据自身情况使用个人计算机)。

2、软件

Windows操作系统,或MacOS操作系统。

安装最新版本的浏览器,建议使用Edge、Chrome等。

3、网络

计算机使用无线网络接入局域网,能够访问实验教学中心网络运维实验室服务器集群,并支持对互联网的访问。

4、工具

无。

六、实验内容步骤

本实验需要VM 1台,配置信息如表8-1所示。

表8-1 虚拟机配置规划表

序号虚拟机配置操作系统配置
1虚拟机名称:Cloud-K8s-MonitorCPU:2核内存:2GB硬盘:40GB(系统盘) + 100GB(数据存储)网卡:Cloud-Platform-VM-Network主机名:Cloud-K8s-Monitor操作系统:openEuler 24.03 LTS SP1IP地址:172.16.125.107子网掩码:255.255.255.0网关:172.16.125.1DNS:172.16.125.3

1、部署Prometheus、Grafana和Alertmanager

步骤1:系统环境准备。创建数据目录并挂载、安装Docker环境。

#查看磁盘结构
[root@Cloud-K8s-Monitor ~]# lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                  8:0    0   40G  0 disk
├─sda1               8:1    0    1M  0 part
├─sda2               8:2    0    1G  0 part /boot
└─sda3               8:3    0   19G  0 part
  ├─openeuler-root 253:0    0   17G  0 lvm  /
  └─openeuler-swap 253:1    0    2G  0 lvm  [SWAP]
sdb                  8:16   0  100G  0 disk
sr0                 11:0    1 1024M  0 rom
#格式化/dev/sdb
[root@Cloud-K8s-Monitor ~]# mkfs.ext4 /dev/sdb
mke2fs 1.47.0 (5-Feb-2023)
丢弃设备块:完成
创建含有 26214400 个块(每块 4k)和 6553600 个 inode 的文件系统
文件系统 UUID:1522f744-18d2-450c-a555-40bc8c8ce7e3
超级块的备份存储于下列块:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872

正在分配组表:完成
正在写入 inode表:完成
创建日志(131072 个块):完成
写入超级块和文件系统账户统计信息:已完成
#创建数据目录并赋予权限
mkdir /data
chmod 777 /data
#进行挂载
mount /dev/sdb /data
#开机自动挂载
echo '/dev/sdb    /data    ext4    defaults    0    0' >> /etc/fstab 
#安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://hub.xdark.top",
    "https://hub.littlediary.cn",
    "https://dockerpull.org",
    "https://hub.crdz.gq",
    "https://docker.1panel.live",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.m.daocloud.io",
    "https://noohub.ru",
    "https://huecker.io",
    "https://dockerhub.timeweb.cloud",
    "https://docker.1panel.dev",
    "https://docker.unsee.tech",
    "https://docker.1panel.live"
  ]
}
EOF
systemctl start docker
systemctl enable docker

步骤2:编写yaml文件,部署Prometheus、Grafana、Alertmanager

(1)分别创建/data/prometheus/data/alertmanager/data/grafana目录作为prometheusalertmanagergrafana服务的数据目录,并分别设置目录/data/prometheus/data/grafana的权限为777。

mkdir -p /data/{prometheus,alertmanager,grafana}
chmod 777 /data/prometheus
chmod 777 /data/grafana

(2)分别创建/etc/prometheus/etc/alertmanager/etc/grafana目录,并在/etc/prometheus目录下创建prometheus服务的配置文件prometheus.yml,在/etc/alertmanager目录下创建alertmanager服务的配置文件config.yml,在/etc/grafana目录下创建grafana服务的配置文件config.monitoring

mkdir -p /etc/{prometheus,alertmanager,grafana}
vi /etc/prometheus/prometheus.yml
----------/etc/prometheus/prometheus.yml----------
# 全局参数
global:
  scrape_interval: 15s     # 设定抓取数据的周期,默认为1min
  scrape_timeout: 15s      # 设定抓取数据的超时时间,默认为10s
  evaluation_interval: 30s # 设定更新rules文件的周期,默认为1min
  external_labels:         # 额外的属性,会添加到拉取得数据并存到数据库中
    monitor: 'codelab-monitor'

scrape_configs:
  # 监控自身
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  # 监控alertmanager
  - job_name: "alertmanager"
    static_configs:
      - targets: ["172.16.125.107:9093"]
----------/etc/prometheus/prometheus.yml----------

vi /etc/alertmanager/config.yml
----------/etc/alertmanager/config.yml----------
# 全局配置,配置邮件服务器
global:
  smtp_from: '' # 配置发件人邮箱地址 可配置自己的邮箱
  smtp_smarthost: 'smtp.163.com:25' # SMTP 服务器地址与端口,也可配置qq邮箱。
  smtp_auth_username: '' # 配置发件人邮箱地址 可配置自己的邮箱
  smtp_auth_password: '' # 配置发件人邮箱密码 可配置自己邮箱的密码
  smtp_require_tls: false
  smtp_hello: '163.com'

# 路由配置
route:
  group_by: ['alertname']     # 根据告警名称分组
  group_wait: 5s              # 等待时间,等待同一组告警的时间
  group_interval: 5s          # 每组告警之间的间隔时间
  repeat_interval: 2m         # 重复发送间隔时间
  receiver: 'email'           # 默认接收者设置为'email',即下方定义的'email'接收者

# 接收者配置
receivers:
- name: 'email'               # 接收者名称
  email_configs:
  - to: '3183748324@qq.com'  # 收件人邮箱地址
    send_resolved: true        # 是否发送已解决的告警
----------/etc/alertmanager/config.yml----------

vi /etc/grafana/config.monitoring
----------/etc/grafana/config.monitoring----------
# grafana管理界面的登录用户密码,用户名是admin
GF_SECURITY_ADMIN_PASSWORD=admin#123456
# grafana管理界面是否允许注册,默认不允许
GF_USERS_ALLOW_SIGN_UP=false
----------/etc/grafana/config.monitoring----------

(3)编写docker compose配置文件,创建Prometheus +Grafana + Alertmanager容器,docker compose文件内容如下:

vi docker-compose.yml
-----------------docker-compose.yml------------------
version: '3.3'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/prometheus/:/etc/prometheus/
      - /data/prometheus:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
      #热加载配置
      - '--web.enable-lifecycle'
      #api配置
      #- '--web.enable-admin-api'
      #历史数据最大保留时间,默认15天
      - '--storage.tsdb.retention.time=720d'
    networks:
      net:
        ipv4_address: 172.20.210.10
    links:
      - alertmanager
      - cadvisor
    expose:
      - '9090'
    ports:
      - 9090:9090
    depends_on:
      - cadvisor

  alertmanager:
    image: prom/alertmanager:v0.25.0
    container_name: alertmanager
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/alertmanager/:/etc/alertmanager/
      - /data/alertmanager:/alertmanager
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
    networks:
      net:
        ipv4_address: 172.20.210.11
    expose:
      - '9093'
    ports:
      - 9093:9093

  cadvisor:
    image: google/cadvisor:latest
    container_name: cadvisor
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    networks:
      net:
        ipv4_address: 172.20.210.12
    expose:
      - '8080'
    ports:
      - '8080:8080'

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/grafana:/var/lib/grafana
      - /etc/grafana/provisioning/:/etc/grafana/provisioning/
    env_file:
      - /etc/grafana/config.monitoring
    networks:
      net:
        ipv4_address: 172.20.210.13
    links:
      - prometheus
    ports:
      - 3000:3000
    depends_on:
      - prometheus

networks:
 net:
  driver: bridge
  ipam:
   config:
    - subnet: 172.20.210.0/24
-----------------docker-compose.yml------------------

(4)执行docker compose,创建Prometheus +Grafana + Alertmanager容器服务。

docker compose -f docker-compose.yml up -d

安装完成后,用浏览器分别访问Prometheus:http://IP:9090,和Grafana:http://IP:3000,如图1-1和1-2所示。

2、在K8s上部署采集器

(1)部署node-exporter

#创建命名空间devops
[root@k8s-master ~]# kubectl create namespace devops
#编写yaml文件,部署node_export
[root@k8s-master ~]# vi node_export.yaml
---------------node_export.yaml-----------------
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
        k8s-app: node-exporter
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - image: bitnami/node-exporter:1.7.0
        imagePullPolicy: IfNotPresent
        name: prometheus-node-exporter
        ports:
        - containerPort: 9100
          hostPort: 9100
          protocol: TCP
          name: metrics
        volumeMounts:
        - mountPath: /host/proc
          name: proc
        - mountPath: /host/sys
          name: sys
        - mountPath: /host
          name: rootfs
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
      hostNetwork: true # 使用宿主机网络和PID
      hostPID: true
---------------node_export.yaml-----------------
[root@k8s-master ~]# kubectl apply -f node_export.yaml

(2)部署kube-state-metrics

vi kube-state-metrics.yaml
----------kube-state-metrics.yaml------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-state-metrics
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: kube-state-metrics
      containers:
      - name: kube-state-metrics
        image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/kube-state-metrics:v2.6.0
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics
rules:
- apiGroups: [""]
  resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]
  verbs: ["list", "watch"]
- apiGroups: ["extensions"]
  resources: ["daemonsets", "deployments", "replicasets"]
  verbs: ["list", "watch"]
- apiGroups: ["apps"]
  resources: ["statefulsets"]
  verbs: ["list", "watch"]
- apiGroups: ["batch"]
  resources: ["cronjobs", "jobs"]
  verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
- kind: ServiceAccount
  name: kube-state-metrics
  namespace: kube-system

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: 'true'
  name: kube-state-metrics
  namespace: kube-system
  labels:
    app: kube-state-metrics
spec:
  type: NodePort
  ports:
  - name: kube-state-metrics
    port: 8080
    targetPort: 8080
    nodePort: 31888
    protocol: TCP
  selector:
    app: kube-state-metrics
----------kube-state-metrics.yaml------------
[root@k8s-master ~]# kubectl apply -f kube-state-metrics.yaml

3、修改Prometheus配置文件,配置监控对象

#在配置文件prometheus.yml后添加监控任务
vi /etc/prometheus/prometheus.yml
---------------prometheus.yml------------------
  # 监控主机
  - job_name: "K8sHost"
    static_configs:
      - targets: ["172.16.125.101:9100","172.16.125.102:9100","172.16.125.103:9100","172.16.125.104:9100","172.16.125.105:9100"]
  # 监控K8s
  - job_name: "K8s-Cluster"
    honor_timestamps: true
    metrics_path: /metrics
    scheme: http
    static_configs:
      - targets: ["172.16.125.101:31888"]
    metric_relabel_configs:
      - target_label: cluster
        replacement: K8s-Cluster
------------------------------------------------
#重启prometheus容器
docker restart prometheus

使用浏览器访问Prometheus查看监控对象。

4、在Grafana进行数据可视化

步骤1:添加Prometheus数据源

选择左侧菜单“Connections”->“Data sources”,点击右上角【add new data source】按钮,选择prometheus类型的数据源进行配置,在这里配置prometheus服务器的访问路径:http://172.16.125.107:9090,如图9-2所示,其他设置保存默认,最后测试并保存,如图9-3所示。

步骤2:添加仪表盘

(1)选择左侧菜单“Dashboards”->“New”->“Import”,输入仪表盘ID为11074并载入,如图9-4、图9-5所示。

(2)最后导入该仪表盘,数据展示如图9-6所示。

(3)按照上述步骤,添加仪表盘ID为15661并载入,最后导入该仪表盘,数据展示如图9-7所示。

💡

提醒:

可以到 Grafana官网grafana.com/grafana/das…

5、使用HertzBeat监控K8s

步骤1:部署HertzBeat

docker run -d -p 1157:1157 -p 1158:1158 \
-v $(pwd)/data:/opt/hertzbeat/data \
-v $(pwd)/logs:/opt/hertzbeat/logs \
--restart=always \
--name hertzbeat apache/hertzbeat

浏览器访问http://172.16.125.107:1157/,默认账户密码 admin/hertzbeat,如图9-8所示、9-9所示。

步骤2:添加K8s监控

在左侧菜单栏选择“监控中心”->“新增监控”->“云原生监控”->“Kubernetes”,配置监控信息测试连接并添加,如图9-10、图9-11所示。

💡

提醒:

认证Token的获取方式可参考《实验7-Kubernetes Cluster》使用Token添加已有Kubernetes 集群到 Kuboard。复制脚本指令,直接粘贴到 kubernetes 集群的 master 节点的命令行窗口执行,以获得 Token。

步骤3:查看K8s监控数据

监控实时数据详情如图9-12所示,监控历史图表详情如图9-13所示。

七、实验讲解

本实验配置讲解视频,访问课程学习平台。

八、实验考核

实验考核为【实验随堂查】。

实验随堂查:每个实验设置3-5考核点,学生现场进行演示和汇报讲解。

1、考核点

考核点1:完成Prometheus监控平台的部署。(30分)

考核点2:使用Grafana可视化监控数据。(40分)

考核点3:使用HertzBeat监控K8s。(30分)

2、考核方式

以实验小组为单位进行考核,每个小组由1位同学进行实验成果汇报,小组其他成员回答教师提问。根据汇报和答疑情况,对小组成员进行逐一打分。

由教师进行评分。