快捷菜单
常用功能一站直达
更多功能请点顶栏「快捷菜单」

😎实验环境
1k8s:v1.22.2(1 master,2 node)
2containerd: v1.5.5
3prometneus: docker.io/prom/prometheus:v2.34.0😎实验软件
链接:https://pan.baidu.com/s/1JkltHSHqRHSVMHvoMuf3VA?pwd=on8e
提取码:on8e
2022.5.2-prometheus监控k8s集群里的容器和apiserver-code

关于如何将prometheus应用部署到k8s环境里,请查看我的另一篇文章,获取完整的部署方法!。
《实战-prometheus部署到k8s-2022.4.29(测试成功)》https://onedayxyy.cn/topic/fhkgp

基础知识
apiserver 作为 Kubernetes 最核心的组件,当然他的监控也是非常有必要的。
对于 apiserver 的监控我们可以直接通过 kubernetes 的 Service 来获取:
1➜ kubectl get svc
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 33d上面这个 Service 就是我们集群的 apiserver 在集群内部的 Service 地址,要自动发现 Service 类型的服务,我们就需要用到 role 为 Endpoints 的 kubernetes_sd_configs。

[root@master1 ~]#cd prometheus-example/
[root@master1 prometheus-example]#vim prometheus-cm.yaml
1- job_name: 'kubernetes-apiservers'
2 kubernetes_sd_configs:
3 - role: endpoints本yaml完整代码如下:
1# prometheus-cm.yaml
2apiVersion: v1
3kind: ConfigMap
4metadata:
5 name: prometheus-config
6 namespace: monitor
7data:
8 prometheus.yml: |
9 global:
10 scrape_interval: 15s
11 scrape_timeout: 15s
12
13 scrape_configs:
14 - job_name: 'prometheus'
15 static_configs:
16 - targets: ['localhost:9090']
17
18 - job_name: 'coredns'
19 static_configs:
20 - targets: ['10.244.0.8:9153', '10.244.0.10:9153']
21
22 - job_name: 'redis'
23 static_configs:
24 - targets: ['redis:9121']
25
26 - job_name: 'nodes'
27 kubernetes_sd_configs:
28 - role: node
29 relabel_configs:
30 - source_labels: [__address__]
31 regex: '(.*):10250'
32 replacement: '${1}:9100'
33 target_label: __address__
34 action: replace
35 - action: labelmap
36 regex: __meta_kubernetes_node_label_(.+)
37
38 - job_name: 'kubelet'
39 kubernetes_sd_configs:
40 - role: node
41 scheme: https
42 tls_config:
43 ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
44 insecure_skip_verify: true
45 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
46 relabel_configs:
47 - action: labelmap
48 regex: __meta_kubernetes_node_label_(.+)
49
50
51 - job_name: 'kubernetes-cadvisor'
52 kubernetes_sd_configs:
53 - role: node
54 # metrics_path: /metrics/cadvisor
55 scheme: https
56 tls_config:
57 ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
58 insecure_skip_verify: true
59 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
60 relabel_configs:
61 - action: labelmap
62 regex: __meta_kubernetes_node_label_(.+)
63 - source_labels: [__meta_kubernetes_node_name]
64 regex: (.+)
65 replacement: /metrics/cadvisor # <nodeip>/metrics -> <nodeip>/metrics/cadvisor
66 target_label: __metrics_path__
67
68 - job_name: 'kubernetes-apiservers'
69 kubernetes_sd_configs:
70 - role: endpoints上面这个任务是定义的一个类型为 endpoints 的 kubernetes_sd_configs ,添加到 Prometheus 的 ConfigMap 的配置文件中.
1[root@master1 prometheus-example]#kubectl apply -f prometheus-cm.yaml
2configmap/prometheus-config configured
3
4#kubectl exec prometheus-648d9cc6b4-5mwjz -nmonitor -- cat /etc/prometheus/prometheus.yml
5
6# 隔一会儿执行reload操作
7[root@master1 prometheus-example]# curl -X POST "http://172.29.9.51:32700/-/reload"
我们可以看到 kubernetes-apiservers 下面出现了很多实例,这是因为这里我们使用的是 Endpoints 类型的服务发现,所以 Prometheus 把所有的 Endpoints 服务都抓取过来了。同样的,上面我们需要的服务名为 kubernetes 这个 apiserver 的服务也在这个列表之中,那么我们应该怎样来过滤出这个服务来呢?
keep动作还记得前面的 relabel_configs 吗?没错,同样我们需要使用这个配置,只是我们这里不是使用 replace 这个动作了,而是 keep,就是只把符合我们要求的给保留下来,哪些才是符合我们要求的呢?
我们可以把鼠标放置在任意一个 target 上,可以查看到 Before relabeling里面所有的元数据,比如我们要过滤的服务是 default 这个 namespace 下面,服务名为 kubernetes 的元数据,所以这里我们就可以根据对应的 __meta_kubernetes_namespace 和 __meta_kubernetes_service_name 这两个元数据来 relabel。另外由于 kubernetes 这个服务对应的端口是 443,需要使用 https 协议,所以这里我们需要使用 https 的协议,对应的就需要将 ca 证书配置上,如下所示:

