k8s集群 安装配置 Prometheus+grafana+alertmanager
k8s环境如下:
k8s集群: k8s的控制节点
ip:192.168.40.110
主机名:k8smaster1
配置:4vCPU/4Gi内存
k8s的工作节点:
ip:192.168.40.111
主机名:k8snode1
配置:4vCPU/4Gi内存
k8s版本1.25
机器规划:
我的实验环境使用的k8s集群是一个master节点和一个node节点
master节点的机器ip是192.168.40.110,主机名是k8smaster1
node节点的机器ip是192.168.40.111,主机名是k8snode1
node-exporter组件安装和配置
安装node-exporter
kubectl create ns monitor-sa
ctr -n=k8s.io images import node-exporter.tar.gz
docker load -i node-exporter.tar.gz
cat node-export.yaml
kind: DaemonSet #可以保证k8s集群的每个节点都运行完全一样的pod
spec:
hostPID: true
hostIPC: true
hostNetwork: true
# hostNetwork、hostIPC、hostPID都为True时,表示这个Pod里的所有容器
#会直接使用宿主机的网络,直接与宿主机进行IPC(进程间通信)通信,可以看到宿主机里正在运行的所有进程。
#加入了hostNetwork:true会直接将我们的宿主机的9100端口映射出来
#从而不需要创建service 在我们的宿主机上就会有一个9100的端口
cpu: 0.15 #这个容器运行至少需要0.15核cpu
securityContext:
privileged: true #开启特权模式
args:
- --path.procfs #配置挂载宿主机(node节点)的路径
- /host/proc
- --path.sysfs #配置挂载宿主机(node节点)的路径
- '"^/(sys|proc|dev|host|etc)($|/)"'#通过正则表达式忽略某些文件系统挂载点的信息收集
volumeMounts:
- name: dev
mountPath: /host/dev
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: rootfs
mountPath: /rootfs
#将主机/dev、/proc、/sys这些目录挂在到容器中,这是因为我们采集的很多节点数据都是通过这些文件来获取系统信息的。
kubectl apply -f node-export.yaml
kubectl get pods -n monitor-sa
通过node-exporter采集数据
显示192.168.40.180主机cpu的使用情况
curl http://虚拟机ip:9100/metrics
curl http://192.168.40.110:9100/metrics | grep node_cpu_seconds
- #HELP:解释当前指标的含义,上面表示在每种模式下node节点的cpu花费的时间,以s为单位
- #TYPE:说明当前指标的数据类型,上面是counter类型
node_cpu_seconds_total{cpu="0",mode="idle"} :
- cpu0上idle进程占用CPU的总时间,CPU占用时间是一个只增不减的度量指标,从类型中也可以看出node_cpu的数据类型是counter(计数器)
- counter计数器:只是采集递增的指标
显示192.168.40.180主机负载使用情况
curl http://192.168.40.180:9100/metrics | grep node_load
- node_load1该指标反映了当前主机在最近一分钟以内的负载情况,系统的负载情况会随系统资源的使用而变化,因此node_load1反映的是当前状态,数据可能增加也可能减少,从注释中可以看出当前指标类型为gauge(标准尺寸)
- gauge标准尺寸:统计的指标可增加可减少
Prometheus server安装和配置
创建sa账号,对sa做rbac授权
kubectl create serviceaccount monitor -n monitor-sa
kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin --serviceaccount=monitor-sa:monitor
kubectl create clusterrolebinding monitor-clusterrolebinding-1 -n monitor-sa --clusterrole=cluster-admin --user=system:serviceaccount:monitor:monitor-sa
创建prometheus数据存储目录
#在节点创建
mkdir /data
chmod 777 /data/
安装Prometheus server服务
kubectl apply -f prometheus-cfg.yaml
cat prometheus-cfg.yaml
scrape_interval: 15s #采集目标主机监控据的时间间隔
scrape_timeout: 10s # 数据采集超时时间,默认10s
evaluation_interval: 1m #触发告警检测的时间,默认是1m
#我们写了超过80%的告警,结果收到多条告警,但是真实超过80%的只有一个时间点。
#这是另外一个参数影响的
evaluation_interval #这个是触发告警检测的时间,默认为1m。假如我们的指标是5m被拉取一次。
#检测根据evaluation_interval 1m一次,所以在值被更新前,我们一直用的旧值来进行多次判断,造成了1m一次,同一个指标被告警了4次。
scrape_configs:
#scrape_configs:配置数据源,称为target,每个target用job_name命名。又分为静态配置和服务发现
- job_name: 'kubernetes-node'
kubernetes_sd_configs:
#使用的是k8s的服务发现
- role: node
# 使用node角色,它使用默认的kubelet提供的http端口来发现集群中每个node节点。
relabel_configs:
#重新标记
- source_labels: [__address__] #配置的原始标签,匹配地址
regex: '(.*):10250' #匹配带有10250端口的url
replacement: '${1}:9100' #把匹配到的ip:10250的ip保留
target_label: __address__ #新生成的url是${1}获取到的ip:9100
action: replace
- action: labelmap
#匹配到下面正则表达式的标签会被保留,如果不做regex正则的话,默认只是会显示instance标签
regex: __meta_kubernetes_node_label_(.+)
通过deployment部署prometheus
ctr -n=k8s.io images import prometheus-2-2-1.tar.gz
#1.24前用 docker load -i prometheus-2-2-1.tar.gz
kubectl apply -f prometheus-deploy.yaml
cat prometheus-deploy.yaml
- --storage.tsdb.path=/prometheus #旧数据存储目录
- --storage.tsdb.retention=720h #何时删除旧数据,默认为15天。
- --web.enable-lifecycle #开启热加载
kubectl get pods -n monitor-sa
给prometheus pod创建一个service
kubectl apply -f prometheus-svc.yaml
kubectl get svc -n monitor-sa
http://192.168.40.110:31090/graph
可看到如下页面:
Prometheus热加载
kubectl get pods -n monitor-sa -o wide -l app=prometheus
curl -X POST http://10.244.249.2:9090/-/reload
- 热加载速度比较慢,可以暴力重启prometheus,如修改上面的prometheus-cfg.yaml文件之后,可执行如下强制删除:
kubectl delete -f prometheus-cfg.yaml
kubectl delete -f prometheus-deploy.yaml
- 然后再通过apply更新:
kubectl apply -f prometheus-cfg.yaml
kubectl apply -f prometheus-deploy.yaml
可视化UI界面Grafana的安装和配置
安装Grafana
ctr -n=k8s.io images import heapster-grafana-amd64_v5_0_4.tar.gz
kubectl apply -f grafana.yaml
kubectl get pods -n kube-system -l task=monitoring
Grafana界面接入Prometheus数据源
kubectl get svc -n kube-system | grep grafana
配置grafana界面:
http://prometheus.monitor-sa.svc:9090
配置好的整体页面如下:
导入的监控模板,可在如下链接搜索
https://grafana.com/dashboards?dataSource=prometheus&search=kubernetes
导入docker_rev1.json监控模板,步骤和上面导入node_exporter.json步骤一样,导入之后显示如下:
如果Grafana导入Prometheusz之后,发现仪表盘没有数据,如何排查?
安装kube-state-metrics组件
kube-state-metrics是什么?
- kube-state-metrics通过监听API Server生成有关资源对象的状态指标,比如Node、Pod,需要注意的是kube-state-metrics只是简单的提供一个metrics数据,并不会存储这些指标数据,所以我们可以使用Prometheus来抓取这些数据然后存储,主要关注的是业务相关的一些元数据,
- 比如Pod副本状态等;调度了多少个replicas?现在可用的有几个?多少个Pod是running/stopped/terminated状态?Pod重启了多少次?我有多少job在运行中。
安装kube-state-metrics组件
kubectl apply -f kube-state-metrics-rbac.yaml
ctr -n=k8s.io images import kube-state-metrics_1_9_0.tar.gz
kubectl apply -f kube-state-metrics-deploy.yaml
kubectl get pods -n kube-system -l app=kube-state-metrics
kubectl apply -f kube-state-metrics-svc.yaml
kubectl get svc -n kube-system | grep kube-state-metrics