6.2. 노드 작업


관리자는 여러 작업을 수행하여 클러스터의 효율성을 높일 수 있습니다.

6.2.1. 노드에서 Pod를 비우는 방법 이해

Pod를 비우면 하나 이상의 지정된 노드에서 모든 Pod 또는 선택한 Pod를 마이그레이션할 수 있습니다.

복제 컨트롤러에서 지원하는 Pod만 비울 수 있습니다. 복제 컨트롤러는 다른 노드에서 새 Pod를 생성하고 지정된 노드에서 기존 Pod를 제거합니다.

복제 컨트롤러에서 지원하지 않는 베어 Pod는 기본적으로 영향을 받지 않습니다. Pod 선택기를 지정하여 Pod의 하위 집합을 비울 수 있습니다. Pod 선택기는 라벨을 기반으로 하므로 라벨이 지정된 Pod를 모두 비웁니다.

프로세스

  1. Pod 비우기를 수행하기 전에 노드를 예약 불가능으로 표시합니다.

    1. 노드를 예약 불가능으로 표시합니다.

      $ oc adm cordon <node1>

      출력 예

      node/<node1> cordoned

    2. 노드 상태가 Ready,SchedulingDisabled 인지 확인합니다.

      $ oc get node <node1>

      출력 예

      NAME        STATUS                     ROLES     AGE       VERSION
      <node1>     Ready,SchedulingDisabled   worker    1d        v1.25.0

  2. 다음 메서드 중 하나를 사용하여 Pod를 비웁니다.

    • 하나 이상의 노드에 있는 모든 Pod 또는 선택한 Pod를 비웁니다.

      $ oc adm drain <node1> <node2> [--pod-selector=<pod_selector>]
    • --force 옵션을 사용하여 베어 Pod를 강제 삭제합니다. true로 설정하면 복제 컨트롤러, 복제본 세트, 작업, 데몬 세트 또는 상태 저장 세트에서 관리하지 않는 Pod가 있는 경우에도 계속 삭제합니다.

      $ oc adm drain <node1> <node2> --force=true
    • 각 Pod가 정상적으로 종료되는 시간(초)을 설정하고 --grace-period 를 사용합니다. 음수인 경우 Pod에 지정된 기본값이 사용됩니다.

      $ oc adm drain <node1> <node2> --grace-period=-1
    • true로 설정된 --ignore-daemonsets 플래그를 사용하여 데몬 세트에서 관리하는 Pod를 무시합니다.

      $ oc adm drain <node1> <node2> --ignore-daemonsets=true
    • --timeout 플래그를 사용하여 종료하기 전에 대기하는 시간을 설정합니다. 값이 0이면 시간이 제한되지 않습니다.

      $ oc adm drain <node1> <node2> --timeout=5s
    • --delete-emptydir-data 플래그를 true 로 설정하여 emptyDir 볼륨을 사용하는 Pod가 있는 경우에도 Pod를 삭제합니다. 노드가 드레이닝되면 로컬 데이터가 삭제됩니다.

      $ oc adm drain <node1> <node2> --delete-emptydir-data=true
    • --dry-run 옵션을 true로 설정하여 실제로 비우기를 수행하지 않고 마이그레이션할 오브젝트를 나열합니다.

      $ oc adm drain <node1> <node2>  --dry-run=true

      특정 노드 이름(예: <node1> <node2>)을 지정하는 대신 --selector=<node_selector> 옵션을 사용하여 선택한 노드에서 Pod를 비울 수 있습니다.

  3. 완료되면 노드를 예약 가능으로 표시합니다.

    $ oc adm uncordon <node1>

6.2.2. 노드에서 라벨을 업데이트하는 방법 이해

노드에서 임의의 라벨을 업데이트할 수 있습니다.

머신에서 노드를 백업해도 노드를 삭제하면 노드 라벨이 유지되지 않습니다.

참고

