prometheus.(2).添加监控插件以及配置

添加监控配置

作者声明:本博客内容是作者在学习以及搭建过程中积累的内容,内容采自网络中各位老师的优秀博客以及视频,并根据作者本人的理解加以修改(由于工作以及学习中东拼西凑,如果造成无法提供原链接,在此抱歉!!!)

作者再次声明:作者只是一个很抠脚的IT工作者,希望可以跟那些提供原创的老师们学习

一.node_exporter监控集群节点

通过prometheus来采集节点的监控指标,可以通过node_exporter获取,node_exporter就是抓取用于采集服务器节点的各种运行指标,目前node_exporter几乎支持所有常见的监控点,比如cpu、distats、loadavg、meminfo、netstat等,详细的监控列表可以参考github repo

这里使用DeamonSet控制器来部署该服务,这样每一个节点都会运行一个Pod,如果我们从集群中删除或添加节点后,也会进行自动扩展

1.node-exporter.yaml

# cat >>prometheus-node-exporter.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-system
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
      name: node-exporter
  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: /
#EOF

2.查看DaemonSet字段

kubectl explain DaemonSet
kubectl explain DaemonSet --recursive (列出所有字段)

3.启动

kubectl create -f prometheus-node-exporter.yaml
kubectl get pod -n kube-system -o wide|grep node

4.node-exporter.yaml文件说明

4.1 Pod的安全策略

由于我们要获取的数据是主机的监控指标数据,而我们的node-exporter是运行在容器中的,所以我们在Pod中需要配置一些Pod的安全策略

hostPID:true
hostIPC:true
hostNetwork:true
#这三个配置主要用于主机的PID namespace、IPC namespace以及主机网络,这里需要注意的是namespace是用于容器隔离的关键技术,这里的namespace和集群中的namespace是两个完全不同的概念

4.2 监控master节点

另外我们还需要将主机/dev、/proc、/sys这些目录挂在到容器中,这些因为我们采集的很多节点数据都是通过这些文件来获取系统信息

比如我们在执行top命令可以查看当前cpu使用情况,数据就来源于/proc/stat,使用free命令可以查看当前内存使用情况,其数据来源是/proc/meminfo文件

另外如果是使用kubeadm搭建的,同时需要监控master节点的,则需要添加下方的相应容忍

  - key: "node-role.kubernetes.io/master"
    operator: "Exists"
    effect: "NoSchedule

4.3 启动参数

node-exporter容器相关启动参数

    args:
    - --path.procfs     #配置挂载宿主机(node节点)的路径
    - /host/proc
    - --path.sysfs      #配置挂载宿主机(node节点)的路径
    - /host/sys
    - --collector.filesystem.ignored-mount-points
    - '"^/(sys|proc|dev|host|etc)($|/)"'

4.4 映射端口

在我们的yaml文件中加入了hostNetwork:true会直接将我们的宿主机的9100端口映射出来,从而不需要创建service 在我们的宿主机上就会有一个9100的端口

容器的9100--->映射到宿主机9100

  hostNetwork: true
  containers:
  - name: node-exporter
    image: prom/node-exporter:v0.16.0
    ports:
    - containerPort: 9100

二.添加监控

1.node监控

我们这里三个节点都运行了node-exporter程序,如果我们通过一个Server来将数据收集在一起,用静态的方式配置到prometheus就会显示一条数据,我们得自己在指标中过滤每个节点的数据,配置比较麻烦。 这里就采用服务发现

在Kubernetes下,Prometheus通过Kubernetes API基础,目前主要支持5种服务发现,分别是node、Server、Pod、Endpoints、Ingress

需要我们在Prometheus配置文件中,添加如下三行

    - job_name: 'kubernetes-node'
          kubernetes_sd_configs:
          - role: node
          #通过制定Kubernetes_sd_config的模式为node,prometheus就会自动从Kubernetes中发现所有的node节点并作为当前job监控的目标实例,发现的节点/metrics接口是默认的kubelet的HTTP接口

热更新:

kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.111.194.39:9090/-/reload

2.容器监控

cAdvisor是一个容器资源监控工具,包括容器的内存,CPU,网络IO,资源IO等资源,同时提供了一个Web页面用于查看容器的实时运行状态。

cAvisor已经内置在了kubelet组件之中,所以我们不需要单独去安装,cAdvisor的数据路径为/api/v1/nodes//proxy/metrics

action 使用labelkeep或者labeldrop则可以对Target标签进行过滤,仅保留符合过滤条件的标签

    - job_name: 'kubernetes-cadvisor'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

