본문 바로가기

개발하자

Kubernetes : StatefulSet에서 관리하는 특정 포드를 다시 만들지 않고 삭제하는 방법?

반응형

Kubernetes : StatefulSet에서 관리하는 특정 포드를 다시 만들지 않고 삭제하는 방법?

나는 2개의 포드가 있는 스테이트풀 세트를 가지고 있다. 헤드리스(headless) 서비스가 있으며 각 포드에는 로드밸런서(LoadBalancer) 서비스가 있어 전 세계에서 이용할 수 있다.

pod name이 pod-0과 pod-1이라고 하자.

만약 내가 pod-0을 삭제하고 싶지만 pod-1을 계속 활성화하고 싶다면, 나는 그것을 할 수 없다.

나는 노력했다.

kubectl delete pod pod-0

StatefulSet 복제본이 2로 설정되어 있으므로 삭제한 후 재시작합니다.

그래서 노력했다

kubectl delete pod pod-0
kubectl scale statefulset some-name --replicas=1

그러면 pod-0이 삭제되고 pod-1이 삭제된 후 pod-0이 재시작됩니다. 복제본을 1로 설정하면 StatefulSet은 pod-0을 활성화 상태로 유지하지만 pod-1은 유지하지 않기 때문인 것 같습니다.

하지만 어떻게 하면 pod-1을 활성화하고 pod-0을 삭제할 수 있을까?




StatefulSet 컨트롤러에서 지원되지 않습니다. 아마도 당신이 할 수 있는 최선의 방법은 수면 심으로 직접 그 꼬투리를 만드는 것일 것이고 아마도 당신은 더 빠를 수 있을 것이다. 하지만 그러면 sts controller는 영원히 불행해질 것이다.




  • Statefulset은 항상 인덱스가 0인 포드를 생성한다..(replica-1).
  • 개별 포드를 보다 세밀하게 제어하려면 별도의 STS 개체를 만들어야 할 것 같습니다(레플리카 = 1 포함)



다음과 같은 사용자 지정 컨트롤러를 사용해 볼 수 있습니다:

맞춤형 자원을 사용하면 선택적 포드 제거로 더 많은 미세한 곡물 조절을 할 수 있다.

apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
spec:
  # ...
  replicas: 4
  scaleStrategy:
    podsToDelete:
    - sample-9m4hp # you select which pod to remove

https://openkruise.io/en-us/docs/cloneset.html

또는 의 특정 포드를 제거하는 문제는 수년 동안 해결책이 없이 열려 왔습니다:




K8s 1.21+의 ReplicaSet에는 배포의 경우 해당 문제를 해결하기 위한 POD 주석이 있지만 STS의 경우에는 현재까지 아무것도 없습니다.




StatefulSet을 선택했지만 옵션을 추가하면 StatefulSet은 삭제되지만 포드는 그대로 유지됩니다. 그러면 당신이 원하는 순서대로 그들을 죽일 수 있어요. StatefulSet을 재생성할 때 남은 포드를 채택하고 누락된 포드를 대체할 새 포드를 생성해야 합니다.


반응형