MachineSet 오브젝트의 변경 사항은 컴퓨팅 머신 세트가 소유한 기존 머신에는 적용되지 않습니다. 예를 들어 기존 MachineSet 오브젝트에서 편집 또는 추가된 레이블은 컴퓨팅 머신 세트와 연결된 기존 머신 및 노드로 전달되지 않습니다.

  • 다음 명령은 노드에서 라벨을 추가하거나 업데이트합니다.

    $ oc label node <node> <key_1>=<value_1> ... <key_n>=<value_n>

    예를 들면 다음과 같습니다.

    $ oc label nodes webconsole-7f7f6 unhealthy=true
    작은 정보

    다음 YAML을 적용하여 레이블을 적용할 수도 있습니다.

    kind: Node
    apiVersion: v1
    metadata:
      name: webconsole-7f7f6
      labels:
        unhealthy: 'true'
    #...
  • 다음 명령은 네임스페이스의 모든 Pod를 업데이트합니다.

    $ oc label pods --all <key_1>=<value_1>

    예를 들면 다음과 같습니다.

    $ oc label pods --all status=unhealthy

6.2.3. 노드를 예약 가능 또는 예약 불가능으로 표시하는 방법 이해

기본적으로 Ready 상태의 정상 노드는 예약 가능으로 표시됩니다. 즉 노드에 새 Pod를 배치할 수 있습니다. 수동으로 노드를 예약 불가로 표시하면 새 Pod가 노드에 예약되지 않도록 차단됩니다. 노드의 기존 Pod에는 영향을 미치지 않습니다.

  • 다음 명령은 하나 이상의 노드를 예약 불가로 표시합니다.

    출력 예

    $ oc adm cordon <node>

    예를 들면 다음과 같습니다.

    $ oc adm cordon node1.example.com

    출력 예

    node/node1.example.com cordoned
    
    NAME                 LABELS                                        STATUS
    node1.example.com    kubernetes.io/hostname=node1.example.com      Ready,SchedulingDisabled

  • 다음 명령은 현재 예약할 수 없는 하나 이상의 노드를 예약 가능으로 표시합니다.

    $ oc adm uncordon <node1>

    또는 특정 노드 이름(예: <node>)을 지정하는 대신 --selector=<node_selector> 옵션을 사용하여 선택한 노드를 예약 가능 또는 예약 불가로 표시할 수 있습니다.

6.2.4. 애플리케이션 Pod를 드레이닝하지 않고 노드가 재부팅될 때 단일 노드 OpenShift 클러스터에서 오류 처리

단일 노드 OpenShift 클러스터 및 일반적으로 OpenShift Container Platform 클러스터에서는 먼저 노드를 드레이닝하지 않고 노드 재부팅이 발생하는 상황이 발생할 수 있습니다. 이는 UnexpectedAdmissionError 오류로 장치를 요청하는 애플리케이션 Pod가 실패하는 경우가 발생할 수 있습니다. 이러한 장치를 제공해야 하는 애플리케이션 Pod가 시작되므로 배포,ReplicaSet 또는 DaemonSet 오류가 보고됩니다. Pod 재시작 순서를 제어할 수 없습니다.

이 동작이 예상되지만 배포에 실패한 경우에도 Pod가 클러스터에 남아 있을 수 있습니다. Pod는 UnexpectedAdmissionError 를 계속 보고합니다. 이 문제는 애플리케이션 Pod가 일반적으로 Deployment,ReplicaSet 또는 DaemonSet 에 포함되어 있다는 사실에 의해 완화됩니다. Pod가 이 오류 상태에 있는 경우 다른 인스턴스를 실행해야 하므로 문제가 거의 없습니다. Deployment,ReplicaSet 또는 DaemonSet 에 속하는 경우 후속 Pod를 성공적으로 생성 및 실행하고 애플리케이션을 성공적으로 배포할 수 있습니다.

이러한 Pod가 정상적으로 종료되도록 작업 업스트림이 진행 중입니다. 작업이 해결될 때까지 단일 노드 OpenShift 클러스터에 대해 다음 명령을 실행하여 실패한 포드를 제거합니다.

$ oc delete pods --field-selector status.phase=Failed -n <POD_NAMESPACE>
참고

단일 노드 OpenShift 클러스터에서 노드를 드레이닝하는 옵션을 사용할 수 없습니다.

6.2.5. 노드 삭제

