이 페이지에서는 가비지 수집 중 클러스터에서 사용할 캐스케이딩 삭제 타입을 지정하는 방법을 보여준다.
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
또한 다양한 타입들의 캐스케이딩 삭제를 실험하려면 샘플 디플로이먼트를 생성할 필요가 있다. 각 타입에 대해 디플로이먼트를 다시 생성해야 할 수도 있다.
파드에서 ownerReferences 필드가 존재하는지 확인한다.
kubectl get pods -l app=nginx --output=yaml
출력은 다음과 같이 ownerReferences 필드를 가진다.
apiVersion: v1
...
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: nginx-deployment-6b474476c4
uid: 4fdcd81c-bd5d-41f7-97af-3a3b759af9a7
...
기본적으로 쿠버네티스는 종속 오브젝트를 삭제하기 위해서
백그라운드 캐스케이딩 삭제를 사용한다. 클러스터를 실행하는 쿠버네티스 버전에 따라
kubectl 또는 쿠버네티스 API를 사용해
포그라운드 캐스케이딩 삭제로 전환할 수 있다.
버전 확인을 위해서, 다음 커맨드를 실행 kubectl version.
kubectl 또는 쿠버네티스 API를 사용해
포그라운드 캐스케이딩 삭제로 오브젝트들을 삭제할 수 있다.
kubectl 사용
다음 명령어를 실행한다.
kubectl delete deployment nginx-deployment --cascade=foreground
쿠버네티스 API 사용
로컬 프록시 세션을 시작한다.
kubectl proxy --port=8080
삭제를 작동시키기 위해 curl을 사용한다.
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 파이널라이저(finalizer)가 포함되어 있다.
"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"
]
...
kubectl 또는 쿠버네티스 API를 사용한다.버전 확인을 위해서, 다음 커맨드를 실행 kubectl version.
kubectl 또는 쿠버네티스 API를 사용해
백그라운드 캐스케이딩 삭제로 오브젝트들을 삭제할 수 있다.
쿠버네티스는 기본적으로 백그라운드 캐스케이딩 삭제를 사용하므로, --cascade 플래그
또는 propagationPolicy 인수 없이
다음 명령을 실행해도 같은 작업을 수행한다.
kubectl 사용
다음 명령어를 실행한다.
kubectl delete deployment nginx-deployment --cascade=background
쿠버네티스 API 사용
로컬 프록시 세션을 시작한다.
kubectl proxy --port=8080
삭제를 작동시키기 위해 curl을 사용한다.
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"
}
기본적으로, 쿠버네티스에 오브젝트를 삭제하도록 지시하면
컨트롤러는
종속 오브젝트들도 제거한다. 클러스터를 실행하는
쿠버네티스 버전에 따라 kubectl 또는 쿠버네티스 API를 사용해
종속 오브젝트를 쿠버네티스 고아로 만들 수 있다.
버전 확인을 위해서, 다음 커맨드를 실행 kubectl version.
kubectl 사용
다음 명령어를 실행한다.
kubectl delete deployment nginx-deployment --cascade=orphan
쿠버네티스 API 사용
로컬 프록시 세션을 시작한다.
kubectl proxy --port=8080
삭제를 작동시키기 위해 curl을 사용한다.
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"
],
...
디플로이먼트가 관리하는 파드들이 계속 실행 중인지 확인할 수 있다.
kubectl get pods -l app=nginx