Metrics Server 是 Kubernetes 内置自动缩放管道的可扩展、高效的容器资源指标来源。 从 kubelet 公开的 Summary API 中采集指标信息, 以供 HPA 和 VPA 使用。我们可以通过kubectl top命令查看资源信息。
HPA: HorizontalPodAutoscaler 根据观察到的 CPU 利用率, 自动调整控制器POD的个数
VPA: VerticalPodAutoscaler 可以增加或减少容器的 CPU 和内存资源的请求,更好把集群资源分配到实际应用
Metrics是监控系统的核心,所有监控指标数据都记录其中,为我们后面的监控系统做准备(grafnan+prometheus)
架构组件:
/metrics/resource
和 /stats
kubelet API 端点访问资源指标。/stats
端点获得的每个节点的汇总统计信息。kubectl top
命令使用。Metrics Server 是 Metrics 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
kubernetes
证书{
"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目录下,
[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
节点都要进行修改操作。
[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%
[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/