Kubernetes Metrics Server 部署指南
环境准备
| 主机名称 | IP地址 | 操作系统 |
|---|---|---|
| k8s-master | 172.21.3.20 | CentOS7.8 |
| k8s-node1 | 172.21.3.21 | CentOS7.8 |
| k8s-node2 | 172.21.3.22 | CentOS7.8 |
获取 Metrics Server 配置文件
首先从官方仓库下载部署配置文件:
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
获取镜像文件
拉取所需的 Metrics Server 镜像:
docker pull zhaoqinchang/metrics-server:0.3.7
0.3.7: Pulling from zhaoqinchang/metrics-server
9ff2acc3204b: Pull complete
9d14b55ff9a0: Pull complete
Digest: sha256:c0efe772bb9e5c289db6cc4bc2002c268507d0226f2a3815f7213e00261c38e9
Status: Downloaded newer image for zhaoqinchang/metrics-server:0.3.7
docker.io/zhaoqinchang/metrics-server:0.3.7
修改部署配置文件
编辑 components.yaml 文件,更新镜像引用并添加必要的启动参数:
cat components.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:aggregated-metrics-reader
labels:
rbac.authorization.k8s.io/aggregate-to-view: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
resources: ["pods", "nodes"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: metrics-server-auth-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: metrics-server
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
labels:
k8s-app: metrics-server
spec:
selector:
matchLabels:
k8s-app: metrics-server
template:
metadata:
name: metrics-server
labels:
k8s-app: metrics-server
spec:
serviceAccountName: metrics-server
volumes:
- name: temp-storage
emptyDir: {}
containers:
- name: metrics-server-container
image: zhaoqinchang/metrics-server:0.3.7
imagePullPolicy: IfNotPresent
command:
- /metrics-server
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls
args:
- --cert-dir=/tmp
- --secure-port=4443
ports:
- name: secure-port
containerPort: 4443
protocol: TCP
securityContext:
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- name: temp-storage
mountPath: /tmp
nodeSelector:
kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
name: metrics-server
namespace: kube-system
labels:
kubernetes.io/name: "Metrics-server"
kubernetes.io/cluster-service: "true"
spec:
selector:
k8s-app: metrics-server
ports:
- port: 443
protocol: TCP
targetPort: secure-port
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- pods
- nodes
- nodes/stats
- namespaces
- configmaps
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
应用部署配置
执行以下命令部署 Metrics Server:
kubectl apply -f components.yaml
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
验证部署状态
检查 Metrics Server 在哪个节点上运行:
kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-66bff467f8-h7rjz 1/1 Running 21 72d 10.244.0.142 master
coredns-66bff467f8-jvqf8 1/1 Running 21 72d 10.244.0.144 master
etcd-master 1/1 Running 23 72d 172.16.2.200 master
kube-apiserver-master 1/1 Running 97 72d 172.16.2.200 master
kube-controller-manager-master 1/1 Running 23 72d 172.16.2.200 master
kube-flannel-ds-amd64-26qv9 1/1 Running 28 72d 172.16.2.200 master
kube-flannel-ds-amd64-fzxxc 1/1 Running 16 72d 172.16.2.101 node1
kube-flannel-ds-amd64-lgggd 1/1 Running 3 3d5h 172.16.2.202 node2
kube-proxy-255z5 1/1 Running 23 72d 172.16.2.200 master
kube-proxy-8mh7c 1/1 Running 17 72d 172.16.2.101 node1
kube-proxy-gsbn6 1/1 Running 16 72d 172.16.2.202 node2
kube-scheduler-master 1/1 Running 23 72d 172.16.2.200 master
metrics-server-7b8dbfc8bc-l8sxd 1/1 Running 0 16s 10.244.1.163 node1
检查服务详情
查看 Metrics Server Pod 的详细信息:
kubectl describe pods metrics-server-7b8dbfc8bc-4ck84 -n kube-system
Name: metrics-server-7b8dbfc8bc-4ck84
Namespace: kube-system
Priority: 0
Node: node1/172.16.2.101
Start Time: Sun, 27 Sep 2020 15:25:03 +0800
Labels: k8s-app=metrics-server
pod-template-hash=7b8dbfc8bc
Annotations:
Status: Running
IP: 10.244.1.165
IPs:
IP: 10.244.1.165
Controlled By: ReplicaSet/metrics-server-7b8dbfc8bc
Containers:
metrics-server-container:
Container ID: docker://7db90ed46c704a75fbf42c0e7ad7996a0968ab26e1b04ec56367324865fb3abd
Image: zhaoqinchang/metrics-server:0.3.7
Image ID: docker-pullable://zhaoqinchang/metrics-server@sha256:c0efe772bb9e5c289db6cc4bc2002c268507d0226f2a3815f7213e00261c38e9
Port: 4443/TCP
Host Port: 0/TCP
Command:
/metrics-server
--kubelet-preferred-address-types=InternalIP
--kubelet-insecure-tls
Args:
--cert-dir=/tmp
--secure-port=4443
State: Running
Started: Sun, 27 Sep 2020 15:25:04 +0800
Ready: True
Restart Count: 0
Environment:
Mounts:
/tmp from temp-storage (rw)
/var/run/secrets/kubernetes.io/serviceaccount from metrics-server-token-vszdg (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
temp-storage:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit:
metrics-server-token-vszdg:
Type: Secret (a volume populated by a Secret)
SecretName: metrics-server-token-vszdg
Optional: false
QoS Class: BestEffort
Node-Selectors: kubernetes.io/os=linux
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 31s default-scheduler Successfully assigned kube-system/metrics-server-7b8dbfc8bc-4ck84 to node1
Normal Pulled <unknown> kubelet, node1 Container image "zhaoqinchang/metrics-server:0.3.7" already present on machine
Normal Created <unknown> kubelet, node1 Created container metrics-server-container
Normal Started <unknown> kubelet, node1 Started container metrics-server-container
验证 API 注册
确认 metrics.k8s.io 出现在 API 版本列表中:
kubectl api-versions | grep metrics
metrics.k8s.io/v1beta1
测试监控功能
使用 kubectl top 命令查看节点资源使用情况:
kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 179m 8% 1660Mi 43%
node1 81m 4% 908Mi 23%
node2 78m 3% 1036Mi 26%
查看 Pod 资源使用
检查各个 Pod 的资源消耗情况:
kubectl top pod
NAME CPU(cores) MEMORY(bytes)
nginxdocker-59845fd65f-kgnmc 0m 3Mi
nginxdocker-59845fd65f-rnvzg 0m 3Mi
nginxdocker-59845fd65f-zgrlc 0m 4Mi
tomcat7-54fb6dbfdc-ch42r 2m 123Mi
tomcat7-54fb6dbfdc-cmljd 2m 123Mi
tomcat7-54fb6dbfdc-ln4hk 2m 125Mi
Dashboard 可视化集成
完成部署后,Dashboard 插件能够显示容器的资源使用图形数据。