循规蹈矩–从零开始建设k8s监控(一)

前言

监控k8s集群,目前主流就是使用prometheus以及其周围的生态,本文开始介绍怎么一步步完成k8s监控的建设

环境准备

组件 版本
操作系统 Ubuntu 22.04.4 LTS
minikube v1.30.1
docker 24.0.7
prometheus v2.54.1
kube-state-metrics v2.13.0
node-exporter v1.8.2

下载编排文件

本文所有的编排文件,都在这里

▶ cd /tmp && git clone git@github.com:wilsonchai8/installations.git && cd installations/prometheus 

使用minikube搭建k8s测试环境

1)下载 minikube

2)启动,minikube start

▶ minikube start 
▶ docker ps | grep minikube db877d660750   kicbase/stable:v0.0.39     "/usr/local/bin/entr…"   37 seconds ago   Up 33 seconds  127.0.0.1:32782->22/tcp, 127.0.0.1:32781->2376/tcp, 127.0.0.1:32780->5000/tcp, 127.0.0.1:32779->8443/tcp, 127.0.0.1:32778->32443/tcp   minikube 

3)检查k8s是否正常工作

▶ kubectl get node NAME       STATUS   ROLES           AGE     VERSION minikube   Ready    control-plane   4m41s   v1.26.3 

这里需要注意一下,由于现在镜像地址全部被墙了,大家可以尝试这个方法解决

安装prometheus

1)创建命名空间

▶ kubectl create ns prometheus namespace/prometheus created 

2)启动

▶ cd /tmp/installations/prometheus ▶ kubectl apply -f prometheus.yaml 

检查是否启动

▶ kubectl -n prometheus get pod -owide NAME                                 READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES prometheus-deploy-8495dfd557-xcwnp   1/1     Running   0          2m52s   10.244.0.3   minikube   <none>           <none>  

这里需要注意的是configmap的配置,由于是一步一步的演示,所以configmap的文件内容是一步一步的充实进去的,后面会慢慢修改