6.2.5.1. 클러스터에서 노드 삭제

OpenShift Container Platform 클러스터에서 노드를 삭제하려면 적절한 MachineSet 오브젝트를 축소합니다.

중요

클러스터가 클라우드 공급자와 통합되면 해당 시스템을 삭제하여 노드를 삭제해야 합니다. 이 작업에 oc delete node 명령을 사용하지 마십시오.

CLI를 사용하여 노드를 삭제하면 Kubernetes에서 노드 오브젝트가 삭제되지만 노드에 존재하는 Pod는 삭제되지 않습니다. 복제 컨트롤러에서 지원하지 않는 모든 베어 Pod는 OpenShift Container Platform에서 액세스할 수 없습니다. 복제 컨트롤러에서 지원하는 Pod는 사용 가능한 다른 노드로 다시 예약됩니다. 로컬 매니페스트 Pod를 삭제해야 합니다.

참고

베어 메탈에서 클러스터를 실행 중인 경우 MachineSet 오브젝트를 편집하여 노드를 삭제할 수 없습니다. 컴퓨팅 머신 세트는 클러스터가 클라우드 공급자와 통합된 경우에만 사용할 수 있습니다. 대신 수동으로 삭제하기 전에 스케줄 예약을 취소하고 노드를 드레이닝해야 합니다.

프로세스

  1. 다음 명령을 실행하여 클러스터에 있는 컴퓨팅 머신 세트를 확인합니다.

    $ oc get machinesets -n openshift-machine-api

    컴퓨팅 머신 세트는 < cluster-id>-worker-<aws-region-az> 형식으로 나열됩니다.

  2. 다음 방법 중 하나를 사용하여 컴퓨팅 머신 세트를 축소합니다.

    • 다음 명령을 실행하여 축소할 복제본 수를 지정합니다.

      $ oc scale --replicas=2 machineset <machine-set-name> -n openshift-machine-api
    • 다음 명령을 실행하여 컴퓨팅 머신 세트 사용자 정의 리소스를 편집합니다.

      $ oc edit machineset <machine-set-name> -n openshift-machine-api

      출력 예

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        # ...
        name: <machine-set-name>
        namespace: openshift-machine-api
        # ...
      spec:
        replicas: 2 1
        # ...

      1
      축소할 복제본 수를 지정합니다.

6.2.5.2. 베어 메탈 클러스터에서 노드 삭제

CLI를 사용하여 노드를 삭제하면 Kubernetes에서 노드 오브젝트가 삭제되지만 노드에 존재하는 Pod는 삭제되지 않습니다. 복제 컨트롤러에서 지원하지 않는 기본 Pod는 OpenShift Container Platform에 액세스할 수 없습니다. 복제 컨트롤러에서 지원하는 Pod는 사용 가능한 다른 노드로 다시 예약됩니다. 로컬 매니페스트 Pod를 삭제해야 합니다.

절차

다음 단계를 완료하여 베어 메탈에서 실행 중인 OpenShift Container Platform 클러스터에서 노드를 삭제합니다.

  1. 노드를 예약 불가능으로 표시합니다.

    $ oc adm cordon <node_name>
  2. 노드의 모든 Pod를 드레이닝합니다.

    $ oc adm drain <node_name> --force=true

    노드가 오프라인 상태이거나 응답하지 않는 경우 이 단계가 실패할 수 있습니다. 노드가 응답하지 않더라도 공유 스토리지에 쓰는 워크로드를 계속 실행되고 있을 수 있습니다. 데이터 손상을 방지하려면 계속하기 전에 물리적 하드웨어의 전원을 끕니다.

  3. 클러스터에서 노드를 삭제합니다.

    $ oc delete node <node_name>

    노드 오브젝트가 클러스터에서 삭제되어도 재부팅 후 또는 kubelet 서비스가 재시작되면 클러스터에 다시 참여할 수 있습니다. 노드와 노드의 모든 데이터를 영구적으로 삭제하려면 노드를 해제해야 합니다.

  4. 물리 하드웨어의 전원을 끈 경우 노드가 클러스터에 다시 참여할 수 있도록 해당 하드웨어를 다시 켭니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.