一、实验目的
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目录作为prometheus、alertmanager、grafana服务的数据目录,并分别设置目录/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位同学进行实验成果汇报,小组其他成员回答教师提问。根据汇报和答疑情况,对小组成员进行逐一打分。
由教师进行评分。