6.4. 작업자 대기 시간 프로필을 사용하여 대기 시간이 긴 환경에서 클러스터 안정성 개선
클러스터 관리자가 플랫폼 확인을 위해 대기 시간 테스트를 수행한 경우 대기 시간이 긴 경우 안정성을 보장하기 위해 클러스터의 작동을 조정해야 할 수 있습니다. 클러스터 관리자는 파일에 기록된 하나의 매개 변수만 변경해야 합니다. 이 매개변수는 감독자 프로세스가 상태를 읽고 클러스터의 상태를 해석하는 방법에 영향을 미치는 매개변수 4개를 제어합니다. 하나의 매개변수만 변경하면 지원 가능한 방식으로 클러스터 튜닝이 제공됩니다.
Kubelet
프로세스는 클러스터 상태를 모니터링하기 위한 시작점을 제공합니다. Kubelet
은 OpenShift Container Platform 클러스터의 모든 노드에 대한 상태 값을 설정합니다. Kubernetes Controller Manager(kube 컨트롤러
)는 기본적으로 10초마다 상태 값을 읽습니다. kube 컨트롤러에서
노드 상태 값을 읽을 수 없는 경우 구성된 기간이 지난 후 해당 노드와의 연결이 끊어집니다. 기본 동작은 다음과 같습니다.
-
컨트롤 플레인의 노드 컨트롤러는 노드 상태를
Unhealthy
로 업데이트하고 노드Ready
조건 'Unknown'을 표시합니다. - 스케줄러는 이에 대한 응답으로 해당 노드에 대한 Pod 예약을 중지합니다.
-
Node Lifecycle Controller는
NoExecute
효과가 있는node.kubernetes.io/unreachable
테인트를 노드에 추가하고 기본적으로 5분 후에 제거하도록 노드에 Pod를 예약합니다.
이 동작으로 인해 특히 네트워크 엣지에 노드가 있는 경우 특히 네트워크가 대기 시간이 되는 경우 문제가 발생할 수 있습니다. 경우에 따라 네트워크 대기 시간으로 인해 Kubernetes 컨트롤러 관리자에서 정상적인 노드에서 업데이트를 수신하지 못할 수 있습니다. Kubelet
은 노드가 정상이지만 노드에서 Pod를 제거합니다.
이 문제를 방지하려면 작업자 대기 시간 프로필을 사용하여 Kubelet
및 Kubernetes 컨트롤러 관리자가 작업을 수행하기 전에 상태 업데이트를 기다리는 빈도를 조정할 수 있습니다. 이러한 조정은 컨트롤 플레인과 작업자 노드 간의 네트워크 대기 시간이 최적이 아닌 경우 클러스터가 올바르게 실행되도록 하는 데 도움이 됩니다.
이러한 작업자 대기 시간 프로필에는 대기 시간을 높이기 위해 클러스터의 응답을 제어하기 위해 신중하게 조정된 값으로 미리 정의된 세 가지 매개변수 세트가 포함되어 있습니다. 실험적으로 최상의 값을 수동으로 찾을 필요가 없습니다.
클러스터를 설치하거나 클러스터 네트워크에서 대기 시간을 늘리면 언제든지 작업자 대기 시간 프로필을 구성할 수 있습니다.
6.4.1. 작업자 대기 시간 프로필 이해
작업자 대기 시간 프로필은 신중하게 조정된 매개변수의 네 가지 범주입니다. 이러한 값을 구현하는 4개의 매개변수는 node-status-update-frequency
,node-monitor-grace-period
,default-not-ready-toleration-seconds
및 default-unreachable-toleration-seconds
입니다. 이러한 매개변수는 수동 방법을 사용하여 최상의 값을 결정할 필요 없이 대기 시간 문제에 대한 클러스터의 대응을 제어할 수 있는 값을 사용할 수 있습니다.
이러한 매개변수를 수동으로 설정하는 것은 지원되지 않습니다. 잘못된 매개변수 설정은 클러스터 안정성에 부정적인 영향을 미칩니다.
모든 작업자 대기 시간 프로필은 다음 매개변수를 구성합니다.
- node-status-update-frequency
- kubelet이 API 서버에 노드 상태를 게시하는 빈도를 지정합니다.
- node-monitor-grace-period
-
노드를 비정상적으로 표시하고
node.kubernetes.io/not-ready
또는node.kubernetes.io/unreachable
테인트를 노드에 추가하기 전에 Kubernetes 컨트롤러 관리자가 kubelet에서 업데이트를 기다리는 시간(초)을 지정합니다. - default-not-ready-toleration-seconds
- 해당 노드에서 Pod를 제거하기 전에 Kube API Server Operator가 기다리는 비정상적인 노드를 표시한 후 시간(초)을 지정합니다.
- default-unreachable-toleration-seconds
- 해당 노드에서 Pod를 제거하기 전에 Kube API Server Operator가 대기할 수 없는 노드를 표시한 후 시간(초)을 지정합니다.
다음 Operator는 작업자 대기 시간 프로필에 대한 변경 사항을 모니터링하고 그에 따라 응답합니다.
-
MCO(Machine Config Operator)는 작업자 노드에서
node-status-update-frequency
매개변수를 업데이트합니다. -
Kubernetes 컨트롤러 관리자는 컨트롤 플레인 노드에서
node-monitor-grace-period
매개변수를 업데이트합니다. -
Kubernetes API Server Operator는 컨트롤 플레인 노드에서
default-not-ready-toleration-seconds
및default-unreachable-toleration-seconds
매개변수를 업데이트합니다.
기본 구성이 대부분의 경우 작동하지만 OpenShift Container Platform은 네트워크가 일반적인 것보다 대기 시간이 길어지는 상황에 대해 두 가지 다른 작업자 대기 시간 프로필을 제공합니다. 3개의 작업자 대기 시간 프로파일이 다음 섹션에 설명되어 있습니다.
- 기본 작업자 대기 시간 프로필
Default
프로필을 사용하면 각Kubelet
이 10초마다 상태를 업데이트합니다(node-status-update-frequency
).Kube Controller Manager
는 5초마다Kubelet
의 상태를 확인합니다(node-monitor-grace-period
).Kubernetes 컨트롤러 관리자는
Kubelet
비정상을 고려하기 전에Kubelet
에서 상태 업데이트를 40초 동안 기다립니다. Kubernetes 컨트롤러 관리자에서 사용할 수 없는 상태가 없는 경우 노드를node.kubernetes.io/not-ready
또는node.kubernetes.io/unreachable
테인트로 표시하고 해당 노드에서 Pod를 제거합니다.해당 노드의 Pod에
NoExecute
테인트가 있는 경우tolerationSeconds
에 따라 Pod가 실행됩니다. Pod에 테인트가 없는 경우 300초(Kube API
서버의default-not-ready-toleration-seconds
및default-unreachable-toleration-seconds
설정)가 제거됩니다.프로필 구성 요소 매개변수 현재의 Default
kubelet
node-status-update-frequency
10s
kubelet Controller Manager
node-monitor-grace-period
40s
Kubernetes API Server Operator
default-not-ready-toleration-seconds
300s
Kubernetes API Server Operator
default-unreachable-toleration-seconds
300s
- 중간 수준의 작업자 대기 시간 프로필
네트워크 대기 시간이 보통보다 약간 높은 경우
MediumUpdateAverageReaction
프로필을 사용합니다.MediumUpdateAverageReaction
프로필은 kubelet 업데이트 빈도를 20초로 줄이고 Kubernetes 컨트롤러 관리자가 해당 업데이트를 2분으로 기다리는 기간을 변경합니다. 해당 노드의 Pod의 Pod 제거 기간은 60초로 단축됩니다. Pod에tolerationSeconds
매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.Kubernetes 컨트롤러 관리자는 노드의 비정상적인 것으로 간주하기 위해 2분 정도 기다립니다. 잠시 후 제거 프로세스가 시작됩니다.
프로필 구성 요소 매개변수 현재의 MediumUpdateAverageReaction
kubelet
node-status-update-frequency
20s
kubelet Controller Manager
node-monitor-grace-period
2m
Kubernetes API Server Operator
default-not-ready-toleration-seconds
60s
Kubernetes API Server Operator
default-unreachable-toleration-seconds
60s
- 짧은 작업자 대기 시간 프로필
네트워크 대기 시간이 매우 높은 경우
LowUpdateSlowReaction
프로필을 사용합니다.LowUpdateSlowReaction
프로필은 kubelet 업데이트 빈도를 1분으로 줄이고 Kubernetes 컨트롤러 관리자가 해당 업데이트를 5분으로 기다리는 기간을 변경합니다. 해당 노드의 Pod의 Pod 제거 기간은 60초로 단축됩니다. Pod에tolerationSeconds
매개변수가 있는 경우 제거 시 해당 매개변수에서 지정한 기간 동안 기다립니다.Kubernetes 컨트롤러 관리자는 노드의 비정상적인 것으로 간주하기 위해 5분 정도 기다립니다. 잠시 후 제거 프로세스가 시작됩니다.
프로필 구성 요소 매개변수 현재의 LowUpdateSlowReaction
kubelet
node-status-update-frequency
1m
kubelet Controller Manager
node-monitor-grace-period
5m
Kubernetes API Server Operator
default-not-ready-toleration-seconds
60s
Kubernetes API Server Operator
default-unreachable-toleration-seconds
60s
6.4.2. 작업자 대기 시간 프로필 사용 및 변경
네트워크 대기 시간을 처리하기 위해 작업자 대기 시간 프로필을 변경하려면 node.config
오브젝트를 편집하여 프로필 이름을 추가합니다. 대기 시간이 증가하거나 감소하면 언제든지 프로필을 변경할 수 있습니다.
한 번에 하나의 작업자 대기 시간 프로필을 이동해야 합니다. 예를 들어 Default
프로필에서 LowUpdateSlowReaction
작업자 대기 시간 프로필로 직접 이동할 수 없습니다. 기본
작업자 대기 시간 프로필에서 먼저 MediumUpdateAverageReaction
프로필로 이동한 다음 LowUpdateSlowReaction
으로 이동해야 합니다. 마찬가지로 Default
프로필로 돌아갈 때 먼저 low 프로필에서 medium 프로필로 이동한 다음 Default
로 이동해야 합니다.
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
- 프로필이 적용되고 활성화되도록 지정합니다.
미디어 프로필을 기본값으로 변경하거나 기본값을 medium로 변경하려면 node.config
오브젝트를 편집하고 spec.workerLatencyProfile
매개변수를 적절한 값으로 설정합니다.