Quantcast
Channel: kakakakakku blog
Viewing all articles
Browse latest Browse all 920

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

$
0
0

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

$ kube-capacity --pods--namespace-labelsname=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:4selector: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-labelsname=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-labelsname=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-labelsapp=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


Viewing all articles
Browse latest Browse all 920