Kubernetes Cluster管理用のコマンドたち
Kubernetes Cluserを管理する上で、覚えておくと便利なコマンドをメモしておきます。
目次
- 目次
- 参考資料たち
- 環境
- リソースタイプの、短縮名やAPIバージョンを表示
- ラベルの表示
- 追加情報の表示
- 表形式ぽく表示
- 条件を指定して検索
- JSONPathの利用
- ソートして表示
- Eventを条件指定して表示
- コンテナのログを表示
- コンテナ上でコマンドを実行
- リビジョンの履歴を表示
- 利用するkubeconfigを指定
- kubeconfigで current-context のコンフィグ情報のみを表示
- ユーザーの権限有無を確認
- ノードのメンテナンスモード化
- ノードのunschedulable
- ネットワーク関連のトラブルシューティング
参考資料たち
- kubectlの概要
- 詳細なヘルプ情報を確認できます
- kubectl Cheat Sheet
- 公式チートシート
環境
- kubernetes
- v1.20.0
リソースタイプの、短縮名やAPIバージョンを表示
$ kubectl api-resources | head -n 5 NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 true Binding componentstatuses cs v1 false ComponentStatus configmaps cm v1 true ConfigMap endpoints ep v1 true Endpoints
ラベルの表示
--show-labels
オプションで、設定されているラベル情報も表示できます。
$ kubectl -n kube-system get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS coredns-74ff55c5b-lc2x6 1/1 Running 2 5h46m k8s-app=kube-dns,pod-template-hash=74ff55c5b etcd-minikube 1/1 Running 2 5h46m component=etcd,tier=control-plane kube-apiserver-minikube 1/1 Running 2 5h46m component=kube-apiserver,tier=control-plane kube-controller-manager-minikube 1/1 Running 2 5h46m component=kube-controller-manager,tier=control-plane kube-proxy-7w2s6 1/1 Running 2 5h46m controller-revision-hash=774bf47ffd,k8s-app=kube-proxy,pod-template-generation=1 kube-scheduler-minikube 1/1 Running 2 5h46m component=kube-scheduler,tier=control-plane storage-provisioner 1/1 Running 5 5h46m addonmanager.kubernetes.io/mode=Reconcile,integration-test=storage-provisioner
追加情報の表示
-o wide
オプションで、追加情報を表示できます。
$ kubectl -n kube-system get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-74ff55c5b-lc2x6 1/1 Running 2 5h42m 172.17.0.2 minikube <none> <none> etcd-minikube 1/1 Running 2 5h43m 192.168.99.100 minikube <none> <none> kube-apiserver-minikube 1/1 Running 2 5h43m 192.168.99.100 minikube <none> <none> kube-controller-manager-minikube 1/1 Running 2 5h43m 192.168.99.100 minikube <none> <none> kube-proxy-7w2s6 1/1 Running 2 5h42m 192.168.99.100 minikube <none> <none> kube-scheduler-minikube 1/1 Running 2 5h43m 192.168.99.100 minikube <none> <none> storage-provisioner 1/1 Running 5 5h43m 192.168.99.100 minikube <none> <none>
表形式ぽく表示
-o custom-columns
オプションを利用。任意に設定できるカラム名と取得したいパラメーター値を指定することで、テーブルぽく表示してくれます。下記が構文とサンプル。
$ kubectl -n kube-system get pod -o custom-columns=NAME:.metadata.name,IMAGE:.spec.containers[].image NAME IMAGE coredns-74ff55c5b-lc2x6 k8s.gcr.io/coredns:1.7.0 etcd-minikube k8s.gcr.io/etcd:3.4.13-0 kube-apiserver-minikube k8s.gcr.io/kube-apiserver:v1.20.0 kube-controller-manager-minikube k8s.gcr.io/kube-controller-manager:v1.20.0 kube-proxy-7w2s6 k8s.gcr.io/kube-proxy:v1.20.0 kube-scheduler-minikube k8s.gcr.io/kube-scheduler:v1.20.0 storage-provisioner gcr.io/k8s-minikube/storage-provisioner:v4
条件を指定して検索
--field-selector
オプションにて、パラメーターの情報を条件値にして表示してくれます。指定できるパラメーターには限りあるので注意。
$ kubectl get pod --field-selector status.phase=Running NAME READY STATUS RESTARTS AGE name1 1/1 Running 0 20m name2 1/1 Running 0 19m name3 1/1 Running 0 20m
JSONPathの利用
JSONPathによる指定を利用できます。
パラメータを指定して表示。
$ kubectl get pod -o=jsonpath="{.items[*].metadata.name}" name1 name2 name3
改行コードを挿入することもできます。
$ kubectl get pod -o=jsonpath="{.items[*].metadata.name}{'\n'}{.items[*].spec.containers[].image}" name1 name2 name3 nginx nginx nginx
条件を指定して表示。
$ kubectl get pod -o=jsonpath="{.items[?(@.metadata.name=='name1')].spec.containers[].image}" nginx
正規表現での指定はできないため、jqを使えとあります。
JSONPath regular expressions are not supported. If you want to match using regular expressions, you can use a tool such as jq.
ソートして表示
--sort-by
オプションにて、対象のパラメーターをJSONPath形式で指定することで、ソートして表示してくれます。
$ kubectl get pod --sort-by='{.metadata.creationTimestamp}' NAME READY STATUS RESTARTS AGE name3 1/1 Running 0 3m54s name1 1/1 Running 0 3m32s name2 1/1 Running 0 2m24s
Eventを条件指定して表示
--field-selector
と併用することで、条件指定して表示できます。
$ kubectl get events --all-namespaces --field-selector involvedObject.kind=Pod,involvedObject.name=sample NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE default 24m Normal Scheduled pod/sample Successfully assigned default/sample to kubeadm-worker default 24m Normal Pulling pod/sample Pulling image "nginx" default 24m Normal Pulled pod/sample Successfully pulled image "nginx" in 7.043920026s
コンテナのログを表示
pod内に複数コンテナがある場合、 -c
オプションでコンテナ名を指定してログを表示できます。
$ kubectl logs multi-pod -c second-container 1:C 12 Jan 2021 12:56:32.555 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1:C 12 Jan 2021 12:56:32.556 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1, just started 1:C 12 Jan 2021 12:56:32.556 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 1:M 12 Jan 2021 12:56:32.557 * Running mode=standalone, port=6379. 1:M 12 Jan 2021 12:56:32.557 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 1:M 12 Jan 2021 12:56:32.557 # Server initialized 1:M 12 Jan 2021 12:56:32.557 * Ready to accept connections
コンテナ上でコマンドを実行
docker exec -it
みたいなアレ。
$ kubectl exec -it pod-name -- hostname pod-name
利用するpodを一時的に作成して実行する場合。
$ kubectl run temp --image=busybox:1.28 --restart=Never --rm -it -- hostname temp pod "temp" deleted
リビジョンの履歴を表示
--record
オプションを利用してDeploymentのテンプレート領域が変更された時に、リビジョン履歴が作成されます。
$ kubectl apply -f sample.yaml --record deployment.apps/sample created $ $ kubectl set image deployment sample nginx=nginx:1.18 --record deployment.apps/sample image updated $ $ kubectl set image deployment sample nginx=nginx:1.19 --record deployment.apps/sample image updated $ $ kubectl rollout history deployment sample deployment.apps/sample REVISION CHANGE-CAUSE 1 kubectl apply --filename=sample.yaml --record=true 2 kubectl set image deployment sample nginx=nginx:1.18 --record=true 3 kubectl set image deployment sample nginx=nginx:1.19 --record=true
rollout history
コマンド実行時に、さらに --revision
オプションでリビジョンを指定することで、詳細を確認できます。
$ kubectl rollout history deployment sample --revision=2 deployment.apps/sample with revision #2 Pod Template: Labels: app=sample pod-template-hash=56ffc578d6 Annotations: kubernetes.io/change-cause: kubectl set image deployment sample nginx=nginx:1.18 --record=true Containers: nginx: Image: nginx:1.18 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none>
--to-revision
でリビジョンを指定することで、指定バージョンまでロールバックできます。
$ kubectl rollout undo deployment sample --to-revision=1 deployment.apps/sample rolled back $ $ kubectl rollout history deploy sample deployment.apps/sample REVISION CHANGE-CAUSE 2 kubectl set image deployment sample nginx=nginx:1.18 --record=true 3 kubectl set image deployment sample nginx=nginx:1.19 --record=true 4 kubectl apply --filename=sample.yaml --record=true
利用するkubeconfigを指定
--kubeconfig
で利用するコンフィグファイルを指定して実行。
$ kubectl cluster-info --kubeconfig=/path/to/kubeconfig
kubeconfigで current-context
のコンフィグ情報のみを表示
--minify
オプションを付与することで、current-context設定されているコンフィグ情報だけ表示してくれます。
$ kubectl config view --minify
ユーザーの権限有無を確認
指定ユーザーが、指定権限を有しているかどうか確認できます。
$ kubectl auth can-i list pod --as user-name --namespace default yes
ノードのメンテナンスモード化
ノードを、いわゆるメンテナンスモードにする。
$ kubectl drain node-name
処理内容。
You can use kubectl drain to safely evict all of your pods from a node before you perform maintenance on the node.
Use kubectl drain to remove a node from service
DaemonSetのオブジェクトがある場合、 --ignore-daemonsets
をつける。
$ kubectl drain node-name --ignore-daemonsets
ノードのunschedulable
指定ノードを、Podのevictはしないで、podのスケジュールだけ不可とする。
$ kubectl cordon node-name
cordon状態から戻す。drain状態から戻す時もこれ。
$ kubectl uncordon node-name
ネットワーク関連のトラブルシューティング
調査時に利用できるコンテナイメージを公開してくれています。
$ kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml pod/dnsutils created $ $ kubectl get pod NAME READY STATUS RESTARTS AGE dnsutils 1/1 Running 0 10s
Create a simple Pod to use as a test environment
$ kubectl exec dnsutils -it -- cat /etc/resolv.conf nameserver 10.96.0.10 search default.svc.cluster.local svc.cluster.local cluster.local asia-northeast1-a.c.modified-badge-123456.internal c.modified-badge-123456.internal google.internal options ndots:5
nslookupコマンド。
$ kubectl exec dnsutils -it -- nslookup kube-dns.kube-system Server: 10.96.0.10 Address: 10.96.0.10#53 Name: kube-dns.kube-system.svc.cluster.local Address: 10.96.0.10 $ $ kubectl exec dnsutils -it -- nslookup 10-146-0-2.kube-system.pod.cluster.local Server: 10.96.0.10 Address: 10.96.0.10#53 Name: 10-146-0-2.kube-system.pod.cluster.local Address: 10.146.0.2
ncコマンド。
$ kubectl exec dnsutils -it -- nc -z -v 10.96.0.10 53 10.96.0.10 (10.96.0.10:53) open
curlコマンドを実行する場合
$ kubectl run curl --image=curlimages/curl -it --rm -- sh / $ exit