6.2. 노드 작업
관리자는 여러 작업을 수행하여 클러스터의 효율성을 높일 수 있습니다.
6.2.1. 노드에서 Pod를 비우는 방법 이해
Pod를 비우면 하나 이상의 지정된 노드에서 모든 Pod 또는 선택한 Pod를 마이그레이션할 수 있습니다.
복제 컨트롤러에서 지원하는 Pod만 비울 수 있습니다. 복제 컨트롤러는 다른 노드에서 새 Pod를 생성하고 지정된 노드에서 기존 Pod를 제거합니다.
복제 컨트롤러에서 지원하지 않는 베어 Pod는 기본적으로 영향을 받지 않습니다. Pod 선택기를 지정하여 Pod의 하위 집합을 비울 수 있습니다. Pod 선택기는 라벨을 기반으로 하므로 라벨이 지정된 Pod를 모두 비웁니다.
프로세스
Pod 비우기를 수행하기 전에 노드를 예약 불가능으로 표시합니다.
노드를 예약 불가능으로 표시합니다.
$ oc adm cordon <node1>
출력 예
node/<node1> cordoned
노드 상태가
Ready,SchedulingDisabled
:인지 확인합니다.$ oc get node <node1>
출력 예
NAME STATUS ROLES AGE VERSION <node1> Ready,SchedulingDisabled worker 1d v1.28.5
다음 메서드 중 하나를 사용하여 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를 비울 수 있습니다.
완료되면 노드를 예약 가능으로 표시합니다.
$ 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
오브젝트를 편집하여 노드를 삭제할 수 없습니다. 컴퓨팅 머신 세트는 클러스터가 클라우드 공급자와 통합된 경우에만 사용할 수 있습니다. 대신 수동으로 삭제하기 전에 스케줄 예약을 취소하고 노드를 드레이닝해야 합니다.
프로세스
다음 명령을 실행하여 클러스터에 있는 컴퓨팅 머신 세트를 확인합니다.
$ oc get machinesets -n openshift-machine-api
컴퓨팅 머신 세트는 <
cluster-id>-worker-<aws-region-az> 형식으로 나열됩니다
.다음 방법 중 하나를 사용하여 컴퓨팅 머신 세트를 축소합니다.
다음 명령을 실행하여 축소할 복제본 수를 지정합니다.
$ 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 클러스터에서 노드를 삭제합니다.
노드를 예약 불가능으로 표시합니다.
$ oc adm cordon <node_name>
노드의 모든 Pod를 드레이닝합니다.
$ oc adm drain <node_name> --force=true
노드가 오프라인 상태이거나 응답하지 않는 경우 이 단계가 실패할 수 있습니다. 노드가 응답하지 않더라도 공유 스토리지에 쓰는 워크로드를 계속 실행되고 있을 수 있습니다. 데이터 손상을 방지하려면 계속하기 전에 물리적 하드웨어의 전원을 끕니다.
클러스터에서 노드를 삭제합니다.
$ oc delete node <node_name>
노드 오브젝트가 클러스터에서 삭제되어도 재부팅 후 또는 kubelet 서비스가 재시작되면 클러스터에 다시 참여할 수 있습니다. 노드와 노드의 모든 데이터를 영구적으로 삭제하려면 노드를 해제해야 합니다.
- 물리 하드웨어의 전원을 끈 경우 노드가 클러스터에 다시 참여할 수 있도록 해당 하드웨어를 다시 켭니다.