5.2. 노드 작업

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

5.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.24.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
    • --grace-period 를 사용하여 각 Pod가 정상적으로 종료되는 시간(초)을 설정합니다. 음수인 경우 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>

5.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

5.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> 옵션을 사용하여 선택한 노드를 예약 가능 또는 예약 불가로 표시할 수 있습니다.

5.2.4. 노드 삭제

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

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

프로세스

OpenShift Container Platform 클러스터에서 노드를 삭제하려면 해당 MachineSet 오브젝트를 편집합니다.

참고

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

  1. 클러스터에 있는 머신 세트를 확인합니다.

    $ oc get machinesets -n openshift-machine-api

    머신 세트는 <clusterid>-worker-<aws-region-az> 형식으로 나열됩니다.

  2. 머신 세트를 스케일링합니다.

    $ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api

    또는 다음을 수행합니다.

    $ oc edit machineset <machineset> -n openshift-machine-api
    작은 정보

    다음 YAML을 적용하여 머신 세트를 확장할 수도 있습니다.

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

    머신 세트를 사용하여 클러스터를 스케일링하는 방법에 대한 자세한 내용은 머신 세트 수동 스케일링을 참조하십시오.

추가 리소스

5.2.4.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. 물리 하드웨어의 전원을 끈 경우 노드가 클러스터에 다시 참여할 수 있도록 해당 하드웨어를 다시 켭니다.