Metrics Server介绍
Kubernetes Metrics Server 是一个监控 metrics 采集组件,用于从集群中各 kubelet 中采集 metrics 数据,然后以扩展 APIServer 的形式对外暴露 Metrics API。
Metrics Server 作用包括但不限于下面这些:
部署安全的metrics-server
启用 Aggregation Layer
由于 Metrics Server 使用的是 Kubernetes 扩展 APIServer 模式,因此要部署 Metrics Server,首先要开启 kube-apiserver 的聚合层。
这里我们使用 kubeadm 来搭建集群,因此先定制 kubeadm [[kubeadm - ClusterConfiguration|ClusterConfiguration]],在 apiServer.extraArgs 字段中添加聚合层的配置项。
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
apiServer:
timeoutForControlPlane: 4m0s
extraArgs:
# Security
anonymous-auth: "true"
# Enable Aggregation Layer
requestheader-client-ca-file: /etc/kubernetes/pki/front-proxy-ca.crt
requestheader-allowed-names: front-proxy-client
requestheader-extra-headers-prefix: X-Remote-Extra-
requestheader-group-headers: X-Remote-Group
requestheader-username-headers: X-Remote-User
proxy-client-cert-file: /etc/kubernetes/pki/front-proxy-client.crt
proxy-client-key-file: /etc/kubernetes/pki/front-proxy-client.key
# Logging
event-ttl: "2h"
audit-log-format: legacy
audit-log-maxage: "7"
audit-log-maxbackup: "5"
audit-log-maxsize: "100"
audit-log-path: /var/log/kubernetes/apiserver-audit.log
audit-policy-file: /var/lib/kubernetes/audit-policy.yaml
extraVolumes:
- name: audit-log
hostPath: /var/log/kubernetes
mountPath: /var/log/kubernetes
pathType: DirectoryOrCreate
- name: audit-policy
hostPath: /var/lib/kubernetes
mountPath: /var/lib/kubernetes
pathType: DirectoryOrCreate
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kubernetesVersion: 1.29.2
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
配置 kubelet 使用集群 CA 签发的服务证书
默认情况下,kubelet 使用自签证书对外提供 HTTPS 服务(默认的10250端口),而由于 metrics-server 需要连接 kubelet 去获取 metrics 数据,自签证书使得无法通过 HTTPS 进行连接。
要使 metrics-server 可以从 kubelet 获取数据,一种方案是,在 metrics-server 启动参数中加上 --kubelet-insecure-tls
来跳过 TLS 验证,但这种方案不推荐用于生产环境。
另一种可行的方案,就是用集群 CA 来签发 kubelet 所需的服务端证书。
对于将要新建的集群,可以先定制 kubeadm KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
webhook:
enabled: true
cacheTTL: 0s
anonymous:
enabled: false
authorization:
mode: Webhook
serverTLSBootstrap: true
imageGCHighThresholdPercent: 80
imageGCLowThresholdPercent: 70
serializeImagePulls: false
cgroupDriver: systemd
对于运行中的集群,可以参考官方文档进行修改。
启用这个功能后,需要注意的是节点加入集群后,要手动前往集群里批复 CSR,之后 kubelet 的 10250 才能正常提供服务。
等 kubelet 服务运行正常,可以通过下面的命令验证其服务端证书。
[root@master ~]# openssl s_client -connect 127.0.0.1:10250 -showcerts
CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 O = system:nodes, CN = system:node:192.168.193.10
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 O = system:nodes, CN = system:node:192.168.193.10
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 O = system:nodes, CN = system:node:192.168.193.10
verify return:1
---
Certificate chain
0 s:O = system:nodes, CN = system:node:192.168.193.10
i:CN = kubernetes
可以看到证书的 Issuer 为 CN = kubernetes, 也就是集群的 CA。
部署metrics-server
前面的步骤准备完成后,部署就比较简单了,我们这里使用 helm 进行部署。
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server
这里不需要修改默认参数就可以正常使用。部署完成后,metrics-server 默认会使用 10250 作为 containerPort,443作为 servicePort。
问题记录
FailedDiscoveryCheck
- 先检查 metrics-server 自己的 pod 是否正常,pod 日志有没有报错;
- 检查 metrics-server 的 service 是否正常;
- 检查集群的 CNI 是否正常;