kakakakakku blog

Weekly Tech Blog: Keep on Learning!

kube-capacity コマンドを使って Pod のリソース値をノード別にシンプルに表示する

Kubernetes では Pod にリソース値(要求 : Requests と 制限 : Limits)を設定できる.設定値は kubectl describe コマンドを使って確認できるし,使用率は kubectl top コマンドを使って確認できるけど,今回紹介する CLI「kube-capacity」を使うと,Pod のリソース値(設定値と使用率)をまとめてシンプルに表示できる.最近使っていて便利なのでメモも兼ねて紹介する.

github.com

検証環境

インストール

「kube-capacity」HomebrewKrew を使ってインストールできる.Homebrew だと kube-capacity コマンドとなり,Krew だと kubectl resource-capacity コマンドとなる.どちらも試したけど,今回は新しいバージョン (0.5.0) が使える Homebrew を使う.

$ brew tap robscott/tap
$ brew install robscott/tap/kube-capacity

$ kube-capacity version
kube-capacity version 0.5.0

$ kubectl krew install resource-capacity
Installed plugin: resource-capacity

$ kubectl resource-capacity version
kube-capacity version 0.4.0

1. kube-capacity コマンドを実行する

まず,kind で構築した検証用 Kubernetes クラスターで kube-capacity コマンドを実行すると,ノードごとに以下の値が表示される.* の行には全てのノードの合計値が表示される.

  • CPU REQUESTS : CPU 要求 (Requests) 合計値 と 割合
  • CPU LIMITS : CPU 制限 (Limits) 合計値 と 割合
  • MEMORY REQUESTS : Memory 要求 (Requests) 合計値 と 割合
  • MEMORY LIMITS : Memory 制限 (Limits) 合計値 と 割合
$ kube-capacity
NODE                 CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                    1150m (9%)     300m (2%)    390Mi (6%)        490Mi (8%)
kind-control-plane   950m (23%)     100m (2%)    290Mi (14%)       390Mi (19%)
kind-worker          100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker2         100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)

最初は表示されている 950m (23%)100m (2%) という値の裏付けが取れずに悩んだけど,デフォルトでは kube-system Namespace の値も含めて全ての Pod が対象になっている.そこで kube-capacity コマンドの --pods オプションを使って Pod レベルで表示すると,CoreDNSkube-apiserverkindnet の合計であると確認できる.

$ kube-capacity --pods
NODE                 NAMESPACE            POD                                          CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                    *                    *                                            1150m (9%)     300m (2%)    390Mi (6%)        490Mi (8%)

kind-control-plane   *                    *                                            950m (23%)     100m (2%)    290Mi (14%)       390Mi (19%)
kind-control-plane   kube-system          coredns-74ff55c5b-5v6b8                      100m (2%)      0 (0%)       70Mi (3%)         170Mi (8%)
kind-control-plane   kube-system          coredns-74ff55c5b-xp5m7                      100m (2%)      0 (0%)       70Mi (3%)         170Mi (8%)
kind-control-plane   kube-system          etcd-kind-control-plane                      100m (2%)      0 (0%)       100Mi (5%)        0 (0%)
kind-control-plane   kube-system          kindnet-lbslz                                100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-control-plane   kube-system          kube-apiserver-kind-control-plane            250m (6%)      0 (0%)       0 (0%)            0 (0%)
kind-control-plane   kube-system          kube-controller-manager-kind-control-plane   200m (5%)      0 (0%)       0 (0%)            0 (0%)
kind-control-plane   kube-system          kube-proxy-25ltm                             0 (0%)         0 (0%)       0 (0%)            0 (0%)
kind-control-plane   kube-system          kube-scheduler-kind-control-plane            100m (2%)      0 (0%)       0 (0%)            0 (0%)
kind-control-plane   local-path-storage   local-path-provisioner-78776bfc44-cxcpk      0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker          *                    *                                            100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker          kube-system          kindnet-7t5kc                                100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker          kube-system          kube-proxy-kbzl8                             0 (0%)         0 (0%)       0 (0%)            0 (0%)
kind-worker          kube-system          metrics-server-8bbfb4bdb-qrrls               0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker2         *                    *                                            100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker2         kube-system          kindnet-ptmng                                100m (2%)      100m (2%)    50Mi (2%)         50Mi (2%)
kind-worker2         kube-system          kube-proxy-vws54                             0 (0%)         0 (0%)       0 (0%)            0 (0%)

2. Namespace を指定して kube-capacity コマンドを実行する