[root@master1 prometheus-example]#pwd
/root/prometheus-example
[root@master1 prometheus-example]#vim prometheus-cm.yaml
1- job_name: 'kubernetes-apiservers'
2 kubernetes_sd_configs:
3 - role: endpoints
4 scheme: https
5 tls_config:
6 ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
7 insecure_skip_verify: true
8 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
9 relabel_configs:
10 - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
11 action: keep
12 regex: default;kubernetes;https完整yaml如下:
1# prometheus-cm.yaml
2apiVersion: v1
3kind: ConfigMap
4metadata:
5 name: prometheus-config
6 namespace: monitor
7data:
8 prometheus.yml: |
9 global:
10 scrape_interval: 15s
11 scrape_timeout: 15s
12
13 scrape_configs:
14 - job_name: 'prometheus'
15 static_configs:
16 - targets: ['localhost:9090']
17
18 - job_name: 'coredns'
19 static_configs:
20 - targets: ['10.244.0.8:9153', '10.244.0.10:9153']
21
22 - job_name: 'redis'
23 static_configs:
24 - targets: ['redis:9121']
25
26 - job_name: 'nodes'
27 kubernetes_sd_configs:
28 - role: node
29 relabel_configs:
30 - source_labels: [__address__]
31 regex: '(.*):10250'
32 replacement: '${1}:9100'
33 target_label: __address__
34 action: replace
35 - action: labelmap
36 regex: __meta_kubernetes_node_label_(.+)
37
38 - job_name: 'kubelet'
39 kubernetes_sd_configs:
40 - role: node
41 scheme: https
42 tls_config:
43 ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
44 insecure_skip_verify: true
45 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
46 relabel_configs:
47 - action: labelmap
48 regex: __meta_kubernetes_node_label_(.+)
49
50
51 - job_name: 'kubernetes-cadvisor'
52 kubernetes_sd_configs:
53 - role: node
54 # metrics_path: /metrics/cadvisor
55 scheme: https
56 tls_config:
57 ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
58 insecure_skip_verify: true
59 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
60 relabel_configs:
61 - action: labelmap
62 regex: __meta_kubernetes_node_label_(.+)
63 - source_labels: [__meta_kubernetes_node_name]
64 regex: (.+)
65 replacement: /metrics/cadvisor # <nodeip>/metrics -> <nodeip>/metrics/cadvisor
66 target_label: __metrics_path__
67
68 - job_name: 'kubernetes-apiservers'
69 kubernetes_sd_configs:
70 - role: endpoints
71 scheme: https
72 tls_config:
73 ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
74 insecure_skip_verify: true
75 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
76 relabel_configs:
77 - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
78 action: keep
79 regex: default;kubernetes;https1[root@master1 prometheus-example]#kubectl apply -f prometheus-cm.yaml
2configmap/prometheus-config configured
3
4[root@master1 prometheus-example]# curl -X POST "http://172.29.9.51:32700/-/reload"
现在可以看到 kubernetes-apiserver 这个任务下面只有 apiserver 这一个实例了,证明我们的 relabel 是成功的,现在我们切换到 Graph 路径下面查看下采集到的数据,比如查询 apiserver 的总的请求数:

这样我们就完成了对 Kubernetes APIServer 的监控。
注意:
另外如果我们要来监控其他系统组件,比如 kube-controller-manager、kube-scheduler 的话应该怎么做呢?由于 apiserver 服务 namespace 在 default 使用默认的 Service kubernetes,而其余组件服务在 kube-system 这个 namespace 下面,如果我们想要来监控这些组件的话,需要手动创建单独的 Service,其中 kube-sheduler 的指标数据端口为 10251,kube-controller-manager 对应的端口为 10252,大家可以尝试下自己来配置下这几个系统组件。
结束。
日历 · 精选 · 友链 · 更多
如果内容对你有帮助,欢迎请我喝杯咖啡 ☕



One的公众号
爱折腾博客的小白