클러스터에서 캐스케이딩 삭제 사용
이 페이지에서는 가비지 수집 중 클러스터에서 사용할 캐스케이딩 삭제 타입을 지정하는 방법을 보여준다.
시작하기 전에
쿠버네티스 클러스터가 필요하고, 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
...
포그라운드(foreground) 캐스케이딩 삭제 사용
기본적으로 쿠버네티스는 종속 오브젝트를 삭제하기 위해서
백그라운드 캐스케이딩 삭제를 사용한다. 클러스터를 실행하는 쿠버네티스 버전에 따라
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" }
소유자 오브젝트 및 종속된 고아(orphan) 오브젝트 삭제
기본적으로, 쿠버네티스에 오브젝트를 삭제하도록 지시하면
컨트롤러는
종속 오브젝트들도 제거한다. 클러스터를 실행하는
쿠버네티스 버전에 따라 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
다음 내용
- 쿠버네티스의 소유자와 종속 오브젝트에 대해 알아보자.
- 쿠버네티스 파이널라이저(finalizers)에 대해 알아보자.
- 가비지(garbage) 수집에 대해 알아보자.