kube-system Namespace を無視して,特定の Namespace を指定することもできる.kube-capacity コマンドの --namespace-labels オプションを使って NamespaceLabel で指定する.今回は name=sandbox という適当な Label を付けた sandbox Namespace を作った.初期状態だとまだ何もリソースを適用していないため,全て 0 (0%) になっている.

$ kube-capacity --pods --namespace-labels name=sandbox
NODE                 NAMESPACE   POD   CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                    *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-control-plane   *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker          *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

kind-worker2         *           *     0 (0%)         0 (0%)       0 (0%)            0 (0%)

3. Deployment を適用して値を確認する

検証用に以下のようなリソース値(要求 : Requests と 制限 : Limits)を設定した Deploymentreplicas: 4 で作る.

  • requests
    • cpu : 200m
    • memory : 100Mi
  • limits
    • cpu : 1000m
    • memory : 500Mi
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sandbox-kube-capacity-nginx
  namespace: sandbox
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19-alpine
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 500Mi
        ports:
        - containerPort: 80

Deployment を適用してから,もう1度 kube-capacity コマンドを実行すると,設定したリソース値の合計になっていた.便利!

$ kube-capacity --pods --namespace-labels name=sandbox
NODE                 NAMESPACE   POD                                            CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*                    *           *                                              400m (3%)      2 (16%)       400Mi (6%)        2000Mi (33%)

kind-control-plane   *           *                                              0 (0%)         0 (0%)        0 (0%)            0 (0%)

kind-worker          *           *                                              100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker          sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-8csj7   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)

kind-worker2         *           *                                              300m (7%)      1500m (37%)   300Mi (15%)       1500Mi (75%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-5mxnx   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-6gwts   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-bbnsj   100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)

4. 追加で使用率も表示する

さらに kube-capacity コマンドの --util オプションを使うと「使用率」を表示できるようになる.

  • CPU UTIL : CPU 使用率
  • MEMORY UTIL : Memory 使用率
$ kube-capacity --pods --namespace-labels name=sandbox --util
NODE                 NAMESPACE   POD                                            CPU REQUESTS   CPU LIMITS    CPU UTIL          MEMORY REQUESTS   MEMORY LIMITS   MEMORY UTIL
*                    *           *                                              400m (3%)      2 (16%)       517975675n (4%)   400Mi (6%)        2000Mi (33%)    854872Ki (13%)

kind-control-plane   *           *                                              0 (0%)         0 (0%)        396547620n (9%)   0 (0%)            0 (0%)          558568Ki (27%)

kind-worker          *           *                                              100m (2%)      500m (12%)    62508437n (1%)    100Mi (5%)        500Mi (25%)     158572Ki (7%)
kind-worker          sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-8csj7   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     3960Ki (0%)

kind-worker2         *           *                                              300m (7%)      1500m (37%)   58919618n (1%)    300Mi (15%)       1500Mi (75%)    137732Ki (6%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-5mxnx   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     3948Ki (0%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-6gwts   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     3980Ki (0%)
kind-worker2         sandbox     sandbox-kube-capacity-nginx-68fdb47b8d-bbnsj   100m (2%)      500m (12%)    0 (0%)            100Mi (5%)        500Mi (25%)     4124Ki (0%)

5. オプションは他にもある

今回は --namespace-labels オプションを使ったけど,オプションは他にもある.例えば --pod-labels オプションを使えば,PodLabel で絞り込みできるし,--node-labels オプションを使えば,ノードの Label で絞り込みできる.

$ kube-capacity --pod-labels app=nginx
NODE                 CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*                    400m (3%)      2 (16%)       400Mi (6%)        2000Mi (33%)
kind-control-plane   0 (0%)         0 (0%)        0 (0%)            0 (0%)
kind-worker          100m (2%)      500m (12%)    100Mi (5%)        500Mi (25%)
kind-worker2         300m (7%)      1500m (37%)   300Mi (15%)       1500Mi (75%)

$ kube-capacity --node-labels kubernetes.io/os=linux
NODE                 CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*                    1550m (12%)    2300m (19%)   790Mi (13%)       2490Mi (41%)
kind-control-plane   950m (23%)     100m (2%)     290Mi (14%)       390Mi (19%)
kind-worker          200m (5%)      600m (15%)    150Mi (7%)        550Mi (27%)
kind-worker2         400m (10%)     1600m (40%)   350Mi (17%)       1550Mi (77%)

まとめ

「kube-capacity」を使うと,Pod のリソース値をノード別にシンプルに表示できる.インストールしておくと便利!なお,今はまだリリースされていないけど,GitHub リポジトリの master ブランチを見ると,新しく --namespace オプションが追加されている.Label を使わずにシンプルに Namespace を指定できるため,今よりも便利になると思う.

github.com