為什麼需要 Metrics Server#
前面幾章談的都是「怎麼設定」資源,但要真的把資源管好,還要能「觀察」每個服務當下的使用率與健康狀況。Kubernetes 本身有大量指標可以收集,大致可以分成兩類:
- 叢集層級:例如節點本身是否健康、Disk、CPU、記憶體使用情形。
- Pod 層級:例如部署副本數、liveness/readiness 探針結果等。
但是這些指標的「收集器」並沒有預設安裝在 Kubernetes 中,需要由額外的元件來補齊,最常見的選擇就是 Metrics Server。
Metrics Server 是什麼#
Docker Desktop 提供的 Kubernetes 並沒有預先附帶 Metrics Server;像是 GKE 等雲端平台則往往一上手就具備 Google 自家的指標服務。
Metrics Server 是叢集層級的指標聚合器(aggregator):
- 透過
kube-aggregator把/apis/metrics.k8s.io掛到 API Server 上。 - 後端從每個節點上的
kubelet抓取指標。 - 把收集到的資料保存在 Metrics Server 自己的記憶體中(重啟即遺失,不保存歷史)。
- 再以 API 的形式提供給其他元件使用。
安裝 Metrics Server#
下面 components.yaml 包含 ServiceAccount、兩個 ClusterRole、Deployment 與 APIService 等資源。為了減少篇幅,僅列出最關鍵的 Deployment 啟動參數(其餘 RBAC/Service 等定義建議直接參考官方 manifest ↗):
# Deployment 容器啟動參數摘要
spec:
template:
spec:
containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server/metrics-server:v0.4.2
args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --kubelet-insecure-tls # 本地關鍵:跳過 kubelet 憑證驗證
ports:
- { containerPort: 4443, name: https, protocol: TCP }直接照抄官方安裝檔常常會在本地環境中失敗。關鍵在於
--kubelet-insecure-tls這個參數,它會讓 Metrics Server 跳過對 kubelet 憑證的驗證,因為本地環境通常沒有自簽憑證。
部署:
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確認 Pod 狀態:
kubectl get pods -n kube-system | grep metrics-servermetrics-server-9f897d54b-l2rc4 1/1 Running 0 5m11s查看資源使用情形#
kubectl top 是 Metrics Server 安裝完後最直接能看到效果的指令,包含 node 與 pod 兩個子命令:
kubectl top nodeNAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
docker-desktop 215m 5% 5593Mi 71%kubectl top pods -n kube-systemNAME CPU(cores) MEMORY(bytes)
coredns-6d4b75cb6d-pp56z 6m 0Mi
etcd-docker-desktop 28m 0Mi
kube-apiserver-docker-desktop 59m 0Mi
metrics-server-9f897d54b-l2rc4 8m 0Mi小結#
Metrics Server 把「我現在用了多少資源」這件事變成可以查詢的 API,後續的自動擴縮容(Autoscaling)幾乎都會以它作為基本依賴。下一章開始,就會以這套指標為基礎,逐步認識 HPA、VPA 等自動擴縮機制。
原文出處#
- GitHub:https://github.com/MikeHsu0618/2022-ithelp/tree/main/Day24
- iThome:https://ithelp.ithome.com.tw/articles/10297449