Kubernetes の業務でよく使うコマンド集
概要
Kubernetes (以降 K8s) のコマンド集です。
業務でよく使うコマンドを、目的別に記載しています。
-
期待する読者
- 目的からの逆引きで、コマンドを探したい方
- 実際の業務において、どんなコマンドを使うのか知りたい方
-
前提
- namespace の指定は省略します。
適宜オプションを追加して読み替えてください- 例:
-n test-ns
- 例:
- namespace の指定は省略します。
Pod の NAME を取得する
- 概要
- Pod の NAME は、コンテナに対する操作で幅広く使用します。
しかし、Pod を再起動すると変わってしまいます(英数字の羅列。固定できるのかは未調査) - なので、POD_NAME のような変数に格納しておくと、操作がスムーズになります
- Pod の NAME は、コンテナに対する操作で幅広く使用します。
- コマンド
POD_NAME=$(kubectl get pods -l app=<APP_NAME> --no-headers | grep Running | awk '{ print $1 }')
- オプション解説
<APP_NAME> ログインしたい Pod の metadata > labels > app の値 (例: nginx)
- コマンド例
- POD_NAME 変数に POD NAME の値を格納する
POD_NAME=$(kubectl get pods -l app=test-app --no-headers | grep Running | awk '{ print $1 }')
コンテナにログインする
- 概要
- 作成した Pod のコンテナにログインし、ログやプロセスの挙動を確認したい場合。
特に、自作コンテナのログの確認や、エラー時の調査に使えます - 作成した Pod のコンテナに対し、特定のコマンドを実行したい場合。
例えば、ls でファイルなどを確認したり、DB のクエリを実行するなど
- 作成した Pod のコンテナにログインし、ログやプロセスの挙動を確認したい場合。
- コマンド
kubectl exec [-it] <POD_NAME> --container <CONTAINER_NAME> -- <COMMAND>
- オプション解説
-i コンテナに標準入力(stdin)の結果を渡す ※bash などでログインして操作するときに必要(コマンドの実行だけなら不要) -t 標準入力に tty を使う ※bash などでのログイン時に、UNIX ライクなプロンプトにしたい場合に必要(詳細は未調査) <POD_NAME> ログインしたい Pod の NAME <CONTAINER_NAME> ログインしたいコンテナ名 <COMMAND> 実行したいコマンド(例: /bin/bash なら bash でのログイン)
- コマンド例
- コンテナに /bin/bash でログイン
kubectl exec -it ${POD_NAME} -c test-container -- /bin/bash
- PostgreSQL のバージョンを取得
kubectl exec ${POD_NAME} -c postgres -- psql --version
- InfluxDB の retention policy (データ保存期間)を取得
kubectl exec ${POD_NAME} -c influxdb -- influx -database dbname -execute "show retention policies"
- 注意点
- 対象 Pod の STATUS が Running になっていないとログインできません
- Pod のコンテナを指定してログインするため、
Pod 内に複数のコンテナを同居している場合、
操作対象のコンテナ名を正確に指定する必要があります
- 補足
- 私は、コンテナのテストデータ登録スクリプトの中で exec を使っています
コンテナと母艦の間でファイルを転送する
- 概要
- コンテナに母艦(コンテナを起動しているホスト。またはコンテナにアクセスするホスト)からファイルを転送したい場合
- コンテナのファイルを母艦に転送したい場合
- 自作コンテナのファイルを直接直して変更を検証したい時や、
DB に初期データを入れたい時に便利です
- コマンド
- 母艦のファイルをコンテナにコピー
kubectl cp --no-preserve=true <SRC_FILE> <POD_NAME>:<DEST_FILE> -c <CONTAINER_NAME>
- コンテナのファイルを母艦にコピー
kubectl cp --no-preserve=true <POD_NAME>:<SRC_FILE> -c <CONTAINER_NAME> <DEST_FILE>
- オプション解説
<POD_NAME> ログインしたい Pod の NAME <SRC_FILE> コピー元のファイルパス(相対パスでも可) <DEST_FILE> コピー先のファイルパス(相対パスでも可。コピー後のファイル名まで指定必須) <CONTAINER_NAME> コピー先のコンテナ名。未指定の場合はデフォルトのコンテナが採用される --no-preserve=true ローカルファイルのパーミッションやオーナーを保持しない。 (オプション無しの UNIX の cp コマンドと同様) ◆なお、デフォルトは false = 保持する なので、 ローカル側とコンテナ側のオーナー、パーミッションが一致していないと 誤動作の元になります。 コピー後に、chmod や chown で適宜変更することを推奨
- コマンド例
- 母艦のファイルをコンテナにコピー
kubectl cp /root/idb_bk_20231001.tgz ${POD_NAME}:/var/tmp/idb_bk.tgz -c php
- コンテナのファイルを、母艦のカレントディレクトリにコピー
kubectl cp ${POD_NAME}:/var/tmp/idb/idb_bk_20231001.tgz -c php ./idb_bk_20231001.tgz
オブジェクトを再作成する
- 概要
- オブジェクト(稼働中のリソース)に変更を加えたい場合、apply や create ではなく replace を使います
- 例えば、ConfigMap に値を追加した時、Pod のボリュームを追加した時など
- コマンド
kubectl replace -f <FILE_NAME>
- オプション解説
<FILE_NAME> 変更したリソースのマニフェストファイル
- コマンド例
- Pod の マニフェストファイルの変更を適用する
kubectl replace -f manifest/test-app.yml
- 注意点
- Pod を再作成すると、Pod の NAME も変わります
Pod を再起動する(Deployment を再起動する)
- 概要
- 用途としては、Pod に ConfigMap などの更新を反映したり、
単純にプロセス自体を再起動したい場合に使います(メモリ消費が重くなってきた場合など) - なお、コマンド操作する対象は Pod リソースではなく、Deployment リソースです
- 用途としては、Pod に ConfigMap などの更新を反映したり、
- コマンド
kubectl rollout restart deployments <DEPLOYMENT_NAME>
- オプション解説
<DEPLOYMENT_NAME> Deployments リソースの名前 ※Deployment リソースのマニフェストファイルの metadata > name の値
- コマンド例
kubectl rollout restart deployments test-app
- 実行直後は、古い POD が Terminating で残ります(そのうち消えます)
NAME READY STATUS RESTARTS AGE test-app-12345678-abcde 1/1 Terminating 0 2d test-app-abcdefgh-12345 1/1 Running 0 5s
Pod のログを見る
- 概要
- 主に、Pod の状態が Running にならない場合の調査に使います
- デフォルトだと、Pod 起動直後からのログが全部出てくるので、
オプションの--tail=表示件数
などで表示件数を調整しましょう
- コマンド
kubectl logs <POD_NAME> [--tail=<件数>]
- オプション解説
<POD_NAME> ログインしたい Pod の NAME --tail=<件数> ログの最終行から <件数> 件だけを表示する。デフォルトは -1(全件表示)
- コマンド例
- InfluxDB コンテナのログを、最新10件だけ表示する
kubectl logs influxdb-123abc456z-5656x --tail=10
リソース操作コマンドの検証がしたい(dry run)
-
概要
- K8s コマンドには dry run (実際にはリソースなどを作成せず、成否や実行結果だけを取得するもの)が存在します
- 実際に ConfigMap を作成したらどんな風に適用されるのか、を確認したい場合にも使えます
-
コマンド
- コマンドの実行結果だけを知りたい場合
--dry-run=client
をコマンドのオプションに付ける
- コマンドの実行結果を、yaml 形式などで表示したい場合
--dry-run=client -o <出力形式>
をコマンドのオプションに付ける。
-
オプション解説
<出力形式> 標準出力の形式。例: json, yaml
-
コマンド例
- ConfigMap を作成したときの結果を yaml 形式で表示する
kubectl apply -f configs/configmap-test-app.yml --dry-run=client -o yaml
- 表示結果例
apiVersion: v1 data: config.yml: |- root_path: /var/tmp/app ~省略~
オブジェクトの詳細を出力する
- 概要
- 稼働中のオブジェクトの詳細を、マニフェストファイルの形式(yaml など)で出力し、確認したい場合
- 作成したオブジェクトの内容が正しいか確認したい場合に使えます
- 既存のオブジェクトの構成を流用したい時に便利です
- コマンド
kubectl get pods <OBJECT_NAME> -o <出力形式>
- オプション解説
<OBJECT_NAME> オブジェクトの名前 <出力形式> 標準出力の形式。例: json, yaml
- コマンド例
- Pod の詳細を yaml 形式で出力する
kubectl get pods test-app-12345abcde -o yaml
- 表示結果例
apiVersion: v1 kind: Pod metadata: labels: app: test-app ~省略~
起動中の Pod のイベントを見る
- 概要
- 起動した直後の Pod の状態を確認したい場合
- logs は Pod が Running にならないと使えないため、
「作成がなかなか終わらない」などのときはイベントを見る必要があります - describe コマンドを使うと、対象 Pod のイベントを時系列で見ることができて便利です
- コマンド
kubectl describe pod <POD_NAME>
- オプション解説
<POD_NAME> ログインしたい Pod の NAME
- コマンド例
kubectl describe pod ${POD_NAME}
- レスポンス例
- この例だと、Volume のマウント時に重複マウントエラーが出ている
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m43s default-scheduler Successfully assigned test-ns/test-app-xxxx ... Warning FailedAttachVolume 4m43s attachdetach-controller Multi-Attach error for volume "pvc-xxxx" Volume is already used by pod(s) test-app-yyyy Warning FailedMount 22s kubelet Unable to attach or mount volumes: unmounted volumes=[test-data], unattached volumes=[test-data kube-api-access-xxxxx]: timed out waiting for the condition
- レスポンス例
応用編
Kubernetes コマンド+UNIXコマンド などで実現できることのメモ。
コンテナにローカルのファイルを一括で送る
- 概要
- ローカルで修正したファイルの更新を、開発環境などのコンテナに反映したいとき
- (お断り)コンテナ側で git pull する方が楽
- ただ、git push する前に動作を確認したい(コミットを汚したくない)、などの場合は使えるかも
- コマンド
file_list=" <コンテナに送りたいファイルのパス(例: `git status` に表示されたファイルパス)>" APP_NAME=<APP_NAME> CONTAINER_NAME=<CONTAINER_NAME> NAME_SPACE=<NAME_SPACE> POD_NAME=`kubectl -n ${NAME_SPACE} get pods -l app=${APP_NAME} --no-headers | grep Running | awk '{ print $1}'` for filename in ${file_list}; do kubectl -n ${NAME_SPACE} cp -c ${CONTAINER_NAME} --no-preserve=true /path/to/app/root/${filename} ${POD_NAME}:/path/to/web/htdocs/${filename} done
- オプション解説
<APP_NAME> ログインしたい Pod の metadata > labels > app の値 (例: nginx) <CONTAINER_NAME> ログインしたい コンテナ の NAME <NAME_SPACE> ログインしたい Pod がある NAME_SPACE
- コマンド例
file_list=" app/controllers/TopController.php app/views/top/index.volt public/css/custom.css" APP_NAME=app1-0-0-web CONTAINER_NAME=web NAME_SPACE=stg POD_NAME=`kubectl -n ${NAME_SPACE} get pods -l app=${APP_NAME} --no-headers | grep Running | awk '{ print $1}'` for filename in ${file_list}; do kubectl -n ${NAME_SPACE} cp -c ${CONTAINER_NAME} --no-preserve=true /path/to/app/root/${filename} ${POD_NAME}:/path/to/web/htdocs/${filename} done