kubectl execの使い方

Kubernetesのコンテナ上でコマンド実行するためにはkubectl execを使えます。

## kubectl exec `ssh`不要でコンテナ操作可能 * コンテナ内でコマンドを実行できる * `-it`オプションで端末にコンテナに接続できる * GoogleKubernetesEngineも統一的に操作 --- ## オプション * `-i` 標準入力を接続。ローカルの`cat`出力リダイレクトにも使える * `-t` 仮想端末の接続 * `-c container_name` マルチコンテナpodの際のコンテナ名 * `-n namespace` ネームスペース指定 --- ## kubectl iexec プラグインのインストールで利用可能 * フラグメントを省略可能 * 複数の選択肢は選択可能 * マルチコンテナもカーソル選択 --- ## コンテナ内で作業 `kubectl exec -it POD_NAME -- bash` * pod名のかわりに`deployment/deployment_name`などもOK * `bash`ではなく`rails c`などでも良い * bashは`exit`または`Ctrl-d`で切断 --- ## 可能な操作 コンテナに入っているコマンドを実行可能 * 何が入っているかは利用イメージ次第 * なければ`apt-get`などで追加もできる * ただし再起動で消える --- ## できそうでできない DBなど主プロセスのconfig試行錯誤には適さない 1. コンテナにログイン 2. 主プロセスのconfig書き換え 3. 主プロセス再起動 4. コンテナが揮発して振出しに戻る --- ## 標準入出力リダイレクト シェルのパイプがホストを越える * `kubectl exec POD -- cat /some_log > some_log`でローカル転送できる * `cat some_file | kubectl -i ...`も一応可能 * 大きなSQLファイルのリカバリ完了できないケースがあり過信できない

コマンド構成は概ね docker execを踏襲しており、典型的な使い方は、以下のようにシェルを指定してSSHターミナルのように接続するケースでしょう。

$ kubectl exec -it POD_NAME -- bash

# -itオプションは標準入出力の接続。ターミナルのような利用の際に必要
# コンテナ上で実行するコマンドの前に`--`セパレータが必要

kubectl exec利用のポイントは、 podの名前指定です(上のコマンド例でPOD_NAMEの部分)。

pod名は kubectl get podsで確認でき、“nginx-t2n44” のような文字列が表示されます。Kubernetesは “-t2n44” のようなフラグメントを自動で付加するため、pod名を特定しづらい面があります。

Kubernetes v1.15あたりで導入された機能で、deploymentなどの名前を利用して、フラグメント無しでpod指定できる機能が追加されました。

$ kubectl exec -it deployment/DEPLOYMENT_NAME -- bash

# 以下のような2通りの指定が同じ挙動に
# kubectl exec -it deployment/nginx -- bash
# kubectl exec -it nginx-t2n44 -- bash

複数Pod構成など、使えないケースもありそうですが、フラグメントを書かなくて良いケースが増えたので助かります。

GKE上のコンテナも kubectl exec

なお、Google Kubernetes Engine(GKE)上のコンテナも同様にkubectl exec -itで接続できます。(初回はGoogle Cloud SDKのセットアップが必要)

複数のクラスタを運用する場合にも、同じコマンドでコンテナ接続できるのは便利です。

また、GKEは Googleアカウントと統合されており、管理画面でOAuthの権限を削除するとその端末からログインできなくなるため、セキュリティ面でも優れています。

kubectl iexec プラグイン

コンテナが増えてきた場合、 kubectl-iexec(Interactive Exec)プラグインが圧倒的に便利です。コンテナ名の部分マッチで操作対象を選択できます。ユニークであれば即座に確定し、複数の該当podがある場合には、選択肢が表示されます。公式サイトのスクリーンキャストを見ると、挙動を理解できるでしょう。

インストールはPATHの通った場所に実行属性つきのバイナリを置くだけです。kubectlのプラグイン機構により、kubectl iexecコマンドで動作します。

k8sのDBオペレーションはport-forward機能も使える

コマンドラインのバックアップリストアには kubectl exec が便利ですが、GUIクライアントなどを利用してMySQLやPostgreSQLのDBMSオペレーションをしたいケースではkubectl port-forwardを使えます。

SSHのポートフォワードのように、localhostのポートにリモートTCPサービスのポートをマップして任意のクライアントを利用できます。

Tips: bashコマンド化

シェルログインを頻繁に行う場合、~/.bashrcに以下のような関数を定義しておくと、kbash pod名のように実行できて便利です。末尾のbashを付け忘れてエラー、という失敗がなくなります。

function kbash() {
  command kubectl exec -it $1 -- bash
}
中馬崇尋
Chuma Takahiro