2023年9月30日土曜日

Kubernetes Metrics Server導入手順 (kubectl topコマンドを使えるようにする)

Kubernetes環境のCPUやメモリリソースの使用率をKubernetes API経由で確認するための機能として、「Kubernetes Metrics Server」がある。

Kubernetes Metrics Serverは、標準ではインストールされておらず使用できない。そのため、kubectl topコマンドでリソース情報を取得しようとしても、以下の通り"Metrics API not available"のエラーで失敗する。

# kubectl top node
error: Metrics API not available

# kubectl top pod -A
error: Metrics API not available

Kubernetes Metrics Serverは、マニフェストファイルをApplyすることで簡単に導入することができる。本記事では、Kubernetes Metrics Serverの導入手順を記載する。導入することでkubectl topコマンドを利用できるようにする。

環境

環境は以下の通り。

  • ホストOS : AlmaLinux 8.6
  • Kubernetes: v1.27.3
  • Kubernetes Metrics Server: v0.6.3 (2023/7/16導入)

Kubernetes Metrics Server導入手順

1. インストール用マニフェストファイルのダウンロード

Kubernetes Metrics Serverはマニフェストファイルを用いることでインストールできる。公式手順は直接kubectl apply [URL]コマンドを実行しているが、今回は次の手順で一部マニフェストファイルを編集をするため、先にcurlコマンドでダウンロードを行う。

#curl -LO https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# ls -l
-rw-r--r-- 1 root root 4186  7月 16 17:20 components.yaml

2. マニフェストファイルを編集

Kubernetes Metrics ServerへはHTTPSによる通信にて接続を行うが、その際にSSL証明書の検証が動作し、検証に失敗すると正常にリソース情報を取得することができない。

そこで、--kubelet-insecure-tlsのオプションを追加し、証明書の検証を行わないよう設定する。

components.yaml

~(中略)~

  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls    # <-★追加

~(以下略)~

3. マニフェストファイルをapply

修正したマニフェストファイルをapplyする。

# 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

4. Pod及びサービスリソースの起動確認

10秒ほど経過してから確認すると、Podとサービスリソースが正常に展開されているはずだ。

# kubectl get pod -n=kube-system
NAME                                READY   STATUS    RESTARTS      AGE
~(中略)~
metrics-server-7db4fb59f9-skc7s     1/1     Running   0             144m

# kubectl get service -n=kube-system
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
kube-dns         ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   53d
metrics-server   ClusterIP   10.107.188.51   <none>        443/TCP                  3h2m

もし、PodのREADYが0/1などになっている場合は正常にコンテナが起動していない可能性があるため、Podのログを確認して原因調査が必要となる。例えば、--kubelet-insecure-tlsオプションを付与しておらず証明書の検証に失敗した場合は、以下のような"statuscode: 500"のエラーが表示される。

# kubectl describe pod metrics-server-7b4c4d4bfd-tbctq -n=kube-system
Name:                 metrics-server-7b4c4d4bfd-tbctq
Namespace:            kube-system

~(中略)~

Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  5m48s                 default-scheduler  Successfully assigned kube-system/metrics-server-7b4c4d4bfd-tbctq to t3052kube
  Normal   Pulled     5m48s                 kubelet            Container image "registry.k8s.io/metrics-server/metrics-server:v0.6.3" already present on machine
  Normal   Created    5m48s                 kubelet            Created container metrics-server
  Normal   Started    5m48s                 kubelet            Started container metrics-server
  Warning  Unhealthy  38s (x33 over 5m28s)  kubelet            Readiness probe failed: HTTP probe failed with statuscode: 500
  ↑★"statuscode: 500"のエラー

5. kubectl topコマンドで動作確認

kubectl topコマンドでノードとPodのリソース取得ができることの確認をしてみよう。

ノードの場合

# kubectl top node
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
t3051kube   121m         3%     2459Mi          67%
t3052kube   90m          2%     1076Mi          29%
t3053kube   105m         2%     2470Mi          68%

Podの場合

[root@t3051kube metrics-server]# kubectl top pod -A
NAMESPACE      NAME                                 CPU(cores)   MEMORY(bytes)
~(中略)~
mynamespace    almalinux-postfix-7b4577c6bc-fq578   1m           36Mi
mynamespace    almalinux-postfix-7b4577c6bc-hds6v   1m           43Mi
mynamespace    almalinux-postfix-7b4577c6bc-mtrnp   1m           42Mi
mynamespace    almalinux-squid-d66588dbb-g6tn6      1m           200Mi
mynamespace    almalinux-squid-d66588dbb-m5fff      1m           279Mi
mynamespace    almalinux-squid-d66588dbb-t9lg6      1m           266Mi
mynamespace    almalinux-unbound-66c9746bff-92htn   0m           42Mi
mynamespace    almalinux-unbound-66c9746bff-f5gmk   0m           37Mi
mynamespace    almalinux-unbound-66c9746bff-rnw8m   0m           40Mi

以上で、Kubernetes Metrics Serverの導入手順は終了となる。

0 件のコメント:

コメントを投稿