為什麼需要 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-server
metrics-server-9f897d54b-l2rc4           1/1     Running   0   5m11s

查看資源使用情形#

kubectl top 是 Metrics Server 安裝完後最直接能看到效果的指令,包含 nodepod 兩個子命令:

kubectl top node
NAME             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
docker-desktop   215m         5%     5593Mi          71%
kubectl top pods -n kube-system
NAME                                     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