01、概述
Kubernetes 雲原生集群監控主要涉及到如下三類指標:node 物理節點指標、pod & container 容器資源指標和Kubernetes 雲原生集群資源指標。針對這三類指標都有比較成熟的方案,見下圖

上節我們梳理了cAdvisor容器性能指標如何監控,這一節我們就來分析下雲原生集群資源監控。
Kubernetes集群在運行過程中,我們想了解服務運行狀態,這時就需要kube-state-metrics,它主要關注deployment、service 、 pod等集群資源對象的狀態。
Kube State Metrics 是一個簡單的服務,該服務通過監聽 Kubernetes API 服務器來生成不同資源的狀態的 Metrics 數據。
cAdvisor 已經被 Kubernetes 默認集成
Kube State Metrics 並沒有被默認集成,所以我們要想監控集群完整數據,就需要在 Kubernetes 中單獨部署 Kube State Metrics 組件,這樣才能夠將集群中的服務資源指標數據暴露出來,以便於對不同資源進行監控。
02、環境信息

03、kube-state-metrics部署
001、kube-state-metrics版本選擇
選擇與Kubernetes版本兼容的kube-state-metrics版本

002、kube-state-metrics下載
kubectl version Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.6", GitCommit:"8a62859e515889f07e3e3be6a1080413f17cf2c3", GitTreeState:"clean", BuildDate:"2021-04-15T03:28:42Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.6", GitCommit:"8a62859e515889f07e3e3be6a1080413f17cf2c3", GitTreeState:"clean", BuildDate:"2021-04-15T03:19:55Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"} k8s版本是v1.19.5,所以這里選擇kube-state-metrics版本v2.1.1。
打開下面這個鏈接選擇對應的版本
https://github.com/kubernetes/kube-state-metrics/tags
在k8s master 上執行下面的命令下載對應的版本
wget -c https://github.com/kubernetes/kube-state-metrics/archive/refs/tags/
tar xf v2.1.1.tar.gz
mv kube-state-metrics-2.1.1/examples/standard kube-state-metrics
cd kube-state-metrics
[root@k8s-master01 kube-state-metrics]# ll
total 20 -rw-rw-r-- 1 root root 376 2021/07/29 23:28:19 cluster-role-binding.yaml -rw-rw-r-- 1 root root 1623 2021/07/29 23:28:19 cluster-role.yaml -rw-rw-r-- 1 root root 1134 2021/07/29 23:28:19 deployment.yaml -rw-rw-r-- 1 root root 192 2021/07/29 23:28:19 service-account.yaml -rw-rw-r-- 1 root root 405 2021/07/29 23:28:19 service.yaml
由於 Kube State Metrics 組件需要通過與 kube-apiserver 連接,並調用相應的接口去獲取 kubernetes 集群數據,這個過程需要 Kube State Metrics 組件擁有一定的權限才能成功執行這些操作。在 Kubernetes 中默認使用 RBAC 方式管理權限。所以,我們需要創建相應的 RBAC 資源來提供該組件使用。
deployment.yaml文件注意如下暴露的兩個端口作用、標紅的是唯一修改的地方(因為國外的鏡像拉不到所以先把鏡像同步到了本地的uhub上面,然后從本地的uhub拉取)
cat deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/version: 2.1.1 name: kube-state-metrics namespace: kube-system spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: kube-state-metrics template: metadata: labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/version: 2.1.1 spec: imagePullSecrets: - name: myuhubkey.monitoring.syj containers: #- image: k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.1.1 - image: myuhub.cn/k8s_monitoring/kube-state-metrics:v2.1.1 livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 timeoutSeconds: 5 name: kube-state-metrics ports: - containerPort: 8080 ##用於公開kubernetes的指標數據的端口 name: http-metrics - containerPort: 8081 ##用於公開自身kube-state-metrics的指標數據的端口 name: telemetry readinessProbe: httpGet: path: / port: 8081 initialDelaySeconds: 5 timeoutSeconds: 5 securityContext: runAsUser: 65534 nodeSelector: kubernetes.io/os: linux serviceAccountName: kube-state-metrics
003、創建
kubectl apply -f ./ clusterrolebinding.rbac.authorization.k8s.io/kube-state-metrics created clusterrole.rbac.authorization.k8s.io/kube-state-metrics created deployment.apps/kube-state-metrics created serviceaccount/kube-state-metrics created service/kube-state-metrics created
004、查看是否運行成功
kubectl get pod -n kube-system -owide |grep kube-state-metrics kube-state-metrics-5f84848c58-v7v9z 1/1 Running 0 50m 10.100.166.135 node1 <none> <none>
kubectl get svc -n kube-system |grep kube-state-metrics kube-state-metrics ClusterIP None <none> 8080/TCP,8081/TCP 50m
# 驗證指標是否采集成功 請求kube-state-metrics的pod ip+8080端口
curl 10.100.166.135:8080/metrics
005、Prometheus 接入
kube-state-metrics創建的svc是ClusterIP類型,默認只能被集群內部訪問。
如果 prometheus部署在外部就需要配置認證。
cat prometheus.yml - job_name: "kube-state-metrics" scheme: http kubernetes_sd_configs: - api_server: https://k8sapi的ip:6443/ role: endpoints ## 指定kube-state-metrics組件所在的Namespace名稱 namespaces: names: ["kube-system"] ## names: ["monitoring"] bearer_token_file: /data/k8s_token #訪問k8s集群的認證文件 tls_config: insecure_skip_verify: true tls_config: insecure_skip_verify: true bearer_token_file: /data/k8s_token relabel_configs: ## 指定從 app.kubernetes.io/name 標簽等於 kube-state-metrics 的 service 服務獲取指標信息 - action: keep source_labels: [__meta_kubernetes_service_label_app_kubernetes_io_name] regex: kube-state-metrics ## 下面配置也是為了適配 Grafana Dashboard 模板(編號13105圖表) - action: labelmap regex: __meta_kubernetes_service_label_(.+) - action: replace source_labels: [__meta_kubernetes_namespace] target_label: kubernetes_namespace - action: replace source_labels: [__meta_kubernetes_service_name] target_label: kubernetes_service_name
