6.4. 정상 노드 종료 관리
정상 노드 종료를 사용하면 kubelet에서 노드 종료 중에 Pod의 강제 제거를 지연할 수 있습니다. 정상 노드 종료를 구성할 때 Pod가 종료되기 전에 실행 중인 워크로드를 완료하는 기간을 정의할 수 있습니다. 이 유예 기간은 예기치 않은 노드 종료 이벤트 중 중요한 워크로드 중단을 최소화합니다. 우선순위 클래스를 사용하여 Pod 종료 순서를 지정할 수도 있습니다.
6.4.1. 정상 노드 종료 정보
정상 노드 종료 중에 kubelet은 노드에서 실행 중인 Pod로 종료 신호를 보내고 모든 Pod가 제거될 때까지 노드 종료를 연기합니다. 노드가 예기치 않게 종료되면 정상 노드 종료 기능은 이러한 Pod에서 실행되는 워크로드 중단을 최소화합니다.
정상 노드 종료 중에 kubelet은 다음 두 단계로 Pod를 중지합니다.
- 정기적인 Pod 종료
- 심각한 Pod 종료
KubeletConfig 사용자 정의 리소스에서 다음 사양을 구성하여 일반 및 중요 Pod의 종료 유예 기간을 정의할 수 있습니다.
-
shutdownGracePeriod: 일반 및 중요 Pod의 Pod 종료의 총 기간을 지정합니다. -
shutdownGracePeriodCriticalPods: 중요한 Pod 종료 기간을 지정합니다. 이 값은shutdownGracePeriod값보다 작아야 합니다.
예를 들어 shutdownGracePeriod 값이 30s 이고 shutdownGracePeriodCriticalPods 값이 10s 인 경우 kubelet은 노드 종료를 30초 동안 지연합니다. 종료 중에 첫 20(30-10)초는 일반 Pod를 정상적으로 종료하기 위해 예약되며, 마지막 10초는 중요한 Pod를 정상적으로 종료하기 위해 예약되어 있습니다.
중요 Pod를 정의하려면 2000000000 보다 크거나 같은 Pod 우선순위 값을 할당합니다. 일반 포드를 정의하려면 2000000000 미만의 Pod 우선순위 값을 할당합니다.
Pod의 우선순위 값을 정의하는 방법에 대한 자세한 내용은 추가 리소스 섹션을 참조하십시오.
6.4.2. 정상 노드 종료 구성
정상 노드 종료를 구성하려면 KubeletConfig CR(사용자 정의 리소스)을 생성하여 노드 세트에서 Pod의 종료 유예 기간을 지정합니다. 정상적인 노드 종료 기능은 이러한 Pod에서 실행되는 워크로드 중단을 최소화합니다.
정상 노드 종료를 구성하지 않으면 기본 유예 기간은 0 이고 Pod는 노드에서 강제로 제거됩니다.
사전 요구 사항
-
cluster-admin역할을 사용하여 클러스터에 액세스할 수 있습니다. - 심각 또는 일반 분류가 필요한 Pod에 우선순위 클래스가 정의되어 있습니다.
절차
kubelet-gns.yaml파일에 다음 YAML을 저장하여KubeletConfigCR에서 종료 유예 기간을 정의합니다.apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: graceful-shutdown namespace: openshift-machine-config-operator spec: machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: "" 1 kubeletConfig: shutdownGracePeriod: "3m" 2 shutdownGracePeriodCriticalPods: "2m" 3 #...다음 명령을 실행하여
KubeletConfigCR을 생성합니다.$ oc create -f kubelet-gns.yaml
출력 예
kubeletconfig.machineconfiguration.openshift.io/graceful-shutdown created
검증
노드의 kubelet 로그를 보고 명령줄을 사용하거나
kubelet.conf파일을 확인하여 유예 기간 구성을 확인합니다.참고shutdownGracePeriodRequested및shutdownGracePeriodCriticalPods의 로그 메시지가KubeletConfigCR에 설정된 값과 일치하는지 확인합니다.명령줄을 사용하여 로그를 보려면 다음 명령을 실행하여 <
node_name>을 노드 이름으로 교체합니다.$ oc adm node-logs <node_name> -u kubelet
출력 예
Sep 12 22:13:46 ci-ln-qv5pvzk-72292-xvkd9-worker-a-dmbr4 hyperkube[22317]: I0912 22:13:46.687472 22317 nodeshutdown_manager_linux.go:134] "Creating node shutdown manager" shutdownGracePeriodRequested="3m0s" 1 shutdownGracePeriodCriticalPods="2m0s" shutdownGracePeriodByPodPriority=[ {Priority:0 ShutdownGracePeriodSeconds:1200} {Priority:2000000000 ShutdownGracePeriodSeconds:600}] ...- 1
shutdownGracePeriodRequested및shutdownGracePeriodCriticalPods의 로그 메시지가KubeletConfigCR에 설정된 값과 일치하는지 확인합니다.
노드의
kubelet.conf파일의 로그를 보려면 다음 명령을 실행하여 노드에 디버그 세션을 입력합니다.$ oc debug node/<node_name>
$ chroot /host
$ cat /etc/kubernetes/kubelet.conf
출력 예
#... “memorySwap”: {}, “containerLogMaxSize”: “50Mi”, “logging”: { “flushFrequency”: 0, “verbosity”: 0, “options”: { “json”: { “infoBufferSize”: “0” } } }, “shutdownGracePeriod”: “10m0s”, 1 “shutdownGracePeriodCriticalPods”: “3m0s” } #...- 1
shutdownGracePeriodRequested및shutdownGracePeriodCriticalPods의 로그 메시지가KubeletConfigCR에 설정된 값과 일치하는지 확인합니다.
정상 노드 종료 중에 다음 명령을 실행하고 <pod
_name>을 Pod 이름으로 교체하여 Pod가정상적으로 종료되었는지 확인할 수 있습니다.$ oc describe pod <pod_name>
출력 예
Reason: Terminated Message: Pod was terminated in response to imminent node shutdown.
추가 리소스