広告

kubernetes – カスケード削除(連鎖削除)

infrastructure as code

親リソース削除時の挙動

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パターンで削除される。
  • 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"

最後に

カスケード削除については、今だ筆者も使う場面がよくわからないので、とりあえずこういうことができるよぐらい知っておきましょう。

ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました