4.9. Descheduler를 사용하여 Pod 제거

스케줄러 는 새 Pod를 호스팅하는 데 가장 적합한 노드를 결정하는 데 사용할 수 있지만 Descheduler는 더 적합한 노드에 다시 예약할 수 있도록 실행 중인 Pod를 제거하는 데 사용할 수 있습니다.

4.9.1. Descheduler 정보

Descheduler를 사용하면 특정 전략에 따라 Pod를 제거하여 Pod를 더 적절한 노드에 다시 예약할 수 있습니다.

다음과 같은 상황에서 실행 중인 Pod의 일정을 조정하면 이점을 누릴 수 있습니다.

  • 노드가 충분히 사용되지 않았거나 너무 많이 사용되었습니다.
  • 오염 또는 라벨과 같은 Pod 및 노드 선호도 요구 사항이 변경되었으며, 원래 일정 결정이 더 이상 특정 노드에 적합하지 않습니다.
  • 노드 장애로 Pod를 이동해야 합니다.
  • 새 노드가 클러스터에 추가되었습니다.
  • Pod가 너무 많이 재시작되었습니다.
중요

Descheduler는 제거된 Pod의 교체를 예약하지 않습니다. 제거된 Pod에 대한 이러한 작업은 스케줄러에서 자동으로 수행합니다.

Descheduler가 노드에서 Pod를 제거하도록 결정하는 경우 다음과 같은 일반 메커니즘을 사용합니다.

  • openshift-*kube-system 네임스페이스의 Pod는 제거되지 않습니다.
  • priorityClassNamesystem-cluster-critical 또는 system-node-critical로 설정된 중요 Pod는 제거되지 않습니다.
  • 복제 컨트롤러, 복제본 세트, 배포 또는 작업에 포함되지 않는 정적, 미러링 또는 독립형 Pod는 다시 생성되지 않기 때문에 제거되지 않습니다.
  • 데몬 세트와 연결된 Pod는 제거되지 않습니다.
  • 로컬 스토리지가 있는 Pod는 제거되지 않습니다.
  • 최상의 Pod가 버스트 가능 Pod 및 보장된 Pod보다 먼저 제거됩니다.
  • descheduler.alpha.kubernetes.io/evict 주석이 있는 모든 Pod 유형을 제거할 수 있습니다. 이 주석은 제거를 방지하는 검사를 덮어쓰는 데 사용되며 사용자는 제거할 Pod를 선택할 수 있습니다. 사용자는 Pod를 다시 생성하는 방법과 다시 생성되는지의 여부를 알아야 합니다.
  • PDB(Pod 중단 예산)가 적용되는 Pod는 일정 조정에서 해당 PDB를 위반하는 경우 제거되지 않습니다. Pod는 PDB를 처리하는 제거 하위 리소스를 사용하여 제거합니다.

4.9.2. Descheduler 프로필

다음 Descheduler 프로필을 사용할 수 있습니다.

AffinityAndTaints

이 프로필은 Pod 간 유사성 방지, 노드 유사성, 노드 테인트를 위반하는 Pod를 제거합니다.

다음과 같은 전략을 활성화합니다.

  • RemovePodsViolatingInterPodAntiAffinity: Pod 간 유사성 방지를 위반하는 Pod를 제거합니다.
  • RemovePodsViolatingNodeAffinity: 노드 유사성을 위반하는 Pod를 제거합니다.
  • RemovePodsViolatingNodeTaints: 노드에서 NoSchedule 테인트를 위반하는 Pod를 제거합니다.

    노드 유사성 유형이 requiredDuringSchedulingIgnoredDuringExecution인 Pod가 제거됩니다.

TopologyAndDuplicates

이 프로필은 노드 간에 유사한 Pod 또는 동일한 토폴로지 도메인의 Pod를 균등하게 분배하기 위해 Pod를 제거합니다.

다음과 같은 전략을 활성화합니다.

  • RemovePodsViolatingTopologySpreadConstraint: DoNotSchedule 제약 조건을 위반하는 경우 균형이 맞지 않는 토폴로지 도메인을 찾아 더 큰 도메인에서 Pod를 제거합니다.
  • RemoveDuplicates: 동일한 노드에서 실행 중인 복제본 세트, 복제 컨트롤러, 배포 또는 작업과 연결된 Pod가 하나뿐인지 확인합니다. Pod가 두 개 이상인 경우 클러스터에서 Pod를 더 잘 배포하기 위해 이러한 중복 Pod를 제거합니다.
LifecycleAndUtilization

이 프로필은 장기 실행 Pod를 제거하고 노드 간 리소스 사용량의 균형을 조정합니다.

