1. 程式人生 > 其它 >Kubernetes雲原生監控之kube-state-metrics叢集資源監控

Kubernetes雲原生監控之kube-state-metrics叢集資源監控

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-metricspod 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