# クラスターでカスケード削除を使用する

LLMS index: [llms.txt](/llms.txt)

---

<!--overview-->

このページでは、<a class='glossary-tooltip' title='Kubernetesがクラスターリソースをクリーンアップするために使用するさまざまなメカニズムの総称です。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/docs/concepts/architecture/garbage-collection/' target='_blank' aria-label='ガベージコレクション'>ガベージコレクション</a>中にクラスターで使用する[カスケード削除](/ja/docs/concepts/architecture/garbage-collection/#cascading-deletion)のタイプを指定する方法を示します。

## 始める前に

<p>Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。
このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。
まだクラスターがない場合、<a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a>を使って作成するか、
以下のいずれかのKubernetesプレイグラウンドも使用できます:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>


また、さまざまな種類のカスケード削除を試すために、[サンプルのDeploymentを作成する](/ja/docs/tasks/run-application/run-stateless-application-deployment/#creating-and-exploring-an-nginx-deployment)必要があります。 タイプごとにDeploymentを再作成する必要があります。

## Podのオーナーリファレンスを確認する {#check-owner-references-on-your-pods}

Podに`ownerReferences`フィールドが存在することを確認します:

```shell
kubectl get pods -l app=nginx --output=yaml
```

出力には、次のように`ownerReferences`フィールドがあります。

```yaml
apiVersion: v1
    ...
    ownerReferences:
    - apiVersion: apps/v1
      blockOwnerDeletion: true
      controller: true
      kind: ReplicaSet
      name: nginx-deployment-6b474476c4
      uid: 4fdcd81c-bd5d-41f7-97af-3a3b759af9a7
    ...
```

## フォアグラウンドカスケード削除を使用する {#use-foreground-cascading-deletion}

デフォルトでは、Kubernetesは[バックグラウンドカスケード削除](/ja/docs/concepts/architecture/garbage-collection/#background-deletion)を使用して、オブジェクトの依存関係を削除します。
クラスターが動作しているKubernetesのバージョンに応じて、`kubectl`またはKubernetes APIのいずれかを使用して、フォアグラウンドカスケード削除に切り替えることができます。 
 <p>バージョンを確認するには次のコマンドを実行してください:  <code>kubectl version</code>.</p>


`kubectl`またはKubernetes APIを使用して、フォアグラウンドカスケード削除を使用してオブジェクトを削除することができます。

**kubectlを使用する**

以下のコマンドを実行してください:
<!--TODO: verify release after which the --cascade flag is switched to a string in https://github.com/kubernetes/kubectl/commit/fd930e3995957b0093ecc4b9fd8b0525d94d3b4e-->


```shell
kubectl delete deployment nginx-deployment --cascade=foreground
```

**Kubernetes APIを使用する**

1. ローカルプロキシセッションを開始します:

   ```shell
   kubectl proxy --port=8080
   ```

1. 削除のトリガーとして`curl`を使用します:

   ```shell
   curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
       -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
       -H "Content-Type: application/json"
   ```

   出力には、次のように`foregroundDeletion`<a class='glossary-tooltip' title='削除対象としてマークされたオブジェクトを完全に削除する前に、特定の条件が満たされるまでKubernetesを待機させるための名前空間付きのキーです。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/docs/concepts/overview/working-with-objects/finalizers/' target='_blank' aria-label='ファイナライザー'>ファイナライザー</a>が含まれています。

   ```
   "kind": "Deployment",
   "apiVersion": "apps/v1",
   "metadata": {
       "name": "nginx-deployment",
       "namespace": "default",
       "uid": "d1ce1b02-cae8-4288-8a53-30e84d8fa505",
       "resourceVersion": "1363097",
       "creationTimestamp": "2021-07-08T20:24:37Z",
       "deletionTimestamp": "2021-07-08T20:27:39Z",
       "finalizers": [
         "foregroundDeletion"
       ]
       ...
   ```

## バッググラウンドカスケード削除を使用する {#use-background-cascading-deletion}

1. [サンプルのDeploymentを作成する](/ja/docs/tasks/run-application/run-stateless-application-deployment/#creating-and-exploring-an-nginx-deployment)。
1. クラスターが動作しているKubernetesのバージョンに応じて、`kubectl`またはKubernetes APIのいずれかを使用してDeploymentを削除します。
 <p>バージョンを確認するには次のコマンドを実行してください:  <code>kubectl version</code>.</p>


`kubectl`またはKubernetes APIを使用して、バックグラウンドカスケード削除を使用してオブジェクトを削除できます。

Kubernetesはデフォルトでバックグラウンドカスケード削除を使用し、`--cascade`フラグまたは`propagationPolicy`引数なしで以下のコマンドを実行した場合も同様です。

**kubectlを使用する**

以下のコマンドを実行してください:

```shell
kubectl delete deployment nginx-deployment --cascade=background
```

**Kubernetes APIを使用する**

1. ローカルプロキシセッションを開始します:

   ```shell
   kubectl proxy --port=8080
   ```

1. 削除のトリガーとして`curl`を使用します:

   ```shell
   curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
       -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
       -H "Content-Type: application/json"
   ```

   出力は、次のようになります。

   ```
   "kind": "Status",
   "apiVersion": "v1",
   ...
   "status": "Success",
   "details": {
       "name": "nginx-deployment",
       "group": "apps",
       "kind": "deployments",
       "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
   }
   ```


## オーナーオブジェクトの削除と従属オブジェクトの孤立 {#set-orphan-deletion-policy}

デフォルトでは、Kubernetesにオブジェクトの削除を指示すると、<a class='glossary-tooltip' title='クラスターの状態をAPIサーバーから取得、見張る制御ループで、現在の状態を望ましい状態に移行するように更新します。' data-bs-toggle='tooltip' data-bs-placement='top' href='/ja/docs/concepts/architecture/controller/' target='_blank' aria-label='コントローラー'>コントローラー</a>は従属オブジェクトも削除します。クラスターが動作しているKubernetesのバージョンに応じて、`kubectl`またはKubernetes APIを使用して、これらの従属オブジェクトをKubernetesで*orphan*にすることができます。
 <p>バージョンを確認するには次のコマンドを実行してください:  <code>kubectl version</code>.</p>


**kubectlを使用する**

以下のコマンドを実行してください:

```shell
kubectl delete deployment nginx-deployment --cascade=orphan
```

**Kubernetes APIを使用する**

1. ローカルプロキシセッションを開始します:

   ```shell
   kubectl proxy --port=8080
   ```

1. 削除のトリガーとして`curl`を使用します:

   ```shell
   curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
       -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
       -H "Content-Type: application/json"
   ```

   出力には、次のように`finalizers`フィールドに`orphan`が含まれます。

   ```
   "kind": "Deployment",
   "apiVersion": "apps/v1",
   "namespace": "default",
   "uid": "6f577034-42a0-479d-be21-78018c466f1f",
   "creationTimestamp": "2021-07-09T16:46:37Z",
   "deletionTimestamp": "2021-07-09T16:47:08Z",
   "deletionGracePeriodSeconds": 0,
   "finalizers": [
     "orphan"
   ],
   ...
   ```

Deploymentによって管理されているPodがまだ実行中であることを確認できます。

```shell
kubectl get pods -l app=nginx
```

## 次の項目

* Kubernetesの[オーナーと従属](/ja/docs/concepts/overview/working-with-objects/owners-dependents/)について学ぶ。
* Kubernetes [ファイナライザー(Finalizers)](/ja/docs/concepts/overview/working-with-objects/finalizers/)について学ぶ。
* [ガベージコレクション](/ja/docs/concepts/architecture/garbage-collection/)について学ぶ。