apiVersion: v1 kind: ConfigMap metadata:   name: prometheus-cm   labels:     name: prometheus-cm   namespace: prometheus data:   prometheus.yml: |-     global:       scrape_interval: 5s       evaluation_interval: 5s      alerting:       alertmanagers:         - static_configs:             - targets: ['alertmanager:9093']      rule_files:       - /etc/prometheus/*.rules      scrape_configs:       - job_name: 'prometheus'         static_configs:         - targets: ['localhost:9090'] 

3)访问页面服务

查看service配置,nodeport的端口是32648

▶ kubectl -n prometheus get svc NAME                 TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE prometheus-service   NodePort   10.99.231.160   <none>        9090:32648/TCP   12m ▶ kubectl get node -owide NAME       STATUS   ROLES           AGE    VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME minikube   Ready    control-plane   4d5h   v1.26.3   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   6.8.0-45-generic   docker://23.0.2 

访问 192.168.49.2:32648

循规蹈矩--从零开始建设k8s监控(一)

至此,prometheus已经安装完成了,监控的框架算是搭建起来了,但是没有监控指标,这并不是一个完整的监控系统,我们需要prometheus监控k8s的基础指标

安装k8s exporter

简单来说,exporter就是提供监控数据的组件,prometheus定期到exporter采集数据。而即将介绍的 kube-state-metrics ,就是专门用来提供k8s相关数据的exporter

而安装exporter也是非常简单的,exporter也是一个组件服务,只需要把它编排进k8s即可

▶ cd /tmp/installations/prometheus ▶ kubectl apply -f kube-state-metrics.yaml 

查看exporter是否启动

▶ kubectl -n kube-system get pod | grep kube-state-metrics kube-state-metrics-6cd66dbcd8-4mqh4   1/1     Running   0             63s 

exporter安装完成,需要告诉prometheus去采集新的exporter,修改prometheus configmap

apiVersion: v1 kind: ConfigMap metadata:   name: prometheus-cm   labels:     name: prometheus-cm   namespace: prometheus data:   prometheus.yml: |-     global:       scrape_interval: 5s       evaluation_interval: 5s      alerting:       alertmanagers:         - static_configs:             - targets: ['alertmanager:9093']      rule_files:       - /etc/prometheus/*.rules      scrape_configs:       - job_name: 'prometheus'         static_configs:         - targets: ['localhost:9090']  # 从这里是新加的       - job_name: "prometheus-kube-state-metrics"         static_configs:           - targets: ["kube-state-metrics.kube-system:8080"] 

修改了configmap之后,需要重启prometheus

▶ kubectl -n prometheus rollout restart deploy prometheus-deploy  

重新打开页面之后查看,有新的监控指标被采集上来了

循规蹈矩--从零开始建设k8s监控(一)

安装node exporter

需要注意的是,kube-state-metrics 并没有关注node相关的监控数据,这时候又有一个exporter需要上场了,那就是node-exporter

▶ cd /tmp/installations/prometheus ▶ kubectl apply -f node-exporter.yaml 

查看exporter是否启动成功

▶ kubectl -n prometheus get pod | grep node-exporter node-exporter-q8rmq                  1/1     Running   0          75s  

node-exporter的工作方式与kube-state-metrics不一样,kube-state-metrics是借助k8s的服务发现能力,可以知道k8s集群内部到底有多少pod、deploy、service等资源的状态

node-exporter也是部署在k8s内部,通过daemonset的方式,在每一个节点启动一个采集服务,然后暴露api等待prometheus来采集数据,但是node-exporter自身并没有服务发现能力,所以在节点扩容或者缩容的时候,prometheus并不知道当前有多少节点需要采集。虽然prometheus不知道,但是k8s确知道当前集群有多少节点,所以这里node-exporter也需要借用k8s得服务发现的能力来自动发现当前的节点数

修改prometheus configmap

apiVersion: v1 kind: ConfigMap metadata:   name: prometheus-cm   labels:     name: prometheus-cm   namespace: prometheus data:   prometheus.yml: |-     global:       scrape_interval: 5s       evaluation_interval: 5s      alerting:       alertmanagers:         - static_configs:             - targets: ['alertmanager:9093']      rule_files:       - /etc/prometheus/*.rules      scrape_configs:       - job_name: 'prometheus'         static_configs:         - targets: ['localhost:9090']        - job_name: "prometheus-kube-state-metrics"         static_configs:           - targets: ["kube-state-metrics.kube-system:8080"]  # 从这里是新加的       - job_name: 'kubernetes-nodes'         tls_config:           ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt         bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token         kubernetes_sd_configs:         - role: node         relabel_configs:         - source_labels: [__address__]           regex: '(.*):10250'           replacement: '${1}:9100'           target_label: __address__           action: replace         - action: labelmap           regex: __meta_kubernetes_node_label_(.+) 

修改了configmap之后,需要重启prometheus

▶ kubectl -n prometheus rollout restart deploy prometheus-deploy 

这里已经可以看到node相关的指标了

循规蹈矩--从零开始建设k8s监控(一)

切到Status --> Targets,可以看到通过k8s服务发现的节点

循规蹈矩--从零开始建设k8s监控(一)

为了验证服务发现,我们新加一个节点

▶ minikube node add 

检查新加节点

▶ kubectl get node NAME           STATUS   ROLES           AGE    VERSION minikube       Ready    control-plane   5d3h   v1.26.3 minikube-m02   Ready    <none>          70s    v1.26.3 

再去页面检查,已经自动发现了第二个节点

循规蹈矩--从零开始建设k8s监控(一)

至此,一个可以监控k8s各种资源的监控系统已经初步达成

注意事项

由于本文是演示一步一步安装prometheus以及相关组件,所以配置文件也是一步一步累加出来的,最终呈现在仓库的配置文件是最终版,可以直接将编排文件fully apply,从而跳过这些调试步骤

联系我

  • 联系我,做深入的交流

循规蹈矩--从零开始建设k8s监控(一)


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

发表评论

相关文章