Kubernetes では Pod にリソース値(要求 : Requests と 制限 : Limits)を設定できる.設定値は kubectl describe
コマンドを使って確認できるし,使用率は kubectl top
コマンドを使って確認できるけど,今回紹介する CLI「kube-capacity」を使うと,Pod のリソース値(設定値と使用率)をまとめてシンプルに表示できる.最近使っていて便利なのでメモも兼ねて紹介する.
検証環境
- Kubernetes v1.20.2
- kind を使う
- Metrics Server 導入済
インストール
「kube-capacity」は Homebrew と Krew を使ってインストールできる.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 レベルで表示すると,CoreDNS や kube-apiserver や kindnet の合計であると確認できる.
$ 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
オプションを使って Namespace を Label で指定する.今回は 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)を設定した Deployment を replicas: 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
オプションを使えば,Pod の Label で絞り込みできるし,--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 を指定できるため,今よりも便利になると思う.