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.gzmv kube-state-metrics-2.1.1/examples/standard kube-state-metricscd 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

kubectl get svc -n kube-system |grep kube-state-metrics

kube-state-metrics ClusterIP 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

 

查看原文