はじめに
Kubernetesではkubectl create deployment nginx-dep --image nginx
とデプロイメントを作成すると自動的にReplicaSetも作成され、不具合が発生した場合もPodをdeleteすれば自動的に新たなPodが復旧します。
ただ、PD対応等で特定のPodを一時的に退避してデプロイメントで管理するPodから外して新たなPodを作成したい場合があります。本記事ではそのような際に利用できるPodのラベル変更手順によるPodの切り離しを説明します。
コマンド実行環境
$ kubectl version Client Version: version.Info{Major:"1", Minor:"15",...
想定するシナリオ
以下のPod(Labels:app=nginx-dep)が
$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-dep-76c88d5587-7fjp7 1/1 Running 0 26m nginx-dep-76c88d5587-7k6gs 1/1 Running 0 10m
以下のレプリカセットで管理されている状況で
$ kubectl describe rs nginx-dep-76c88d5587 Name: nginx-dep-76c88d5587 Namespace: default Selector: app=nginx-dep,pod-template-hash=76c88d5587 Labels: app=nginx-dep
nginx-dep-76c88d5587-7fjp7のPodを立ち上げたままレプリカセットから切り離すことで、デプロイメントとしてのPod数は維持したままでnginx-dep-76c88d5587-7fjp7の内部調査を行いたい。
Podのラベルを変更することでSelectorの対象から外す
レプリカセットの中身を見れば分かる通り以下の条件でPod数を監視しています。
Selector: app=nginx-dep,pod-template-hash=76c88d5587
切り離したいPodは以下のように同ラベルが付与されているので
$ kubectl describe pod nginx-dep-76c88d5587-7fjp7 ... Labels: app=nginx-dep pod-template-hash=76c88d5587
以下コマンドでエディタを開きPodのラベルを変更(nginx-dep→nginx-depX)すれば
$ kubectl edit pod nginx-dep-76c88d5587-7fjp7 pod/nginx-dep-76c88d5587-7fjp7 edited
$ kubectl describe pod nginx-dep-76c88d5587-7fjp7 ... Labels: app=nginx-depX
新たなPodがreplica数を維持するために起動してきます。
$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-dep-76c88d5587-7fjp7 1/1 Running 0 27m nginx-dep-76c88d5587-7k6gs 1/1 Running 0 11m nginx-dep-76c88d5587-hpnxg 0/1 ContainerCreating 0 6s
そしてデプロイメントを削除しても
$ kubectl delete deploy nginx-dep deployment.extensions "nginx-dep" deleted
ラベルを変更したPodはデプロイメントの管理外となり起動したままになります。
$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-dep-76c88d5587-7fjp7 1/1 Running 0 28m nginx-dep-76c88d5587-7k6gs 0/1 Terminating 0 12m nginx-dep-76c88d5587-hpnxg 0/1 Terminating 0 37s
終わりに
不具合が発生しているPodはkubectl delete pod
やデプロイメント自体で落とし上げを行いがちですが、Podを落とさずにラベル名のみを付け替えることで該当のPodを起動したまま同様の操作ができるので覚えておくと役立つと思います。