Kubbernetes Drain 및 Pod Disruption Budget(PDB)

5855 단어 Kubernetespodtech

개요


개인의 메모로 Kubernetes의 Drain과 Disruption을 총괄했다.
참고 자료
https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
https://kubernetes.io/docs/concepts/workloads/pods/disruptions/

Drain

kubectl drain 명령을 사용하여 노드(ex: 커널 업데이트 또는 하드웨어 업데이트 등)를 유지하기 전에 노드의 모든 Pod를 안전하게 삭제할 수 있습니다.Drain을 안전하게 삭제할 때는 Pod 컨테이너의 graceful shutdown 또는 PDB(후술)를 고려하여 삭제할 수 있습니다.
kubectl get nodes
kubectl drain <node name>
상기 명령이 잘못 집행되지 않으면 노드를 정지할 수 있습니다.
유지 보수 과정에서 노드가 그룹에 남아 있을 때 다음 명령을 실행해야 합니다.
kubectl uncordon <node name>
위에서 설명한 대로 Kubernetes에서 노드의 새 Pod를 다시 시작하는 일정을 지정할 수 있습니다.

Voluntary 및 involuntary disruptions


사용자 또는 컨트롤러가 Pod를 제거하지 않는 한 불가피한 하드웨어 또는 시스템 소프트웨어 오류가 발생하지 않는 한 Pod는 사라지지 않습니다.
Kubernetes에서 이러한 불가피한 상황을 involungtary disruptions라고 부른다.예를 들면 다음과 같은 경우가 있다.
  • 물리적 시스템 지원 노드의 하드웨어 장애
  • 클러스터 관리자가 VM(인스턴스)을 잘못 삭제한 경우
  • 클라우드 공급업체의 장애로 VM이 삭제된 경우
  • 내핵 공황
  • 클러스터 네트워크를 통해 클러스터에서 Pod를 분리한 경우
  • 노드외부 자원를 통해 Pod 제거상기 이외의 다른 상황은 Kubernetes에서volungtary disruptions라고 불린다.
    응용 프로그램 소유자가 설정한 동작과 그룹 관리자가 설정한 동작 등을 포함한다.
    예를 들어, 일반적인 애플리케이션 매니저의 작업이 포함됩니다.
  • Pod 관리를 위한 Deployment 및 기타 컨트롤러 제거
  • Deployment의 Pod 템플릿 업데이트를 통해 재부팅
  • 직접 제거 Pod(이벤트 포함)
  • 클러스터 관리자의 작업 예는 다음과 같습니다.
  • 수정 또는 업데이트를 통해노드의 누극
  • 집단의 상황을 낮추기 위해 집단에서 노드를 배제하는 경우(참고: Cluster Autoscaling
  • 노드에서 Pod를 제거하는 데 사용된 리소스가 노드에 수용될 경우
  • 이러한 동작은 그룹 관리자가 직접 실행하거나, 그룹 관리자가 자동으로 실행하거나, 그룹의 호스트 공급자가 실행할 수 있습니다.
    클러스터 관리자 또는 클라우드 관리자가 volungtary disruptions를 생성할 수 없는 경우에는 Pod Disruption Budgets를 만들 필요가 없습니다.

    회피 처리의 대응


    involuny disruptions에 대응하기 위해서는 다음과 같은 몇 가지 방법이 있습니다.
  • Pod가 요청한 리소스를 확인
  • 고가용성이 필요한 경우 Replicate 애플리케이션
  • 복제된 상태에서 고가용성이 필요한 경우 랙 간 또는 영역 간(다중 영역 클러스터 사용) 분산 어플리케이션
  • 여러 방면에 관련되다.기본 Kubbernetes 클러스터에는 자동 disruption이 없으며 사용자만 발생합니다.그러나 집단 관리자와 호스트 공급자가 시작하는 추가 서비스로volungtary disruption이 발생할 수 있습니다.예를 들어, 노드 소프트웨어 업데이트를 로드하면 volungtary disruption이 발생할 수 있습니다.일부 집합 (노드) 의 자동 축소 실현은 통화 긴축과 긴축 노드의volungtary disruption을 초래할 수 있다.

    Pod disruption budget(PDB)


    Kubernetes는 빈번한volungtary disruption이 발생할 때 고가용성을 위한 기능을 제공합니다.
    응용 프로그램 소유자로서 각 응용 프로그램에 PodDisruptionBudget(PDB)을 작성할 수 있습니다.PDB는 복제 응용 프로그램의 Pod 수를 제한하는 동시에 voluntary disruption을 통해 줄입니다.예를 들어 자원량 기초 응용 프로그램에서 실행 중인 복제품 수는 할당량 이하에 미치지 않아야 한다.웹 전면에서 처리 하중의 복사본 수는 특정 비율보다 낮지 않아야 한다.
    집단 관리자와 클라우드 서비스 공급자는 Pod와 DeploymentEviction API를 직접 삭제하는 대신PodDisruptionBudget 도구를 사용해야 한다.
    예를 들어 kubectl drain 하위 명령은 노드를 서비스 정지로 표시할 수 있다.kubectl drain 를 실행하면 서비스를 중지할 노드의 모든 Pod가 제거됩니다.kubectl 명령에 의해 전송된 삭제 요청은 일시적으로 거부될 수 있으므로 대상에 있는 모든 Pod가 종료되거나 시간이 초과되기 전에 실패한 삭제 요청을 정기적으로 다시 시도합니다.
    PDB는 응용 프로그램이 사용할 수 있는 복사본 수를 지정합니다. 응용 프로그램이 예상한 보존 수량과 비교합니다.예를 들어 Deployment에서 복제품 수를 5로 지정할 때, PDB가 4로 지정할 때, Eviction API에서 허용하는volungtary disruption의 수는 1이다.
    PDB에서 Involungtary disruption을 제어할 수 없습니다.그리고 Involungtary disruption의 삭제 수는 budget이라고 할 수 없습니다.
    스크롤 업데이트를 통해 삭제하거나 사용할 수 없는Pod은 disruption budget으로 계산되지만, Deployment와StatefulSet 같은 작업 로드 자원은 스크롤 업데이트를 할 때 PDB의 제한을 받지 않습니다.반대로 프로그램 업데이트 과정 중의 실패 처리는workload 자원의 스펙트럼에 따라 설정됩니다.
    Pod가 Eviction API에서 제거되면 Pod는 Pod의 specterminationGracePeriodSeconds 설정에 따라 정상적으로 종료됩니다.

    PodDisruptionBudge의 예


    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: zk-pdb
    spec:
      minAvailable: 2
      selector:
        matchLabels:
          app: zk-a
    
    

    PDB 작업 예
    https://kubernetes.io/docs/tasks/run-application/configure-pdb/

    좋은 웹페이지 즐겨찾기