K8S安装metrics-server
使用kubeadm安装完成的集群,运行kubectl top node
等命令式,报错:error: Metrics API not available
。这是因为缺少metrics-server。
[root@k8s-master1 ~]# kubectl top node
error: Metrics API not available
简介
于 Kubernetes,Metrics API 提供了一组基本的指标,以支持自动伸缩和类似的用例。 该 API 提供有关节点和 Pod 的资源使用情况的信息, 包括 CPU 和内存的指标。如果将 Metrics API 部署到集群中, 那么 Kubernetes API 的客户端就可以查询这些信息,并且可以使用 Kubernetes 的访问控制机制来管理权限。
HorizontalPodAutoscaler (HPA) 和 VerticalPodAutoscaler (VPA) 使用 metrics API 中的数据调整工作负载副本和资源,以满足客户需求。
你也可以通过 kubectl top 命令来查看资源指标。
说明:
Metrics API 及其启用的指标管道仅提供最少的 CPU 和内存指标,以启用使用 HPA 和/或 VPA 的自动扩展。 如果你想提供更完整的指标集,你可以通过部署使用 CustomMetrics API 的第二个指标管道来作为简单的 Metrics API 的补充。
资源指标管道架构
-
cAdvisor: 用于收集、聚合和公开 Kubelet 中包含的容器指标的守护程序。
-
kubelet: 用于管理容器资源的节点代理。 可以使用 /metrics/resource 和 /stats kubelet API 端点访问资源指标。
-
节点层面资源指标: kubelet 提供的 API,用于发现和检索可通过 /metrics/resource 端点获得的每个节点的汇总统计信息。
-
metrics-server: 集群插件组件,用于收集和聚合从每个 kubelet 中提取的资源指标。 API 服务器提供 Metrics API 以供 HPA、VPA 和 kubectl top 命令使用。Metrics Server 是 Metrics API 的参考实现。
-
Metrics API: Kubernetes API 支持访问用于工作负载自动缩放的 CPU 和内存。 要在你的集群中进行这项工作,你需要一个提供 Metrics API 的 API 扩展服务器。
Metrics API
metrics-server 实现了 Metrics API。此 API 允许你访问集群中节点和 Pod 的 CPU 和内存使用情况。 它的主要作用是将资源使用指标提供给 K8s 自动缩放器组件。
下面是一个 minikube 节点的 Metrics API 请求示例,通过 jq 管道处理以便于阅读:
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/minikube" | jq '.'
这是使用 curl 来执行的相同 API 调用:
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/nodes/minikube
下面是一个 kube-system 命名空间中的 kube-scheduler-minikube Pod 的 Metrics API 请求示例, 通过 jq 管道处理以便于阅读:
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube" | jq '.'
这是使用 curl 来完成的相同 API 调用:
curl http://localhost:8080/apis/metrics.k8s.io/v1beta1/namespaces/kube-system/pods/kube-scheduler-minikube
Metrics API 在 k8s.io/metrics 代码库中定义。
兼容性矩阵
Metrics Server | Metrics API group/version | Supported Kubernetes version |
---|---|---|
0.7.x | metrics.k8s.io/v1beta1 | 1.19+ |
0.6.x | metrics.k8s.io/v1beta1 | 1.19+ |
0.5.x | metrics.k8s.io/v1beta1 | 1.8+ |
0.4.x | metrics.k8s.io/v1beta1 | 1.8+ |
0.3.x | metrics.k8s.io/v1beta1 | 1.8-1.21 |
备注:
低于 v1.16 的Kubernetes 需要增加
--authorization-always-allow-paths=/livez,/readyz
命令行参数。
部署metrics-server
metrics-server支持YAML和helm chart两种类型的安装。支持单副本和高可用两种安装方式。
单副本安装:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
高可用安装:高可用安装要求至少有两个node节点用于调度。
Kubernetes v1.21+:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
Kubernetes v1.19-1.21:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml
本文使用的k8s版本为1.27.6,使用YAML进行安装,选用0.7.0版本,安装高可用方案:
[root@k8s-master1 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 3d20h v1.27.6
k8s-node1 Ready <none> 3d20h v1.27.6
k8s-node2 Ready <none> 3d20h v1.27.6
# 下载yaml文件
[root@k8s-master1 ~]# mkdir metrics-server
[root@k8s-master1 ~]# cd metrics-server/
[root@k8s-master1 metrics-server]# wget curl https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.1/high-availability-1.21+.yaml
# 修改yaml文件, args增加参数`- --kubelet-insecure-tls`, 同时镜像指向阿里云仓库
[root@k8s-master1 metrics-server]# vi high-availability-1.21+.yaml
containers:
- args:
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
# 部署metric-server
[root@k8s-master1 metrics-server]# kubectl apply -f high-availability-1.21+.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
poddisruptionbudget.policy/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
# 查看部署的容器
[root@k8s-master1 metrics-server]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7bdc4cb885-bqtks 1/1 Running 2 (3d20h ago) 3d20h
coredns-7bdc4cb885-mzldj 1/1 Running 2 (3d20h ago) 3d20h
etcd-k8s-master1 1/1 Running 3 (3d20h ago) 3d20h
kube-apiserver-k8s-master1 1/1 Running 2 (3d20h ago) 3d20h
kube-controller-manager-k8s-master1 1/1 Running 2 (3d20h ago) 3d20h
kube-proxy-89x7n 1/1 Running 2 (3d20h ago) 3d20h
kube-proxy-mcjr2 1/1 Running 2 (3d20h ago) 3d20h
kube-proxy-msv6d 1/1 Running 2 (3d20h ago) 3d20h
kube-scheduler-k8s-master1 1/1 Running 2 (3d20h ago) 3d20h
metrics-server-7b7569c7d6-mgt2d 1/1 Running 0 82s
metrics-server-7b7569c7d6-zv57w 1/1 Running 0 82s
# 验证获取资源信息
[root@k8s-master1 metrics-server]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master1 120m 3% 2670Mi 34%
k8s-node1 676m 16% 9295Mi 120%
k8s-node2 655m 16% 9280Mi 120%
helm chart安装可参考:https://artifacthub.io/packages/helm/metrics-server/metrics-server
参考资料
官网文档:https://kubernetes.io/zh-cn/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/
hub.io/packages/helm/metrics-server/metrics-server>
参考资料
官网文档:https://kubernetes.io/zh-cn/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/
官网github:https://github.com/kubernetes-sigs/metrics-server#installation