跳到主要内容

实战-prometheus监控 apiserver-2022.5.2(测试成功)

最后更新于:

实战-prometheus监控 apiserver-2022.5.2(测试成功)

前置条件

😎实验环境

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

  • 具有k8s环境;
  • 已经把prometheus应用部署到k8s环境里;

关于如何将prometheus应用部署到k8s环境里,请查看我的另一篇文章,获取完整的部署方法!。

《实战-prometheus部署到k8s-2022.4.29(测试成功)》https://onedayxyy.cn/topic/fhkgp

基础知识

apiserver 作为 Kubernetes 最核心的组件,当然他的监控也是非常有必要的。

1、查看集群apiserver

对于 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

2、在 ConfigMap 对象中添加上一个 Endpoints 类型的服务的监控任务

  • 我们可以在 ConfigMap 对象中添加上一个 Endpoints 类型的服务的监控任务:

[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"
  • 更新完成后,我们再去查看 Prometheus 的 Dashboard 的 target 页面:

我们可以看到 kubernetes-apiservers 下面出现了很多实例,这是因为这里我们使用的是 Endpoints 类型的服务发现,所以 Prometheus 把所有的 Endpoints 服务都抓取过来了。同样的,上面我们需要的服务名为 kubernetes 这个 apiserver 的服务也在这个列表之中,那么我们应该怎样来过滤出这个服务来呢?

3、使用relabel_configs里的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;https

4、验证

  • 现在重新更新配置文件、重新加载 Prometheus,切换到 Prometheus 的 Targets 路径下查看:
1[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,大家可以尝试下自己来配置下这几个系统组件。

结束。

最新文章

文档导航