tls_config配置的证书地址是每个Pod连接apiserver所使用的地址,基本上写死了。并且我们在配置文件添加了一个labelmap标签。在最下面使用了一个正则替换了cAdvisor的一个metrics地址

  • 证书是我们Pod启动的时候kubelet给pod注入的一个证书,所有的pod启动的时候都会有一个ca证书注入进来
  • 如要想要访问apiserver的信息,还需要配置一个token_file
kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.111.194.39:9090/-/reload

3.Api-Service 监控

apiserver作为Kubernetes最核心的组件,它的监控也是非常有必要的,对于apiserver的监控,我们可以直接通过kubernetes的service来获取

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP             61d
nginx        NodePort    10.100.167.29   <none>        80:30002/TCP        44d
redis        ClusterIP   10.96.123.59    <none>        6379/TCP,9121/TCP   2d

上面的service是我们集群的apiserver内部的service的地址,要自动发现service类型的服务,需要使用role为Endpoints的kubernetes_sd_configs (自动发现),我们只需要在configmap里面在添加Endpoints类型的服务发现

   - job_name: 'kubernetes-apiserver'
     kubernetes_sd_configs:
     - role: endpoints

这里我们使用keep动作,将符合配置的保留下来,例如我们过滤default命名空间下服务名称为kubernetes的元数据,这里可以根据__meta_kubernetes_namespace和__mate_kubertnetes_service_name2个元数据进行relabel

 - job_name: 'kubernetes-apiservers'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https

参数解释:
action: keep #保留哪些标签
regex: default;kubernetes;https #匹配namespace下的default命名空间下的kubernetes service 最后https协议
可以通过kubectl describe svc kubernetes查看到

最后热更新

4.Service 监控

apiserver实际上是一种特殊的Service,现在配置一个专门发现普通类型的Service

这里我们对service进行过滤,只有在service配置了prometheus.io/scrape: "true"过滤出来

4.1 添加service监控

    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name

然后新更新

kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.111.194.39:9090/-/reload

Serivce自动发现参数说明 (并不是所有创建的service都可以被prometheus发现)

#1.参数解释
relabel_configs:
-source_labels:[__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep 
regex: true  保留标签
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_cheme]

这行配置代表我们只去筛选有__meta_kubernetes_service_annotation_prometheus_io_scrape的service,只有添加了这个声明才可以自动发现其他service

#2.参数解释
  - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
    action: replace
    target_label: __address__
    regex: ([^:]+)(?::\d+)?;(\d+)
    replacement: $1:$2
#指定一个抓取的端口,有的service可能有多个端口(比如之前的redis)。默认使用的是我们添加是使用kubernetes_service端口

#3.参数解释
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
    action: replace
    target_label: __scheme__
    regex: (https?)
#这里如果是https证书类型,我们还需要在添加证书和token

4.2 service添加prometheus标签

我们可以看到这里的服务的core DNS,为什么那么多service只有coreDNS可以被收集到呢?

  • core DNS serviceYaml 文件包含true参数,所以会被匹配到

5.kube-state-metrics

kube-state-metrics是一个简单的服务,它监听Kubernetes API服务器并生成相关指标数据,它不单关注单个Kubernetes组件的运行情况,而是关注内部各种对象的运行状况

在K8s集群上Pod、DaemonSet、Deployment、Job、CronJob等各种资源对象的状态也需要监控,这些指标主要来自于apiserver和kubelet中集成的cAvisor,但是并没有具体的各种资源对象的状态指标。对于Prometheus来说,当然是需要引入新的exporter来暴露这些指标,Kubernetes提供了一个kube-state-metrics

  • kube-state-metrics已经给出了在Kubernetes部署的文件,我们直接将代码Clone到集群中执行yaml文件即可

将kube-state-metrics部署在kubernetes上之后,会发现kubernetes集群中的prometheus会在kube-state-metrics这个job下自动发现kube-state-metrics,并开始拉去metrics,这是因为部署kube-state-metrics的manifest定义文件kube-state-metrics-server.yaml对Service的定义包含prometheus.io/scrape: 'true'这样的一个annotation。因此kube-state-metrics的endpoint可以被Prometheus自动发现

关于kube-state-metrics暴露所有监控指标可以参考kube-state-metrics的文档kube-state-metrics Documentation(https://github.com/kubernetes/kube-state-metrics/tree/master/docs)

故障

因为修改Prometheus.config配置错误造成的

1586425164971

posted @ 2020-01-08 14:23  薄荷少年郎微微凉  阅读(1147)  评论(0编辑  收藏  举报