一、操作场景
metrics-server 可实现 Kubernetes 的 Resource Metrics API(metrics.k8s.io),通过此 API 可以查询 Pod 与 Node 的部分监控指标,Pod 的监控指标用于 HPA、VPA 与** kubectl top pods** 命令,而 Node 指标目前只用于 kubectl top nodes 命令。容器服务 某些k8s发行版 自带 Resource Metrics API 的实现,指向 hpa-metrics-server,且目前提供 Pod 的监控指标。
将 metrics-server 安装到集群后,可以通过 **kubectl top nodes **获取节点的监控概览,以替换 Resource Metrics API 的实现。容器服务控制台创建的 HPA 不会用到 Resource Metrics,仅使用 Custom Metrics,因此安装 metrics-server 不会影响在 Kubernetes 控制台创建的 HPA。本文将介绍如何在 Kubernetes 上安装 metrics-server。
二、操作步骤
2.1 下载 yaml 部署文件
执行以下命令,下载 metrics-server 官方的部署 yaml:
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Metrics Server | Metrics API group/version | Supported Kubernetes version |
---|---|---|
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 |
2.2 修改 metrics-server 启动参数
metrics-server 会请求每台节点的 kubelet 接口来获取监控数据,接口通过 HTTPS 暴露,但 Kubernetes 节点的 kubelet 使用的是自签证书,若 metrics-server 直接请求 kubelet 接口,将产生证书校验失败的错误,因此需要在 components.yaml 文件中加上 --kubelet-insecure-tls 启动参数。
且由于 metrics-server 官方镜像仓库存储在 k8s.gcr.io ,国内可能无法直接拉取,您可以自行同步到 CCR 或使用已同步的镜像 ccr.ccs.tencentyun.com/mirrors/metrics-server:v0.5.0。
components.yaml 文件修改示例如下:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls # 加上该启动参数
image: k8s.gcr.io/metrics-server/metrics-server:v0.6.1
2.3 部署 metrics-server
修改 components.yaml 之后,执行以下命令,通过 kubectl 一键部署到集群:1.
# kubectl apply -f components.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
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
2.4 检查运行状态
1. 执行以下命令,检查 metrics-server 是否正常启动。示例如下:
#kubectl get pod -n kube-system |grep metrics-server
metrics-server-f79cf56fc-tjxp4 1/1 Running 0 18m
2. 执行以下命令,检查配置文件。示例如下:
#kubectl get --raw /apis/metrics.k8s.io/v1beta1 | jq
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "metrics.k8s.io/v1beta1",
"resources": [
{
"name": "nodes",
"singularName": "",
"namespaced": false,
"kind": "NodeMetrics",
"verbs": [
"get",
"list"
]
},
{
"name": "pods",
"singularName": "",
"namespaced": true,
"kind": "PodMetrics",
"verbs": [
"get",
"list"
]
}
]
}
3. 执行以下命令,检查节点占用性能情况。示例如下:
[root@k8s-master][17:04:49][OK] ~/metric-server
#kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 35d v1.24.0
k8s-node-1 Ready <none> 35d v1.24.0
k8s-node-2 Ready <none> 35d v1.24.0
[root@k8s-master][17:06:05][OK] ~/metric-server
#kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 188m 9% 1947Mi 68%
k8s-node-1 114m 5% 1254Mi 66%
k8s-node-2 138m 6% 1277Mi 67%
[root@k8s-master][17:06:08][OK] ~/metric-server
#kubectl top pod -n monitoring
NAME CPU(cores) MEMORY(bytes)
alertmanager-kube-prometheus-stack-alertmanager-0 2m 31Mi
kube-prometheus-stack-grafana-595f8cff67-sncxs 1m 184Mi
kube-prometheus-stack-kube-state-metrics-5b9c9559fb-8fddz 2m 23Mi
kube-prometheus-stack-operator-79b6c68df8-fd78d 1m 34Mi
kube-prometheus-stack-prometheus-node-exporter-clv5k 1m 16Mi
kube-prometheus-stack-prometheus-node-exporter-ljl5d 2m 19Mi
kube-prometheus-stack-prometheus-node-exporter-nvsk5 1m 17Mi
prometheus-kube-prometheus-stack-prometheus-0 58m 353Mi