Prometheus详解(八)——Prometheus监控Kubernetes集群节点

今天继续给大家介绍Linux运维相关知识,本文主要内容是Prometheus监控Kubernetes集群节点。

一、Node-exporter部署

首先,我们先来部署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"

配置完成后的资源清单文件(部分)如下所示:
Prometheus详解(八)——Prometheus监控Kubernetes集群节点_第1张图片
之后,我们创建该配置文件对应的资源,执行命令:

kubectl apply -f prometheus-node-exporter.yaml

该命令执行结果如下:
在这里插入图片描述
该命令执行完成后,我们需要慢慢等待Node-exporter的镜像拉取,待镜像拉取成功后,Pod资源会成功创建,结果如下所示:
Prometheus详解(八)——Prometheus监控Kubernetes集群节点_第2张图片
这时,我们可以访问任意一个节点的9100/metics路径,结果如下所示:
Prometheus详解(八)——Prometheus监控Kubernetes集群节点_第3张图片
从上图可以看出,我们访问每个节点的Node-exporter可以得到节点的运行状态信息,这说明我们的Node-exporter安装配置成功!

二、Prometheus配置

在完成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详解(八)——Prometheus监控Kubernetes集群节点_第4张图片
在完成Prometheus的ConfigMap配置后,我们重新部署Prometheus的ConfigMap文件和Deploy部署文件,相关操作如下所示:
Prometheus详解(八)——Prometheus监控Kubernetes集群节点_第5张图片
Prometheus详解(八)——Prometheus监控Kubernetes集群节点_第6张图片

三、结果查看

最后,在完成上述所有配置后,我们来查看一下Prometheus监控的结果。
我们打开浏览器,访问Prometheus的监控,结果如下所示:
Prometheus详解(八)——Prometheus监控Kubernetes集群节点_第7张图片
从结果可以看出,我们的Prometheus能够正常监控Node节点的信息。
(注:如果没有出现上述显示,即没有Prometheus的Node节点监控,可以参考以下文章予以解决:使用Prometheus的Node-exporter监控Kubernetes的Node节点失败问题解决)
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200

你可能感兴趣的:(虚拟化运维,kubernetes,Prometheus,云原生,监控,Node-exporter)