监控 APIServer
APIServer 作为 Kubernetes 最核心的组件,当然他的监控也是非常有必要的,对于 APIServer 的监控我们可以直接通过 Kubernetes 的 Service 来获取:
☸ ➜ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 33d
上面这个 Service 就是我们集群的 apiserver 在集群内部的 Service 地址,要自动发现 Service 类型的服务,我们就需要用到 role 为 Endpoints 的 kubernetes_sd_configs
,我们可以在 ConfigMap 对象中添加上一个 Endpoints 类型的服务的监控任务:
- job_name: "apiservers"
kubernetes_sd_configs:
- role: endpoints
上面这个任务是定义的一个类型为 endpoints 的 kubernetes_sd_configs
,添加到 Prometheus 的 ConfigMap 的配置文件中,然后更新配置:
☸ ➜ kubectl apply -f https://p8s.io/docs/k8s/manifests/prometheus/config-8.yaml
# 隔一会儿执行reload操作
☸ ➜ curl -X POST "http://10.244.2.46:9090/-/reload"
更新完成后,我们再去查看 Prometheus 的 Dashboard 的 target 页面:(因为没有办法保证所有的endpoints都有我们对应的metrics接口的,所以出现下面down的状态)
我们可以看到 apiservers
任务下面出现了很多实例,这是因为这里我们使用的是 Endpoints 类型的服务发现,所以 Prometheus 把所有的 Endpoints 服务都抓取过来了,同样的,上面我们需要的服务名为 kubernetes
这个 apiserver 的服务也在这个列表之中,那么我们应该怎样来过滤出这个服务来呢?
同样还是需要使用relabel_configs
这个配置,只是我们这里不是使用 replace
这个动作了,而是 keep
,就是只把符合我们要求的给保留下来,哪些才是符合我们要求的呢?
我们要过滤的服务是 default
这个 namespace 下面,服务名为 kubernetes
的元数据,所以这里我们就可以根据对应的 __meta_kubernetes_namespace
和 __meta_kubernetes_service_name
这两个元数据来进行过滤,另外由于 kubernetes 这个服务对应的端口是 443,需要使用 https 协议,所以这里我们需要使用 https 的协议,对应的就需要将 ca 证书配置上,如下所示:
- job_name: "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
现在重新更新配置文件、重新加载 Prometheus,切换到 Prometheus 的 Targets 路径下查看:
现在可以看到 apiserver
这个任务下面只有 apiserver 这一个实例了,现在我们切换到 Graph 路径下面查看下采集到的数据,比如查询 apiserver 的总的请求数:
这样我们就完成了对 Kubernetes APIServer 的监控。
集群外部prometheus监控apiserver 这个token自己解决,很简单
[root@k8s-uat-m01 ~]# kubectl exec -it prometheus-k8s-0 -n kubesphere-monitoring-system sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/prometheus # cat /var/run/secrets/kubernetes.io/serviceaccount/token
eyJhbGciOiJSUzI1NiIsImtpZCI6Ijh0dERyYXVnRHJ4ZS1YYzBwNlpRbGg5NFVnZ3Z1QWwzWWRWZndka29laWsifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQ3MjE0MTIyLCJpYXQiOjE3MTU2NzgxMjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlc3BoZXJlLW1vbml0b3Jpbmctc3lzdGVtIiwicG9kIjp7Im5hbWUiOiJwcm9tZXRoZXVzLWs4cy0wIiwidWlkIjoiZTY1MTFkNTItODViMy00MGVhLWI1MGYtMGY5Nzk1ZTMzNWFiIn0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJwcm9tZXRoZXVzLWs4cyIsInVpZCI6ImYwZjdiOTkxLTAwYzItNDhjNC05OGFiLWE1Mzk4NGRmMThlMiJ9LCJ3YXJuYWZ0ZXIiOjE3MTU2ODE3Mjl9LCJuYmYiOjE3MTU2NzgxMjIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlc3BoZXJlLW1vbml0b3Jpbmctc3lzdGVtOnByb21ldGhldXMtazhzIn0.TuvVbdbQ3s7kXlGwTGpzxIA7M46EW66r-yQIoV7-DdjLe10CjNyI4Wn28sHdaK0QTaagpcgzQXkb6j1ITZPawvo3hGtPq_ZlKrs1lCYdolMjEdzQJ0ayxwUFaSrJAQP5NI_HPv0k8iqQDUYhmrnmy6zF7gyQUXiFMaXBTetT5BfNreir550Z2j5Vb2qZFWrfM4PVdXV9KADfk0m5kwU5ER2uXbXPo-gABU6CCWVaGOVYZI8wMK25L3H-3V4KQYf0NNXf53AhyojH-B0S7acQ-xXvHHC5tDcBBd1PIsLyWfxdShxfDQBqHImenSAyvHauJWbXY0HSH6jyh-Wyxv2oKA
insecure_skip_verify: true 来跳过 tls 验证 未知机构签署的证书即客户端访问服务端时证书不受信赖
- job_name: "k8s-apiserver"
honor_timestamps: true
metrics_path: /metrics
scheme: https
kubernetes_sd_configs:
- api_server: https://k8s-uat-api.ztoky.cn:6443
role: endpoints
bearer_token_file: /apps/svr/prometheus/k8s_cert/token
tls_config:
insecure_skip_verify: true
bearer_token_file: /apps/svr/prometheus/k8s_cert/token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels:
[
__meta_kubernetes_namespace,
__meta_kubernetes_service_name,
__meta_kubernetes_endpoint_port_name,
]
action: keep
regex: default;kubernetes;https