今天继续给大家介绍Linux运维相关知识,本文主要内容是Prometheus监控Kubernetes集群节点。
首先,我们先来部署Node-exporter节点,为了使得我们的Prometheus监控每一个节点,我们使用了DaemonSet控制器,使得我们在每个Node节点上都运行一个Node-exporter,并且在集群节点添加或者删除后,能够进行自动扩展。Node-exporter的配置文件内容如下:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: node-exporter
namespace: kube-system
labels:
name: node-exporter
spec:
template:
metadata:
labels:
name: node-exporter
spec:
hostPID: true
hostIPC: true
hostNetwork: true
containers:
- name: node-exporter
image: prom/node-exporter:v0.16.0
ports:
- containerPort: 9100
resources:
requests:
cpu: 0.15
securityContext:
privileged: true
args:
- --path.procfs
- /host/proc
- --path.sysfs
- /host/sys
- --collector.filesystem.ignored-mount-points
- '"^/(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
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
volumes:
- name: proc
hostPath:
path: /proc
- name: dev
hostPath:
path: /dev
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
在上述配置中,我们配置了Pod的安全策略,主要内容如下:
hostPID: true
hostIPC: true
hostNetwork: true
hostPID和hostIPC主要用于主机的PID namespace和IPC namespace,这是namespace用于容器隔离的关键技术,与Kubernetes中的namespace并不是一个概念。至于hostNetwork可以直接将该Pod所属的Node的9100端口映射出来,而不需要通过创建Service的方式使该端口暴露。
另外,Node节点的基本信息是通过查询/proc、/dev、/sys等目录,因此我们需要把这些目录挂载到Node-Exporter中去,其配置如下:
volumeMounts:
- name: dev
mountPath: /host/dev
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: rootfs
mountPath: /rootfs
此外,为了监控Kubernetes集群中的master节点,我们还必须配置如下内容:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
配置完成后的资源清单文件(部分)如下所示:
之后,我们创建该配置文件对应的资源,执行命令:
kubectl apply -f prometheus-node-exporter.yaml
该命令执行结果如下:
该命令执行完成后,我们需要慢慢等待Node-exporter的镜像拉取,待镜像拉取成功后,Pod资源会成功创建,结果如下所示:
这时,我们可以访问任意一个节点的9100/metics路径,结果如下所示:
从上图可以看出,我们访问每个节点的Node-exporter可以得到节点的运行状态信息,这说明我们的Node-exporter安装配置成功!
在完成Node-exporter的配置后,接下来我们就可以进行Prometheus的configmap配置了。Prometheus的ConfigMap监控项配置如下:
- job_name: 'kubernetes-node'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
在上述配置中,我们采用了kubernetes_sd_configs自动发现,并且通过role参数指定了自动发现的对象是node节点。上述配置从第四行到最后的内容,其作用是进行了端口替换。Prometheus在监控时,可以通过API获取到我们的Node节点信息,但是由于我们的metrics默认监听的端口是10250而不是9100,因此如果没有进行上述端口替换的配置,我们的Prometheus的Node监控就一直处于DOWN的状态。在上述relabel的配置中,我们通过Target示例的Metadata信息,动态重新写入Label的值,并且将__address__标签从10250替换成9100,这样我们的Prometheus就可以正常监控了。
配置完成后的Prometheus的ConfigMap配置文件(注意:已经删除了其他的监控配置)如下所示:
在完成Prometheus的ConfigMap配置后,我们重新部署Prometheus的ConfigMap文件和Deploy部署文件,相关操作如下所示:
最后,在完成上述所有配置后,我们来查看一下Prometheus监控的结果。
我们打开浏览器,访问Prometheus的监控,结果如下所示:
从结果可以看出,我们的Prometheus能够正常监控Node节点的信息。
(注:如果没有出现上述显示,即没有Prometheus的Node节点监控,可以参考以下文章予以解决:使用Prometheus的Node-exporter监控Kubernetes的Node节点失败问题解决)
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200