다음과 같은 전략을 활성화합니다.

  • RemovePodsHavingTooManyRestarts: 컨테이너가 너무 여러 번 재시작된 Pod를 제거합니다.

    모든 컨테이너(Init Container 포함)에서 재시작하는 Pod는 100개 이상입니다.

  • LowNodeUtilization: 활용도가 낮은 노드를 찾고, Pod 재생성 시 Pod가 이처럼 활용도가 낮은 노드에 예약되도록 가능하면 과도하게 사용된 노드에서 Pod를 제거합니다.

    모든 임계값(CPU, 메모리, Pod 수)에서 사용량이 20% 미만인 경우 노드는 활용도가 낮은 것으로 간주됩니다.

    모든 임계값(CPU, 메모리, Pod 수)에서 사용량이 50%를 초과하면 노드는 과도하게 사용되는 것으로 간주됩니다.

  • PodLifeTime: 너무 오래된 Pod를 제거합니다.

    기본적으로 24시간이 지난 Pod는 제거됩니다. Pod 수명 값을 사용자 지정할 수 있습니다.

SoftTopologyAndDuplicates

이 프로필은 whenUnsatisfiable: ScheduleAnyway 와 같은 소프트 토폴로지 제약 조건이 있는 Pod를 제외하고 TopologyAndDuplicates 와 동일합니다.

참고

softTopologyAndDuplicates 및 TopologyAndDuplicates 를 모두 활성화하지 마십시오. 이 두 가지 결과를 모두 충돌시킬 수 있습니다.

EvictPodsWithLocalStorage
이 프로필을 사용하면 로컬 스토리지가 있는 Pod를 제거할 수 있습니다.
EvictPodsWithPVC
이 프로필을 사용하면 영구 볼륨 클레임이 있는 Pod를 제거할 수 있습니다.

4.9.3. Descheduler 설치

Descheduler는 기본적으로 사용할 수 없습니다. Descheduler를 활성화하려면 OperatorHub에서 Kube Descheduler Operator를 설치하고 Descheduler 프로필을 한 개 이상 활성화해야 합니다.

기본적으로 Descheduler는 예측 모드에서 실행되므로 Pod 제거만 시뮬레이션합니다. Descheduler가 Pod 제거를 수행할 수 있도록 모드를 자동으로 변경해야 합니다.

중요

클러스터에서 호스트된 컨트롤 플레인을 활성화한 경우 사용자 정의 우선순위 임계값을 설정하여 호스트된 컨트롤 플레인 네임스페이스의 Pod가 제거될 가능성을 낮춥니다. 호스팅된 컨트롤 플레인 우선 순위 클래스 클래스의 가장 낮은 우선 순위 값(100000000)이 있으므로 우선순위 임계값 클래스 이름을 hypershift-control-plane 으로 설정합니다.

