Kubernetes に一時的な Pod を配備する・配備する Node を指定する

Kubernetes クラスタのトラブルシュートのため、「各 Node から外部 DB へのネットワーク疎通が取れているか」を調べたかった。

「外部 DB に接続する」という一時的な目的の Pod を簡単に作るには、kubectl run コマンドが使える。

また、Pod を指定の Node に配備するためには、nodeSelector という機能を使ってラベルを指定してやれば良い。kubectl run コマンドにて nodeSelector を指定するには少々クセがあったので、そこを説明する。

Node のラベルを確認する

まずは Kubernetes Node のラベルを確認する。

$ kubectl get node -o wide --show-labels

「LABELS」欄を見ると、Node ごとに次のようなラベルが存在するはずだ。

kubernetes.io/hostname=workder1
kubernetes.io/hostname=workder2

worker1worker2 部分は、マネージド K8s サービスを使っていれば、そのクラウドベンダがよしなに決めてくれていたりすると思う。

一時的な Pod を作成する

続いて、とりあえず一時的な Pod を作る簡単なコマンド例を記す。

$ kubectl run temp-pod \
  --image=postgres:13-alpine \
  --restart=Never \
  --rm \
  -it \
  --command -- psql 'host=【ホスト名】 user=postgres port=5432 dbname=【スキーマ名】'

postgres:13-alpine という Docker イメージを利用して PostgreSQL を扱う Pod を作り、psql コマンドを実行している。この辺は用途に合わせて自分で作ると良い。

--restart=Never オプションを付与することで、Pod リソースのみを作成できる。ココのオプションを変えることで Deployment や Service を作ったりもできる。

--rm を指定していることで、--command で指定したコマンドが終了した時に、Pod が自動的に破棄される。kubectl delete pod の必要がなくなって楽だ。-itdocker exec と同じ。

このような指定で、とりあえず一時的な Pod を配備できる。Pod を起動している時に、別のターミナルタブで

$ kubectl get pod -o wide

コマンドを実行して、temp-pod という名前の Pod が配備されていることが確認できるだろう。

Node を指定して一時的な Pod を作成する

続いて本題。Pod を指定の Node に配備するため、オプションを付け足す。

$ kubectl run temp-pod \
  --image=postgres:13-alpine \
  --restart=Never \
  --overrides='{ "apiVersion": "v1", "spec": { "nodeSelector": { "kubernetes.io/hostname": "worker1" } } }' \
  --rm \
  -it \
  --command -- psql 'host=【ホスト名】 user=postgres port=5432 dbname=【スキーマ名】'

--overrides オプションを追加した。ココで指定しているのは $ kubectl get pod 【Pod 名】 -o json コマンドで確認できるような、Pod リソースの JSON 定義だ。

nodeSelector を利用して、Worker Node のホスト名のラベルを指定している。worker1 部分を任意の Node のラベルに変えれば、その Node にこの Pod を配備するように指定できる。

このように --overrides オプションで指定したリソース定義に、--image--command オプションの内容がマージされて、内部的に pod.yaml みたいなファイルが生成されているとイメージすると、分かりやすいだろう。

あとはよしなに、--namespace オプションで名前空間を指定しても良いし、--env オプションで次のように PostgreSQL の接続パスワードを指定したりしておけば、コマンドを叩くだけで PostgreSQL に接続したりもできる。

--env=PGPASSWORD=【PostgreSQL の接続パスワード】

PostgreSQL の場合、接続時に If you don't see a command prompt, try pressing enter. というプロンプトが出たことがあった。コレはただ Enter キーを押すだけで、いつもの psql のプロンプトに移行できる。

というワケで、若干トリッキーな書き方ではあるが、このように Node を指定しての一時的な Pod が配備できた。