8.9. 작업자 대기 시간 프로필을 사용하여 대기 시간이 긴 환경에서 클러스터 안정성 개선
모든 노드는 기본적으로 10초마다 OpenShift Container Platform 클러스터의 Kubernetes Controller Manager Operator(kube 컨트롤러)로 하트비트를 보냅니다. 클러스터에서 노드의 하트비트를 수신하지 않는 경우 OpenShift Container Platform은 여러 기본 메커니즘을 사용하여 응답합니다.
예를 들어 Kubernetes Controller Manager Operator가 구성된 기간이 지난 후 노드와의 연결이 끊어지면 다음과 같습니다.
-
컨트롤 플레인의 노드 컨트롤러에서 노드 상태를
Unhealthy로 업데이트하고 노드Ready조건을Unknown으로 표시합니다. - 스케줄러는 이에 대한 응답으로 해당 노드에 대한 Pod 예약을 중지합니다.
-
온프레미스 노드 컨트롤러는
NoExecute효과가 있는node.kubernetes.io/unreachable테인트를 노드에 추가하고 기본적으로 5분 후에 노드에 Pod를 제거합니다.
이 동작으로 인해 특히 네트워크 엣지에 노드가 있는 경우 특히 네트워크가 대기 시간이 되는 경우 문제가 발생할 수 있습니다. 경우에 따라 Kubernetes Controller Manager Operator가 네트워크 대기 시간으로 인해 정상 노드에서 업데이트를 수신하지 못할 수 있습니다. 그런 다음 Kubernetes Controller Manager Operator는 노드가 정상인 경우에도 노드에서 Pod를 제거합니다. 이 문제를 방지하려면 작업자 대기 시간 프로필을 사용하여 kubelet 및 Kubernetes Controller Manager Operator가 조치를 수행하기 전에 상태 업데이트를 대기하는 빈도를 조정할 수 있습니다. 이러한 조정을 통해 컨트롤 플레인과 작업자 노드 간의 네트워크 대기 시간이 최적이 아닌 경우 클러스터가 올바르게 실행되도록 할 수 있습니다.
이러한 작업자 대기 시간 프로필은 최상의 값을 수동으로 결정할 필요 없이 클러스터의 반응 문제를 제어할 수 있도록 신중하게 조정된 값으로 미리 정의된 세 가지 매개변수 집합입니다.
클러스터를 설치하거나 클러스터 네트워크에서 대기 시간이 늘어남에 따라 작업자 대기 시간을 구성할 수 있습니다.
8.9.1. 작업자 대기 시간 프로필 이해
작업자 대기 시간 프로필은 node-status-update-frequency,node-monitor-grace-period,default-not-ready-toleration-seconds 매개변수에 대한 여러 신중하게 조정된 값 세트입니다. 이러한 매개변수를 사용하면 최상의 값을 수동으로 결정할 필요 없이 대기 시간 문제에 대한 클러스터의 대응을 제어할 수 있습니다.
모든 작업자 대기 시간 프로필은 다음 매개변수를 구성합니다.
-
node-status-update-frequency. kubelet이 Kubernetes Controller Manager Operator로 상태를 업데이트하는 시간(초)을 지정합니다. -
node-monitor-grace-period. 노드 비정상적으로 표시하고node.kubernetes.io/not-ready또는node.kubernetes.io/unreachable테인트를 노드에 추가하기 전에 Kubernetes Controller Manager Operator가 kubelet에서 업데이트를 대기하는 시간(초)을 지정합니다. -
default-not-ready-toleration-secondsKubernetes Controller Manager Operator가 해당 노드에서 Pod를 제거하기 전에 대기하는 노드 비정상적으로 표시된 후 시간(초)을 지정합니다. -
default-unreachable-toleration-secondsKubernetes Controller Manager Operator가 해당 노드에서 Pod를 제거하기 전에 대기할 수 없는 노드에 연결할 수 없는 후 시간(초)을 지정합니다.
node-monitor-grace-period 매개변수를 수동으로 수정하는 것은 지원되지 않습니다.
다음 Operator는 작업자 대기 시간 프로필에 대한 변경 사항을 모니터링하고 그에 따라 응답합니다.
-
MCO(Machine Config Operator)는 작업자 노드에서
node-status-update-frequency매개변수를 업데이트합니다. -
Kubernetes Controller Manager Operator는 컨트롤 플레인 노드에서
node-monitor-grace-period매개변수를 업데이트합니다. -
Kubernetes API Server Operator는 컨트롤 계획 노드에서
default-not-ready-toleration-seconds및default-unreachable-toleration-seconds매개변수를 업데이트합니다.
대부분의 경우 기본 구성이 작동하지만 OpenShift Container Platform은 네트워크에 일반적인 것보다 대기 시간이 더 많은 상황에 대해 두 개의 다른 작업자 대기 시간 프로필을 제공합니다. 3개의 작업자 대기 시간 프로파일이 다음 섹션에 설명되어 있습니다.
- 기본 작업자 대기 시간 프로필
Default프로필을 사용하면 각 kubelet에서 10초마다 Kubelet Controller Manager Operator(kube 컨트롤러)에 노드 상태를 보고합니다. Kubelet Controller Manager Operator는 kubelet에서 5초마다 상태를 확인합니다.Kubernetes Controller Manager Operator는 노드의 비정상을 고려하기 전에 상태 업데이트를 40초 동안 기다립니다.
node.kubernetes.io/not-ready또는node.kubernetes.io/unreachable테인트로 노드를 표시하고 해당 노드의 Pod를 제거합니다. 해당 노드의 Pod에NoExecute허용 오차가 있는 경우 Pod가 300초 내에 제거됩니다. Pod에tolerationSeconds매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.프로필 구성 요소 매개변수 현재의 Default
kubelet
node-status-update-frequency10s
kubelet Controller Manager
node-monitor-grace-period40s
Kubernetes API 서버
default-not-ready-toleration-seconds300s
Kubernetes API 서버
default-unreachable-toleration-seconds300s
- 중간 수준의 작업자 대기 시간 프로필
네트워크 대기 시간이 보통보다 약간 높은 경우
MediumUpdateAverageReaction프로필을 사용합니다.MediumUpdateAverageReaction프로필을 사용하면 kubelet 업데이트 빈도를 20초로 줄이고 Kubernetes Controller Manager Operator에서 해당 업데이트를 2분으로 대기하는 기간을 변경합니다. 해당 노드의 Pod의 Pod 제거 기간은 60초로 단축됩니다. Pod에tolerationSeconds매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.Kubernetes Controller Manager Operator는 노드 비정상적으로 간주될 때까지 2분 동안 기다립니다. 잠시 후 제거 프로세스가 시작됩니다.
프로필 구성 요소 매개변수 현재의 MediumUpdateAverageReaction
kubelet
node-status-update-frequency20s
kubelet Controller Manager
node-monitor-grace-period2m
Kubernetes API 서버
default-not-ready-toleration-seconds60s
Kubernetes API 서버
default-unreachable-toleration-seconds60s
- 짧은 작업자 대기 시간 프로필
네트워크 대기 시간이 매우 높은 경우
LowUpdateSlowReaction프로필을 사용합니다.LowUpdateSlowReaction프로필을 사용하면 kubelet 업데이트 빈도를 1분으로 줄이고 Kubernetes Controller Manager Operator에서 해당 업데이트를 5분으로 대기하는 기간을 변경합니다. 해당 노드의 Pod의 Pod 제거 기간은 60초로 단축됩니다. Pod에tolerationSeconds매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.Kubernetes Controller Manager Operator는 노드 비정상적으로 간주하기 위해 5분 정도 기다립니다. 잠시 후 제거 프로세스가 시작됩니다.
프로필 구성 요소 매개변수 현재의 LowUpdateSlowReaction
kubelet
node-status-update-frequency1m
kubelet Controller Manager
node-monitor-grace-period5m
Kubernetes API 서버
default-not-ready-toleration-seconds60s
Kubernetes API 서버
default-unreachable-toleration-seconds60s
8.9.2. 작업자 대기 시간 프로필 사용
네트워크 대기 시간을 처리하기 위해 작업자 대기 시간 프로필을 구현하려면 node.config 오브젝트를 편집하여 프로필 이름을 추가합니다. 대기 시간이 증가하거나 감소하면 언제든지 프로필을 변경할 수 있습니다.
한 번에 하나의 작업자 대기 시간 프로필을 이동해야 합니다. 예를 들어 Default 프로필에서 LowUpdateSlowReaction 작업자 대기 시간 프로필로 직접 이동할 수 없습니다. 기본 작업자 대기 시간 프로필에서 먼저 MediumUpdateAverageReaction 프로필로 이동한 다음 LowUpdateSlowReaction 으로 이동해야 합니다. 마찬가지로 기본 프로필로 돌아갈 때 low 프로필에서 먼저 중간 프로필로 이동한 다음 기본값으로 이동해야 합니다.
OpenShift Container Platform 클러스터를 설치할 때 작업자 대기 시간 프로필을 구성할 수도 있습니다.
프로세스
기본 작업자 대기 시간 프로필에서 이동하려면 다음을 수행합니다.
중간 작업자 대기 시간 프로필로 이동합니다.
node.config오브젝트를 편집합니다.$ oc edit nodes.config/cluster
spec.workerLatencyProfile: mediumUpdateAverageReaction을 추가합니다.node.config오브젝트의 예apiVersion: config.openshift.io/v1 kind: Node metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2022-07-08T16:02:51Z" generation: 1 name: cluster ownerReferences: - apiVersion: config.openshift.io/v1 kind: ClusterVersion name: version uid: 36282574-bf9f-409e-a6cd-3032939293eb resourceVersion: "1865" uid: 0c0f7a4c-4307-4187-b591-6155695ac85b spec: workerLatencyProfile: MediumUpdateAverageReaction 1 # ...- 1
- 중간 작업자 대기 시간 정책을 지정합니다.
변경 사항이 적용됨에 따라 각 작업자 노드의 스케줄링이 비활성화됩니다.
선택 사항: 짧은 작업자 대기 시간 프로필로 이동합니다.
node.config오브젝트를 편집합니다.$ oc edit nodes.config/cluster
spec.workerLatencyProfile값을LowUpdateSlowReaction으로 변경합니다.node.config오브젝트의 예apiVersion: config.openshift.io/v1 kind: Node metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2022-07-08T16:02:51Z" generation: 1 name: cluster ownerReferences: - apiVersion: config.openshift.io/v1 kind: ClusterVersion name: version uid: 36282574-bf9f-409e-a6cd-3032939293eb resourceVersion: "1865" uid: 0c0f7a4c-4307-4187-b591-6155695ac85b spec: workerLatencyProfile: LowUpdateSlowReaction 1 # ...- 1
- 짧은 작업자 대기 시간 정책을 사용하도록 지정합니다.
변경 사항이 적용됨에 따라 각 작업자 노드의 스케줄링이 비활성화됩니다.
검증
모든 노드가
Ready상태로 돌아가면 다음 명령을 사용하여 Kubernetes Controller Manager에서 적용되었는지 확인할 수 있습니다.$ oc get KubeControllerManager -o yaml | grep -i workerlatency -A 5 -B 5
출력 예
# ... - lastTransitionTime: "2022-07-11T19:47:10Z" reason: ProfileUpdated status: "False" type: WorkerLatencyProfileProgressing - lastTransitionTime: "2022-07-11T19:47:10Z" 1 message: all static pod revision(s) have updated latency profile reason: ProfileUpdated status: "True" type: WorkerLatencyProfileComplete - lastTransitionTime: "2022-07-11T19:20:11Z" reason: AsExpected status: "False" type: WorkerLatencyProfileDegraded - lastTransitionTime: "2022-07-11T19:20:36Z" status: "False" # ...- 1
- 프로필이 적용되고 활성화되도록 지정합니다.
낮음 프로필을 중간으로 변경하거나 중간을 낮게 변경하려면 node.config 오브젝트를 편집하고 spec.workerLatencyProfile 매개변수를 적절한 값으로 설정합니다.