親リソース削除時の挙動
k8sでは、基本親リソースを削除すると、そのリソースが管理している子リソースも削除されるようになっています。(カスケード削除:連鎖削除)
例えば、Developmentを削除すると、管理しているReplicaSetもPodも削除されます。
※ガベージコレクション(ゴミ回収)機能
親リソースはmetadata.ownerReferences
という属性を持ています。この属性はk8sによって自動生成されます。
実は、この挙動もコントロールできます。
リソース削除の挙動(カスケード削除モード)
k8sでは、下記3パターンの挙動が用意されています。
- Background(デフォルト値):親リソースが直ちに削除され、子リソースはガベージコレクションによって非同期に削除
- Foreground:
- 親リソースは削除処理中(deletion in progress)に遷移。同時に:
deletionTimestamp
が設置されるmetadata.finalizers = foregroundDeletion
に設置される
ownerReference.blockOwnerDeletion=true
状態の子リソースはガベージコレクションによって削除される- 親リソースを削除
- もし
ownerReference.blockOwnerDeletion=false
の子リソースが存在した場合、親リソースの削除は阻止される ownerReference.blockOwnerDeletion
未設定の子リソースは、親リソースの削除挙動に影響しない。後でBackgroundパターンで削除される。
- もし
- 親リソースは削除処理中(deletion in progress)に遷移。同時に:
- Orphan:親リソースのみ削除され、子リソース削除しない。
各パターンの設定方法
BackgroundとOrphanについては、オプションで使用できます。
- Background:
--cascade=true
- Orphan:
--cascade=false
例:
# Background。これはデフォルト値なので、オプション付けなくても同じ
kubectl delete replicaset <rs-name> --cascade=true
# Orphan
kubectl delete replicaset <rs-name> --cascade=false
- Foreground:直接API Serverへリクエスト(RestAPI)を出す必要があります。
公式ドキュメント例:kubectl proxy --port=8080 curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \ -H "Content-Type: application/json"
最後に
カスケード削除については、今だ筆者も使う場面がよくわからないので、とりあえずこういうことができるよぐらい知っておきましょう。
ここまで読んでいただいて、お疲れ様でした。
コメント