はじめに
Kubernetesではkubectl create deployment nginx-dep --image nginx
とデプロイメントを作成すると自動的にReplicaSetやPodが作成され、同デプロイメントを削除すれば自動的にReplicaSetやPodも削除されます。
これはOwnerReferencesによってオブジェクトの親子関係が管理されていることでガーベッジコレクションが行われる仕組みでもあります。本記事ではこのOwnerReferencesに伴うガーベッジコレクションの例をデプロイメントで説明します。
コマンド実行環境
$ kubectl version Client Version: version.Info{Major:"1", Minor:"15",...
事前準備
以下のデプロイメントを作成すると
$ kubectl create deployment nginx-dep --image nginx deployment.apps/nginx-dep created
デプロイメント、レプリカセット、ポッドが作成されます。
$ kubectl get deploy,rs,pod NAME READY UP-TO-DATE AVAILABLE AGE deployment.extensions/nginx-dep 1/1 1 1 21s NAME DESIRED CURRENT READY AGE replicaset.extensions/nginx-dep-76c88d5587 1 1 1 21s NAME READY STATUS RESTARTS AGE pod/nginx-dep-76c88d5587-k4g2j 1/1 Running 0 21s
ownerReferenceを確認する
YAMLファイルでは「ownerReference」で管理されるのでそれぞれで確認するとReplicaSetとPodにのみ存在します。
$ kubectl get deploy nginx-dep -o yaml | grep ownerReferences $ kubectl get rs nginx-dep-76c88d5587 -o yaml | grep ownerReferences ownerReferences: $ kubectl get pod nginx-dep-76c88d5587-k4g2j -o yaml | grep ownerReferences ownerReferences:
そしてそれぞれを確認するとReplicaSetではDeploymentがowner、PodではReplicaSetがownerとして管理されています。
ownerReferences:
...
kind: Deployment
name: nginx-dep
...
ownerReferences:
...
kind: ReplicaSet
name: nginx-dep-76c88d5587
...
OwnerReferenceで指定されているオブジェクトが削除された場合は同オブジェクトも削除される動きを取るため、デプロイメントを削除すれば連鎖的にレプリカセットとポッドが削除されるというわけです。
終わりに
Kubernetes初学者の方が素朴に抱く「なぜDeploymentを消せば関連するPodが全て消えるのか」という問いは「OwneReferenceで紐づいているから」というのが回答になります。
ただし、削除する際に--cascade=false
と指定すればそのオブジェクトがOwnerとして記載されているオブジェクトの削除が行われないようにすることも可能です。こちらも併せて覚えておくとどこかで役立つと思います。