사전 요구 사항

  • 클러스터 관리자 권한이 있어야 합니다.
  • OpenShift Container Platform 웹 콘솔에 액세스합니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에 로그인합니다.
  2. Kube Descheduler Operator에 필요한 네임스페이스를 생성합니다.

    1. 관리네임스페이스로 이동하여 네임스페이스 생성을 클릭합니다.
    2. 이름 필드에 openshift-kube-descheduler-operator 를 입력하고 Labels 필드에 openshift.io/cluster-monitoring=true 를 입력하여 Descheduler 메트릭을 활성화한 다음 생성을 클릭합니다.
  3. Kube Descheduler Operator를 설치합니다.

    1. OperatorsOperatorHub로 이동합니다.
    2. 필터 박스에 Kube Descheduler Operator를 입력합니다.
    3. Kube Descheduler Operator를 선택하고 설치를 클릭합니다.
    4. Operator 설치 페이지에서 클러스터의 특정 네임스페이스를 선택합니다. 드롭다운 메뉴에서 openshift-kube-descheduler-operator를 선택합니다.
    5. 업데이트 채널승인 전략 값을 원하는 값으로 조정합니다.
    6. 설치를 클릭합니다.
  4. Descheduler 인스턴스를 생성합니다.

    1. Operator설치된 Operator 페이지에서 Kube Descheduler Operator를 클릭합니다.
    2. Kube Descheduler 탭을 선택하고 KubeDescheduler 생성을 클릭합니다.
    3. 필요에 따라 설정을 편집합니다.

      1. 제거를 시뮬레이션하는 대신 Pod를 제거하려면 Mode 필드를 자동으로 변경합니다.
      2. 프로필 섹션을 확장하여 활성화할 하나 이상의 프로필을 선택합니다. AffinityAndTaints 프로필은 기본적으로 활성화되어 있습니다. 프로필 추가 를 클릭하여 추가 프로필을 선택합니다.

        참고

        TopologyAndDuplicatessoftTopologyAndDuplicates 둘 다 활성화하지 마십시오. 이 두 가지 결과를 모두 충돌시킬 수 있습니다.

      3. 선택 사항: 프로필 사용자 지정 섹션을 확장하여 Descheduler에 대한 선택적 구성을 설정합니다.

        • LifecycleAndUtilization 프로필에 사용자 정의 Pod 수명 값을 설정합니다. podLifetime 필드를 사용하여 숫자 값과 유효한 단위(s,m 또는 h)를 설정합니다. 기본 Pod 수명은 24시간(24시간)입니다.
        • 우선순위가 지정된 우선순위 수준보다 낮은 경우에만 Pod를 제거하도록 사용자 정의 우선순위 임계값을 설정합니다. thresholdPriority 필드를 사용하여 숫자 우선순위 임계값을 설정하거나 thresholdPriorityClassName 필드를 사용하여 특정 우선순위 클래스 이름을 지정합니다.

          참고

          Descheduler에 thresholdPrioritythresholdPriorityClassName 을 모두 지정하지 마십시오.

        • Descheduler 작업에서 제외하거나 포함할 특정 네임스페이스를 설정합니다. 네임스페이스 필드를 확장하고 제외 되거나 포함된 목록에 네임스페이스를 추가합니다. 제외할 네임스페이스 목록 또는 포함할 네임스페이스 목록만 설정할 수 있습니다. 보호된 네임스페이스(openshift-*, kube-system,hypershift)는 기본적으로 제외됩니다.

          중요

          LowNodeUtilization 전략에서는 네임스페이스 제외를 지원하지 않습니다. LowNodeUtilization 전략을 활성화하는 LifecycleAndUtilization 프로필이 설정된 경우 보호된 네임스페이스도 제외되지 않습니다. LowNodeUtilization 전략이 활성화된 동안 보호된 네임스페이스에서 제거를 방지하려면 우선순위 클래스 이름을 system-cluster-critical 또는 system-node-critical 로 설정합니다.

        • 실험적: LowNodeUtilization 전략의 하위 사용률 및 과다 사용률에 대한 임계값을 설정합니다. devLowNodeUtilizationThresholds 필드를 사용하여 다음 값 중 하나를 설정합니다.

          • 낮음: 10%가 낮은 사용량 및 30%의 활용도
          • 중간: 20%가 사용되고 50%의 활용도가 높은(기본값)
          • 높음: 40% 이상 사용되지 않고 70%가 높은 사용
          참고

          이 설정은 실험적이므로 프로덕션 환경에서 사용해서는 안 됩니다.

      4. 선택 사항: 일정 변경 간격 필드를 사용하여 Descheduler 실행 사이의 초 수를 변경합니다. 기본값은 3600 초입니다.
    4. 생성을 클릭합니다.

나중에 OpenShift CLI(oc)를 사용하여 Descheduler의 프로필 및 설정을 구성할 수도 있습니다. 웹 콘솔에서 Descheduler 인스턴스를 생성할 때 프로필을 조정하지 않은 경우 기본적으로 AffinityAndTaints 프로필이 활성화됩니다.

4.9.4. Descheduler 프로필 구성

Descheduler에서 Pod를 제거하는 데 사용하는 프로필을 구성할 수 있습니다.

사전 요구 사항

  • 클러스터 관리자 권한

