Kubernetes Cluster管理用のコマンドたち

Kubernetes Cluserを管理する上で、覚えておくと便利なコマンドをメモしておきます。

目次

参考資料たち

環境

リソースタイプの、短縮名や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 オプションを利用。任意に設定できるカラム名と取得したいパラメーター値を指定することで、テーブルぽく表示してくれます。下記が構文とサンプル。

-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

フィールドセレクター(Field Selectors)

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.

JSONPath Support

ソートして表示

--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