Metrics Server 是 Kubernetes 内置自动缩放管道的可扩展、高效的容器资源指标来源。 从 kubelet 公开的 Summary API 中采集指标信息, 以供 HPA 和 VPA 使用。我们可以通过kubectl top命令查看资源信息。
HPA: HorizontalPodAutoscaler 根据观察到的 CPU 利用率, 自动调整控制器POD的个数
VPA: VerticalPodAutoscaler 可以增加或减少容器的 CPU 和内存资源的请求,更好把集群资源分配到实际应用
Metrics是监控系统的核心,所有监控指标数据都记录其中,为我们后面的监控系统做准备(grafnan+prometheus)
架构组件:
- cAdvisor: 用于收集、聚合和公开 Kubelet 中包含的容器指标的守护程序。
- kubelet: 用于管理容器资源的节点代理。 可以使用
/metrics/resource
和/stats
kubelet API 端点访问资源指标。 - Summary API: kubelet 提供的 API,用于发现和检索可通过
/stats
端点获得的每个节点的汇总统计信息。 - metrics-server: 集群插件组件,用于收集和聚合从每个 kubelet 中提取的资源指标。 API 服务器提供 Metrics API 以供 HPA、VPA 和
kubectl top
命令使用。Metrics Server 是 Metrics API 的参考实现。 - Metrics API: Kubernetes API 支持访问用于工作负载自动缩放的 CPU 和内存。 要在你的集群中进行这项工作,你需要一个提供 Metrics API 的 API 扩展服务器。
安装
1.我们可以直接使用 metrics-server 官方提供的资源清单件直接安装,可以看到pod已经正常运行。
[root@ycloud ~]# kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
[root@ycloud ~]# kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-675db8b7cc-mw7f6 1/1 Running 0 49m
metrics-server-6bf679fb9b-2qch4 1/1 Running 0 41m
metrics-server-6bf679fb9b-znckj 1/1 Running 0 41m
2.我们也可以选择使用Helm来安装,首先我们添加Metrics server repo到Helm
[root@ycloud ~]# helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
[root@ycloud ~]# helm install metrics-server metrics-server/metrics-server
也可以选择将Chart包pull到集群中,查看模板信息,了解应用本身,Chart包中镜像可替换成阿里镜像
3.尝试使用kubectl top命令查看资源信息
[root@master ~]# kubectl top nodes
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
[root@ycloud ~]# kubectl get apiservice
NAME SERVICE AVAILABLE AGE
v1beta1.metrics.k8s.io kube-system/metrics-server False (FailedDiscoveryCheck) 41m
这时候发现服务出现异常不可用,
问题查找
通过metrics-server查看相关日志
E0927 09:36:59.662728 1 configmap_cafile_content.go:243] kube-system/extension-apiserver-authentication failed with : missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
E0927 09:37:48.890413 1 configmap_cafile_content.go:243] key failed with : missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
E0927 09:38:48.889595 1 configmap_cafile_content.go:243] key failed with : missing content for CA bundle "client-ca::kube-system::extension-apiserver-authentication::requestheader-client-ca-file"
根据错误日志信息,可以确定是缺少认证证书,导致不能访问
kube-apiserver
而出现的问题。
问题解决
查看APIserver参数配置,发现APIserver没有开启**API
**聚合功能,确保APIserver启动参数包含一下配置:
- 如果你是
kubeadm
或者官方的 kube-up.sh 脚本部署 Kubernetes 集群的话,API
聚合模式就是默认开启的; - 如果是手动
二进制
搭建的话,你就需要在 kube-apiserver 的启动参数里加上如下所示的配置
API聚合能够将用户扩展的
API
注册到 kube-apiserver 上,通过 APIserver 对新的 API 进行访问和操作。为了实现这个机制,Kubernetes 在 kube-apiserver 服务中引入了一个 API 聚合层,用于将扩展 API 的访问请求转发到用户服务的功能。
...
--requestheader-allowed-names=aggregator \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \
--proxy-client-cert-file=/etc/kubernetes/proxy-client/proxy-client.pem \
--proxy-client-key-file=/etc/kubernetes/proxy-client/proxy-client-key.pem \
--enable-aggregator-routing=true
...
如果您未在 master 节点上运行 kube-proxy,则必须确保 kube-apiserver 启动参数中包含
--enable-aggregator-routing=true
- –requestheader-client-ca-file: 客户端 CA 证书。
- –requestheader-allowed-names: 允许访问的客户端 common names 列表,通过 header 中 –requestheader-username-headers 参数指定的字段获取。客户端 common names 的名称需要在 client-ca-file 中进行设置,将其设置为空值时,表示任意客户端都可访问。
- –requestheader-username-headers: 参数指定的字段获取。
- –requestheader-extra-headers-prefix: 请求头中需要检查的前缀名。
- –requestheader-group-headers 请求头中需要检查的组名。
- –requestheader-username-headers 请求头中需要检查的用户名。
- –proxy-client-cert-file: 在请求期间验证 Aggregator 的客户端 CA 证书。
- –proxy-client-key-file: 在请求期间验证 Aggregator 的客户端私钥。
- –requestheader-allowed-names: 允许访问的客户端 common names 列表,通过 header 中 –requestheader-username-headers 参数指定的字段获取。客户端 common names 的名称需要在 client-ca-file 中进行设置,将其设置为空值时,表示任意客户端都可访问。
通过cfssl创建 kubernetes
证书
创建proxy-client-csr.json文件
{
"CN": "kubernetes",
"hosts": [
"10.189.6.101",
"10.189.6.102",
"10.189.6.103"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "SuZhou",
"L": "SuZhou",
"O": "k8s",
"OU": "System"
}
]
}
生成证书和密钥
[root@ycloud ssl]# cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-profile=kubernetes proxy-client-csr.json | cfssljson -bare kubernetes
[root@ycloud proxy-client]# ll
total 16
-rw-r--r-- 1 root root 1062 Jul 7 17:48 proxy-client.csr
-rw-r--r-- 1 root root 350 Jul 7 16:58 proxy-client-csr.json
-rw-r--r-- 1 root root 1680 Jul 7 17:49 proxy-client-key.pem
-rw-r--r-- 1 root root 1428 Jul 7 17:48 proxy-client.pem
将证书放到proxy-client目录下,
修改APIserver参数配置,并重启服务
[root@ycloud ~]# vi /etc/kubernetes/kube-apiserver.conf
...
--requestheader-allowed-names=aggregator \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem \
--proxy-client-cert-file=/etc/kubernetes/proxy-client/proxy-client.pem \
--proxy-client-key-file=/etc/kubernetes/proxy-client/proxy-client-key.pem \
--enable-aggregator-routing=true
...
[root@ycloud ~]# systemctl restart kube-apiserver
所有master
节点都要进行修改操作。
验证
1.kubectl top命令查看资源信息
[root@ycloud proxy-client]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
10-189-1-101 3619m 5% 9332Mi 3%
10-189-1-102 1008m 1% 2839Mi 0%
10-189-1-103 901m 1% 3728Mi 1%
2.Metrics API访问集群节点
[root@ycloud ~]# kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/ycloud" | python -m json.tool
{
"apiVersion": "metrics.k8s.io/v1beta1",
"kind": "NodeMetrics",
"metadata": {
"creationTimestamp": "2022-09-28T02:37:08Z",
"labels": {
"beta.kubernetes.io/arch": "amd64",
"beta.kubernetes.io/os": "linux",
"edgenode": "true",
"k8s.kuboard.cn/role": "etcd",
"kubernetes.io/arch": "amd64",
"kubernetes.io/hostname": "ycloud",
"kubernetes.io/os": "linux",
"node-role.kubernetes.io/control-plane": "",
"node-role.kubernetes.io/master": ""
},
"name": "ycloud"
},
"timestamp": "2022-09-28T02:37:08Z",
"usage": {
"cpu": "2430m",
"memory": "37488252Ki"
},
"window": "1m0s"
}
可以看到节点的 CPU 和内存使用情况
python -m json.tool
是python的json解析工具,方便我们阅读
在安装的过程中或多或少可能会有一些问题,最好的办法就是一步一步的去排错,出现了错误不要着急,最重要的就是分析错误日志信息,很多错误日志提示其实已经非常明显了。
参考文献
http://www.mydlq.club/article/102/
https://www.cnblogs.com/dgp-zjz/p/14646167.html
https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/
https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/