(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】Deploymentを例にOwnerReferencesを理解する

スポンサーリンク

はじめに

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として記載されているオブジェクトの削除が行われないようにすることも可能です。こちらも併せて覚えておくとどこかで役立つと思います。