프로세스

  1. KubeDescheduler 오브젝트를 편집합니다.

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. spec.profiles 섹션에 하나 이상의 프로필을 지정합니다.

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600
      logLevel: Normal
      managementState: Managed
      operatorLogLevel: Normal
      mode: Predictive                                     1
      profileCustomizations:
        namespaces:                                        2
          excluded:
          - my-namespace
        podLifetime: 48h                                   3
        thresholdPriorityClassName: my-priority-class-name 4
      profiles:                                            5
      - AffinityAndTaints
      - TopologyAndDuplicates                              6
      - LifecycleAndUtilization
      - EvictPodsWithLocalStorage
      - EvictPodsWithPVC
    1
    선택사항: 기본적으로 Descheduler는 Pod를 제거하지 않습니다. Pod를 제거하려면 modeAutomatic 으로 설정합니다.
    2
    선택 사항: Descheduler 작업에서 포함하거나 제외하도록 사용자 생성 네임스페이스 목록을 설정합니다. excluded 를 사용하여 제외하거나 포함할 네임스페이스 목록을 설정하려면 excluded를 사용합니다. 보호된 네임스페이스(openshift-*, kube-system,hypershift)는 기본적으로 제외됩니다.
    중요

    LowNodeUtilization 전략에서는 네임스페이스 제외를 지원하지 않습니다. LowNodeUtilization 전략을 활성화하는 LifecycleAndUtilization 프로필이 설정된 경우 보호된 네임스페이스도 제외되지 않습니다. LowNodeUtilization 전략이 활성화된 동안 보호된 네임스페이스에서 제거를 방지하려면 우선순위 클래스 이름을 system-cluster-critical 또는 system-node-critical 로 설정합니다.

    3
    선택 사항: LifecycleAndUtilization 프로필에 대한 사용자 정의 Pod 수명 값을 활성화합니다. 유효한 단위는 s,m 또는 h 입니다. 기본 Pod 수명은 24시간입니다.
    4
    선택 사항: 우선순위가 지정된 수준보다 낮은 경우에만 제거할 Pod를 고려하도록 우선순위 임계값을 지정합니다. thresholdPriority 필드를 사용하여 숫자 우선 순위 임계값(예: 10000)을 설정하거나 thresholdPriorityClassName 필드를 사용하여 특정 우선순위 클래스 이름(예: my-priority-class-name)을 지정합니다. 우선순위 클래스 이름을 지정하는 경우 이미 있어야 합니다. 그렇지 않으면 Descheduler에서 오류가 발생합니다. thresholdPrioritythresholdPriorityClassName 을 모두 설정하지 마십시오.
    5
    활성화할 프로필을 하나 이상 추가합니다. 사용 가능한 프로필: AffinityAndTaints,TopologyAndDuplicates,LifecycleAndUtilization,softTopologyAndDuplicates,EvictPodsWithLocalStorage, EvictPodsWithPVC.
    6
    TopologyAndDuplicatessoftTopologyAndDuplicates 둘 다 활성화하지 마십시오. 이 두 가지 결과를 모두 충돌시킬 수 있습니다.

    여러 프로필을 활성화할 수 있으며 프로필을 지정하는 순서는 중요하지 않습니다.

  3. 파일을 저장하여 변경 사항을 적용합니다.

4.9.5. Descheduler 간격 구성

Descheduler 실행 간격을 구성할 수 있습니다. 기본값은 3600초(1시간)입니다.

사전 요구 사항

  • 클러스터 관리자 권한

프로세스

  1. KubeDescheduler 오브젝트를 편집합니다.

    $ oc edit kubedeschedulers.operator.openshift.io cluster -n openshift-kube-descheduler-operator
  2. deschedulingIntervalSeconds 필드를 원하는 값으로 업데이트합니다.

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600 1
    ...
    1
    Descheduler 실행 간격을 초 단위로 설정합니다. 이 필드 값이 0이면 Descheduler가 한 번 실행되고 종료됩니다.
  3. 파일을 저장하여 변경 사항을 적용합니다.

4.9.6. Descheduler 설치 제거

Descheduler 인스턴스를 제거하고 Kube Descheduler Operator를 설치 제거하여 클러스터에서 Descheduler를 제거할 수 있습니다. 이 프로세스는 KubeDescheduler CRD 및 openshift-kube-descheduler-operator 네임스페이스도 정리합니다.

사전 요구 사항

  • 클러스터 관리자 권한이 있어야 합니다.
  • OpenShift Container Platform 웹 콘솔에 액세스합니다.

프로세스

  1. OpenShift Container Platform 웹 콘솔에 로그인합니다.
  2. Descheduler 인스턴스를 삭제합니다.

    1. Operator설치된 Operator 페이지에서 Kube Descheduler Operator를 클릭합니다.
    2. Kube Descheduler 탭을 선택합니다.
    3. 클러스터 항목 옆에 있는 옵션 메뉴 kebab 를 클릭하고 KubeDescheduler 삭제 를 선택합니다.
    4. 확인 대화 상자에서 삭제를 클릭합니다.
  3. Kube Descheduler Operator를 설치 제거합니다.

    1. Operators설치된 Operator로 이동합니다.
    2. Kube Descheduler Operator 옆에 있는 옵션 메뉴 kebab 를 클릭하고 Operator 설치 제거를 선택합니다.
    3. 확인 대화 상자에서 설치 제거를 클릭합니다.
  4. openshift-kube-descheduler-operator 네임스페이스를 삭제합니다.

    1. 관리네임스페이스로 이동합니다.
    2. 필터 박스에 openshift-kube-descheduler-operator를 입력합니다.
    3. openshift-kube-descheduler-operator 항목 옆에 있는 옵션 메뉴 kebab 를 클릭하고 네임스페이스 삭제 를 선택합니다.
    4. 확인 대화 상자에서 openshift-kube-descheduler-operator를 입력하고 삭제를 클릭합니다.
  5. KubeDescheduler CRD를 삭제합니다.

    1. AdministrationCustom Resource Definitions로 이동합니다.
    2. 필터 박스에 KubeDescheduler를 입력합니다.
    3. KubeDescheduler 항목 옆에 있는 옵션 메뉴 kebab 를 클릭하고 CustomResourceDefinition 삭제 를 선택합니다.
    4. 확인 대화 상자에서 삭제를 클릭합니다.