Kubernetesのコンテナ上でコマンド実行するためにはkubectl exec
を使えます。
コマンド構成は概ね 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