4.6. 노드 테인트를 사용하여 Pod 배치 제어
테인트 및 허용 오차를 사용하면 노드에서 예약해야 하는 (또는 예약해서는 안 되는) Pod를 제어할 수 있습니다.
4.6.1. 테인트(Taints) 및 톨러레이션(Tolerations)의 이해
테인트를 사용하면 Pod에 일치하는 허용 오차가 없는 경우 노드에서 Pod 예약을 거부할 수 있습니다.
Node
사양(NodeSpec
)을 통해 노드에 테인트를 적용하고 Pod
사양(PodSpec
)을 통해 Pod에 허용 오차를 적용합니다. 노드에 테인트를 적용할 때 Pod에서 테인트를 허용할 수 없는 경우 스케줄러에서 해당 노드에 Pod를 배치할 수 없습니다.
노드 사양의 테인트 예
apiVersion: v1 kind: Node metadata: name: my-node #... spec: taints: - effect: NoExecute key: key1 value: value1 #...
Pod
사양의 허용 오차 예
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 3600 #...
테인트 및 톨러레이션은 key, value 및 effect로 구성되어 있습니다.
매개변수 | 설명 | ||||||
---|---|---|---|---|---|---|---|
|
| ||||||
|
| ||||||
| 다음 명령 중 하나를 실행합니다.
| ||||||
|
|
컨트롤 플레인 노드에
NoSchedule
테인트를 추가하는 경우 노드에 기본적으로 추가되는node-role.kubernetes.io/master=:NoSchedule
테인트가 있어야 합니다.예를 들면 다음과 같습니다.
apiVersion: v1 kind: Node metadata: annotations: machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c name: my-node #... spec: taints: - effect: NoSchedule key: node-role.kubernetes.io/master #...
톨러레이션은 테인트와 일치합니다.
operator
매개변수가Equal
로 설정된 경우:-
key
매개변수는 동일합니다. -
value
매개변수는 동일합니다. -
effect
매개변수는 동일합니다.
-
operator
매개변수가Exists
로 설정된 경우:-
key
매개변수는 동일합니다. -
effect
매개변수는 동일합니다.
-
다음 테인트는 OpenShift Container Platform에 빌드됩니다.
-
node.kubernetes.io/not-ready
: 노드가 준비 상태에 있지 않습니다. 이는 노드 조건Ready=False
에 해당합니다. -
node.kubernetes.io/unreachable
: 노드가 노드 컨트롤러에서 연결할 수 없습니다. 이는 노드 조건Ready=Unknown
에 해당합니다. -
node.kubernetes.io/memory-pressure
: 노드에 메모리 부족 문제가 있습니다. 이는 노드 조건MemoryPressure=True
에 해당합니다. -
node.kubernetes.io/disk-pressure
: 노드에 디스크 부족 문제가 있습니다. 이는 노드 조건DiskPressure=True
에 해당합니다. -
node.kubernetes.io/network-unavailable
: 노드 네트워크를 사용할 수 없습니다. -
node.kubernetes.io/unschedulable
: 노드를 예약할 수 없습니다. -
node.cloudprovider.kubernetes.io/uninitialized
: 노드 컨트롤러가 외부 클라우드 공급자로 시작되면 이 테인트 노드에 사용 불가능으로 표시됩니다. cloud-controller-manager의 컨트롤러가 이 노드를 초기화하면 kubelet이 이 테인트를 제거합니다. node.kubernetes.io/pid-pressure
: 노드에 pid 압력이 있습니다. 이는 노드 조건PIDPressure=True
에 해당합니다.중요OpenShift Container Platform에서는 기본 pid.available
제거Hard
를 설정하지 않습니다.
4.6.1.1. tolerationSeconds를 사용하여 pod 제거를 지연하는 방법
Pod
사양 또는 MachineSet
오브젝트에 tolerationSeconds
매개변수를 지정하면 Pod를 제거하기 전에 노드에 바인딩되는 시간을 지정할 수 있습니다. NoExecute
효과가 있는 테인트가 tolerationSeconds
매개변수가 있는 테인트를 허용하는 Pod인 노드에 추가되면 해당 기간이 만료될 때까지 Pod가 제거되지 않습니다.
출력 예
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 3600 #...
여기에서 이 Pod가 실행 중이지만 일치하는 허용 오차가 없으면 Pod는 3,600초 동안 노드에 바인딩된 후 제거됩니다. 이 시간 이전에 테인트가 제거되면 pod가 제거되지 않습니다.
4.6.1.2. 여러 테인트를 사용하는 방법
동일한 노드에 여러 테인트를 배치하고 동일한 pod에 여러 톨러레이션을 배치할 수 있습니다. OpenShift Container Platform은 다음과 같이 여러 테인트 및 톨러레이션을 처리합니다.
- Pod에 일치하는 톨러레이션이 있는 테인트를 처리합니다.
나머지 일치하지 테인트는 pod에서 다음 effect를 갖습니다.
-
effect가
NoSchedule
인 일치하지 않는 테인트가 하나 이상있는 경우 OpenShift Container Platform은 해당 노드에 pod를 예약할 수 없습니다. -
effect가
NoSchedule
인 일치하지 않는 테인트가 없지만 effect가PreferNoSchedule
인 일치하지 않는 테인트가 하나 이상있는 경우, OpenShift 컨테이너 플랫폼은 노드에 pod를 예약 시도하지 않습니다. 효과가
NoExecute
인 일치하지 않는 테인트가 하나 이상 있는 경우 OpenShift Container Platform은 Pod가 노드에서 이미 실행되고 있으면 노드에서 Pod를 제거합니다. Pod가 노드에서 아직 실행되고 있지 않으면 Pod가 노드에 예약되지 않습니다.- 테인트를 허용하지 Pod는 즉시 제거됩니다.
-
Pod
사양에tolerationSeconds
를 지정하지 않은 테인트를 허용하는 Pod는 영구적으로 바인딩된 상태를 유지합니다. -
tolerationSeconds
가 지정된 테인트를 허용하는 Pod는 지정된 시간 동안 바인딩된 상태로 유지됩니다.
-
effect가
예를 들면 다음과 같습니다.
노드에 다음 테인트를 추가합니다.
$ oc adm taint nodes node1 key1=value1:NoSchedule
$ oc adm taint nodes node1 key1=value1:NoExecute
$ oc adm taint nodes node1 key2=value2:NoSchedule
Pod에는 다음과 같은 톨러레이션이 있습니다.
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" #...
이 경우 세 번째 테인트와 일치하는 톨러레이션이 없기 때문에 pod를 노드에 예약할 수 없습니다. 세 번째 테인트는 pod에서 허용되지 않는 세 번째 테인트 중 하나이기 때문에 테인트가 추가될 때 노드에서 이미 실행되고 있는 경우 pod가 계속 실행됩니다.
4.6.1.3. Pod 예약 및 노드 상태 (taint node by condition)
상태별 노드 테인트 기능은 기본적으로 활성화되어 있으며 메모리 부족 및 디스크 부족과 같은 상태를 보고하는 노드를 자동으로 테인트합니다. 노드가 상태를 보고하면 상태가 해제될 때까지 테인트가 추가됩니다. 테인트에는 NoSchedule
effect가 있습니다. 즉, pod에 일치하는 톨러레이션이 없으면 노드에서 pod를 예약할 수 없습니다.
스케줄러는 pod를 예약하기 전에 노드에서 이러한 테인트를 확인합니다. 테인트가 있는 경우 pod는 다른 노드에 예약됩니다. 스케줄러는 실제 노드 상태가 아닌 테인트를 확인하기 때문에 적절한 pod 톨러레이션을 추가하여 이러한 노드 상태 중 일부를 무시하도록 스케줄러를 구성합니다.
이전 버전과의 호환성을 보장하기 위해 데몬 세트 컨트롤러는 모든 데몬에 다음과 같은 허용 오차를 자동으로 추가합니다.
- node.kubernetes.io/memory-pressure
- node.kubernetes.io/disk-pressure
- node.kubernetes.io/unschedulable (1.10 이상)
- node.kubernetes.io/network-unavailable (호스트 네트워크 만)
데몬 세트에 임의의 허용 오차를 추가할 수 있습니다.
컨트롤 플레인은 QoS 클래스가 있는 Pod에 node.kubernetes.io/memory-pressure
허용 오차를 추가합니다. 이는 Kubernetes가 Guaranteed
또는 Burstable
QoS 클래스에서 Pod를 관리하기 때문입니다. 새 BestEffort
Pod가 영향을 받는 노드에 예약되지 않습니다.
4.6.1.4. 상태 별 pod 제거 (taint-based evictions)
기본적으로 활성화된 Taint-Based Evictions 기능은 not-ready
및 unreachable
과 같은 특정 상태에 있는 노드에서 Pod를 제거합니다. 노드에 이러한 상태 중 하나가 발생하면 OpenShift Container Platform은 자동으로 노드에 테인트를 추가하고 pod를 제거하여 다른 도드에서 다시 예약하기 시작합니다.
Taint Based Evictions에는 NoExecute
효과가 있으며, 여기서 테인트를 허용하지 않는 Pod는 즉시 제거되고 테인트를 허용하는 모든 Pod는 tolerationSeconds
매개변수를 사용하지 않는 한 제거되지 않습니다.
tolerationSeconds
매개변수를 사용하면 노드 조건이 설정된 노드에 Pod가 바인딩되는 기간을 지정할 수 있습니다. tolerationSeconds
기간 후에도 이 상태가 계속되면 테인트가 노드에 남아 있고 허용 오차가 일치하는 Pod가 제거됩니다. tolerationSeconds
기간 전에 상태 조건이 지워지면 허용 오차가 일치하는 Pod가 제거되지 않습니다.
값이 없는 tolerationSeconds
매개변수를 사용하는 경우 준비되지 않고 연결할 수 없는 노드 상태로 인해 Pod가 제거되지 않습니다.
OpenShift Container Platform은 속도가 제한된 방식으로 pod를 제거하여 마스터가 노드에서 분할되는 등의 시나리오에서 대규모 pod 제거를 방지합니다.
기본적으로 지정된 영역의 노드 55% 이상이 비정상인 경우 노드 라이프사이클 컨트롤러는 해당 영역의 상태를 PartialDisruption
으로 변경하고 Pod 제거 속도가 줄어듭니다. 이 상태의 소규모 클러스터(기본적으로 50개 이하)의 경우 이 영역의 노드는 테인트되지 않으며 제거가 중지됩니다.
자세한 내용은 Kubernetes 설명서의 제거에 대한 속도 제한을 참조하십시오.
Pod
구성에서 허용 오차를 지정하지 않는 경우 OpenShift Container Platform은 자동으로 node.kubernetes.io/not-ready
및 node.kubernetes.io/unreachable
의 허용 오차를 tolerationSeconds=300
으로 추가합니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
#...
spec:
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300 1
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
#...
- 1
- 이러한 톨러레이션은 이러한 노드 상태 문제 중 하나가 감지된 후 기본 pod 동작을 5 분 동안 바인딩된 상태로 유지할 수 있도록 합니다.
필요에 따라 이러한 톨러레이션을 구성할 수 있습니다. 예를 들어 애플리케이션에 다수의 로컬 상태가 있는 경우 네트워크 파티션 등에 따라 pod를 노드에 더 오래 바인딩하여 파티션을 복구하고 pod 제거를 방지할 수 있습니다.
데몬 세트에 의해 생성된 Pod는 tolerationSeconds
가 없는 다음 테인트의 NoExecute
허용 오차를 사용하여 생성됩니다.
-
node.kubernetes.io/unreachable
-
node.kubernetes.io/not-ready
결과적으로 이러한 노드 상태로 인해 데몬 세트 Pod가 제거되지 않습니다.
4.6.1.5. 모든 테인트 허용
key
및 values
매개변수 없이 operator: "Exists"
허용 오차를 추가하여 모든 테인트를 허용하도록 Pod를 구성할 수 있습니다. 이 허용 오차가 있는 Pod는 테인트가 있는 노드에서 제거되지 않습니다.
모든 테인트를 허용하는 Pod
사양
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - operator: "Exists" #...
4.6.2. 테인트 및 톨러레이션 추가
Pod에 허용 오차를 추가하고 노드에 테인트를 추가하면 노드에 예약하거나 예약하지 않아야 하는 Pod를 노드에서 제어할 수 있습니다. 기존 Pod 및 노드의 경우 먼저 Pod에 허용 오차를 추가한 다음 노드에 테인트를 추가하여 허용 오차를 추가하기 전에 노드에서 Pod가 제거되지 않도록 합니다.
프로세스
tolerations
스탠자를 포함하도록Pod
사양을 편집하여 Pod에 허용 오차를 추가합니다.Equal 연산자가 있는 Pod 구성 파일 샘플
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" 1 value: "value1" operator: "Equal" effect: "NoExecute" tolerationSeconds: 3600 2 #...
예를 들면 다음과 같습니다.
Exists 연산자가 있는 Pod 구성 파일 샘플
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" operator: "Exists" 1 effect: "NoExecute" tolerationSeconds: 3600 #...
- 1
Exists
연산자는value
를 사용하지 않습니다.
이 예에서는 key
key1
, valuevalue1
, 테인트 effectNoExecute
를 갖는node1
에 테인트를 배치합니다.테인트 및 허용 오차 구성 요소 테이블에 설명된 매개변수로 다음 명령을 사용하여 노드에 테인트를 추가합니다.
$ oc adm taint nodes <node_name> <key>=<value>:<effect>
예를 들면 다음과 같습니다.
$ oc adm taint nodes node1 key1=value1:NoExecute
이 명령은 키가
key1
, 값이value1
, 효과가NoExecute
인node1
에 테인트를 배치합니다.참고컨트롤 플레인 노드에
NoSchedule
테인트를 추가하는 경우 노드에 기본적으로 추가되는node-role.kubernetes.io/master=:NoSchedule
테인트가 있어야 합니다.예를 들면 다음과 같습니다.
apiVersion: v1 kind: Node metadata: annotations: machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c name: my-node #... spec: taints: - effect: NoSchedule key: node-role.kubernetes.io/master #...
Pod의 허용 오차가 노드의 테인트와 일치합니다. 허용 오차 중 하나가 있는 Pod를
node1
에 예약할 수 있습니다.
4.6.2.1. 컴퓨팅 머신 세트를 사용하여 테인트 및 허용 오차 추가
컴퓨팅 머신 세트를 사용하여 노드에 테인트를 추가할 수 있습니다. MachineSet
오브젝트와 연결된 모든 노드는 테인트를 사용하여 업데이트됩니다. 허용 오차는 노드에 직접 추가된 테인트와 동일한 방식으로 컴퓨팅 머신 세트에 의해 추가된 테인트에 응답합니다.
프로세스
tolerations
스탠자를 포함하도록Pod
사양을 편집하여 Pod에 허용 오차를 추가합니다.Equal
연산자가 있는 Pod 구성 파일의 예apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" 1 value: "value1" operator: "Equal" effect: "NoExecute" tolerationSeconds: 3600 2 #...
예를 들면 다음과 같습니다.
Exists
연산자가 있는 pod 구성 파일의 예apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" operator: "Exists" effect: "NoExecute" tolerationSeconds: 3600 #...
MachineSet
오브젝트에 테인트를 추가합니다.테인트할 노드의
MachineSet
YAML을 편집하거나 새MachineSet
오브젝트를 생성할 수 있습니다.$ oc edit machineset <machineset>
spec.template.spec
섹션에 테인트를 추가합니다.컴퓨팅 머신 세트 사양의 테인트 예
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: name: my-machineset #... spec: #... template: #... spec: taints: - effect: NoExecute key: key1 value: value1 #...
이 예제에서는 키가
key1
, 값이value1
, 테인트 효과가NoExecute
인 테인트를 노드에 배치합니다.컴퓨팅 머신 세트를 0으로 축소합니다.
$ oc scale --replicas=0 machineset <machineset> -n openshift-machine-api
작은 정보다음 YAML을 적용하여 컴퓨팅 머신 세트를 확장할 수 있습니다.
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: name: <machineset> namespace: openshift-machine-api spec: replicas: 0
머신이 제거될 때까지 기다립니다.
필요에 따라 컴퓨팅 머신 세트를 확장합니다.
$ oc scale --replicas=2 machineset <machineset> -n openshift-machine-api
또는 다음을 수행합니다.
$ oc edit machineset <machineset> -n openshift-machine-api
머신이 시작될 때까지 기다립니다. 테인트는
MachineSet
오브젝트와 연결된 노드에 추가됩니다.
4.6.2.2. 테인트 및 톨러레이션을 사용하여 사용자를 노드에 바인딩
특정 사용자 집합에서 독점적으로 사용하도록 노드 세트를 전용으로 지정하려면 해당 Pod에 허용 오차를 추가합니다. 그런 다음 해당 노드에 해당 테인트를 추가합니다. 허용 오차가 있는 Pod는 테인트된 노드 또는 클러스터의 다른 노드를 사용할 수 있습니다.
이렇게 테인트된 노드에만 Pod를 예약하려면 동일한 노드 세트에도 라벨을 추가하고 해당 라벨이 있는 노드에만 Pod를 예약할 수 있도록 Pod에 노드 유사성을 추가합니다.
프로세스
사용자가 해당 노드 만 사용할 수 있도록 노드를 구성하려면 다음을 수행합니다.
해당 노드에 해당 테인트를 추가합니다.
예를 들면 다음과 같습니다.
$ oc adm taint nodes node1 dedicated=groupName:NoSchedule
작은 정보다음 YAML을 적용하여 테인트를 추가할 수 있습니다.
kind: Node apiVersion: v1 metadata: name: my-node #... spec: taints: - key: dedicated value: groupName effect: NoSchedule #...
- 사용자 정의 승인 컨트롤러를 작성하여 Pod에 허용 오차를 추가합니다.
4.6.2.3. 노드 선택기 및 허용 오차를 사용하여 프로젝트 생성
노드 선택기 및 허용 오차를 사용하여 특정 노드에 Pod 배치를 제어하는 프로젝트를 생성할 수 있습니다. 그런 다음 프로젝트에서 생성된 후속 리소스는 허용 오차와 일치하는 테인트가 있는 노드에 예약됩니다.
사전 요구 사항
- 컴퓨팅 머신 세트를 사용하거나 노드를 직접 편집하여 노드 선택의 레이블이 하나 이상의 노드에 추가되었습니다.
- 컴퓨팅 머신 세트를 사용하거나 노드를 직접 편집하여 테인트가 하나 이상의 노드에 추가되어 있습니다.
절차
metadata.annotations
섹션에서 노드 선택기 및 허용 오차를 지정하여Project
리소스 정의를 생성합니다.project.yaml
파일 예kind: Project apiVersion: project.openshift.io/v1 metadata: name: <project_name> 1 annotations: openshift.io/node-selector: '<label>' 2 scheduler.alpha.kubernetes.io/defaultTolerations: >- [{"operator": "Exists", "effect": "NoSchedule", "key": "<key_name>"} 3 ]
oc apply
명령을 사용하여 프로젝트를 생성합니다.$ oc apply -f project.yaml
<project_name>
네임스페이스에서 생성된 후속 리소스는 이제 지정된 노드에서 예약해야 합니다.
추가 리소스
- 노드에 수동으로 또는 컴퓨팅 머신 세트를사용하여 테인트 및 허용 오차 추가
- 프로젝트 수준 노드 선택기 생성
- Operator 워크로드의 Pod 배치
4.6.2.4. 테인트 및 톨러레이션을 사용하여 특수 하드웨어로 노드 제어
소규모 노드 하위 집합에 특수 하드웨어가 있는 클러스터에서는 테인트 및 허용 오차를 사용하여 특수 하드웨어가 필요하지 않은 Pod를 해당 노드에서 분리하여 특수 하드웨어가 필요한 Pod를 위해 노드를 남겨 둘 수 있습니다. 또한 특정 노드를 사용하기 위해 특수 하드웨어가 필요한 Pod를 요청할 수도 있습니다.
이 작업은 특수 하드웨어가 필요한 Pod에 허용 오차를 추가하고 특수 하드웨어가 있는 노드를 테인트하여 수행할 수 있습니다.
프로세스
특수 하드웨어가 있는 노드를 특정 Pod용으로 예약하려면 다음을 수행합니다.
특수 하드웨어가 필요한 Pod에 허용 오차를 추가합니다.
예를 들면 다음과 같습니다.
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "disktype" value: "ssd" operator: "Equal" effect: "NoSchedule" tolerationSeconds: 3600 #...
다음 명령 중 하나를 사용하여 특수 하드웨어가 있는 노드에 테인트를 설정합니다.
$ oc adm taint nodes <node-name> disktype=ssd:NoSchedule
또는 다음을 수행합니다.
$ oc adm taint nodes <node-name> disktype=ssd:PreferNoSchedule
작은 정보다음 YAML을 적용하여 테인트를 추가할 수 있습니다.
kind: Node apiVersion: v1 metadata: name: my_node #... spec: taints: - key: disktype value: ssd effect: PreferNoSchedule #...
4.6.3. 테인트 및 톨러레이션 제거
필요에 따라 노드에서 테인트를 제거하고 Pod에서 톨러레이션을 제거할 수 있습니다. 허용 오차를 추가하려면 먼저 Pod에 허용 오차를 추가한 다음 노드에서 Pod가 제거되지 않도록 노드에 테인트를 추가해야 합니다.
프로세스
테인트 및 톨러레이션을 제거하려면 다음을 수행합니다.
노드에서 테인트를 제거하려면 다음을 수행합니다.
$ oc adm taint nodes <node-name> <key>-
예를 들면 다음과 같습니다.
$ oc adm taint nodes ip-10-0-132-248.ec2.internal key1-
출력 예
node/ip-10-0-132-248.ec2.internal untainted
Pod에서 허용 오차를 제거하려면
Pod
사양을 편집하여 허용 오차를 제거합니다.apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key2" operator: "Exists" effect: "NoExecute" tolerationSeconds: 3600 #...