4.3. 노드 유사성 규칙을 사용하여 노드에 대한 Pod 배치 제어
유사성은 예약할 노드를 제어하는 Pod의 속성입니다.
AWS 노드의 Red Hat OpenShift Service는 스케줄러에서 Pod를 배치할 수 있는 위치를 결정하는 데 사용하는 규칙 세트입니다. 규칙은 노드의 사용자 정의 라벨과 Pod에 지정된 라벨 선택기를 사용하여 정의합니다.
4.3.1. 노드 유사성 이해
노드 유사성을 사용하면 Pod에서 Pod를 배치할 수 있는 노드 그룹에 대한 유사성을 지정할 수 있습니다. 노드는 배치를 제어할 수 없습니다.
예를 들어 특정 CPU 또는 특정 가용성 영역이 있는 노드에서만 실행하도록 Pod를 구성할 수 있습니다.
노드 유사성 규칙에는 필수 및 기본 두 가지의 유형이 있습니다.
노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다. 기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.
노드의 라벨이 런타임에 변경되어 Pod에 대한 노드 유사성 규칙이 더 이상 충족되지 않으면 Pod가 해당 노드에서 계속 실행됩니다.
노드 유사성은 Pod
사양 파일을 통해 구성합니다. 필수 규칙, 기본 규칙 또는 둘 다 지정할 수 있습니다. 둘 다 지정하는 경우 노드는 먼저 필수 규칙을 충족한 다음 기본 규칙을 충족하려고 합니다.
다음 예제는 키가 e2e-az-NorthSouth
이고 값이 e2e-az-North
또는 e2e-az-South
인 라벨이 있는 노드에 Pod를 배치해야 하는 규칙이 있는 Pod
사양입니다.
노드 유사성 필수 규칙이 있는 Pod 구성 파일의 예
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault affinity: nodeAffinity: 1 requiredDuringSchedulingIgnoredDuringExecution: 2 nodeSelectorTerms: - matchExpressions: - key: e2e-az-NorthSouth 3 operator: In 4 values: - e2e-az-North 5 - e2e-az-South 6 containers: - name: with-node-affinity image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
다음 예제는 Pod에 대해 키가 e2e-az-EastWest
이고 값이 e2e-az-East
또는 e2e-az-West
인 라벨이 있는 노드를 선호하는 기본 규칙이 있는 노드 사양입니다.
노드 유사성 기본 규칙이 있는 Pod 구성 파일의 예
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault affinity: nodeAffinity: 1 preferredDuringSchedulingIgnoredDuringExecution: 2 - weight: 1 3 preference: matchExpressions: - key: e2e-az-EastWest 4 operator: In 5 values: - e2e-az-East 6 - e2e-az-West 7 containers: - name: with-node-affinity image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
명시적인 노드 유사성 방지 개념은 없지만 NotIn
또는 DoesNotExist
연산자를 사용하여 해당 동작을 복제합니다.
노드 유사성 및 노드 선택기를 동일한 Pod 구성으로 사용하는 경우 다음 사항에 유의하십시오.
-
nodeSelector
와nodeAffinity
를 둘 다 구성하는 경우 Pod를 후보 노드에 예약하기 위해서는 두 상태를 모두 충족해야 합니다. -
nodeAffinity
유형과 연결된nodeSelectorTerms
를 여러 개 지정하는 경우nodeSelectorTerms
중 하나를 충족하면 Pod를 노드에 예약할 수 있습니다. -
nodeSelectorTerms
와 연결된matchExpressions
를 여러 개 지정하는 경우 모든matchExpressions
를 충족할 때만 Pod를 노드에 예약할 수 있습니다.
4.3.2. 필수 노드 유사성 규칙 구성
노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다.
프로세스
다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치해야 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.
Pod 사양에서 특정 라벨을 사용하여 Pod를 생성합니다.
다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.
참고예약된 Pod에 선호도를 직접 추가할 수 없습니다.
출력 예
apiVersion: v1 kind: Pod metadata: name: s1 spec: affinity: 1 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: 2 nodeSelectorTerms: - matchExpressions: - key: e2e-az-name 3 values: - e2e-az1 - e2e-az2 operator: In 4 #...
Pod를 생성합니다.
$ oc create -f <file-name>.yaml
4.3.3. 기본 노드 유사성 규칙 구성
기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.
프로세스
다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치하려고 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.
특정 라벨을 사용하여 Pod를 생성합니다.
다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.
참고예약된 Pod에 선호도를 직접 추가할 수 없습니다.
apiVersion: v1 kind: Pod metadata: name: s1 spec: affinity: 1 nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: 2 - weight: 3 preference: matchExpressions: - key: e2e-az-name 4 values: - e2e-az3 operator: In 5 #...
- 1
- Pod 유사성을 추가합니다.
- 2
preferredDuringSchedulingIgnoredDuringExecution
매개변수를 구성합니다.- 3
- 노드의 가중치를 숫자 1~100으로 지정합니다. 가중치가 높은 노드가 우선합니다.
- 4
- 충족해야 하는
키와
값을
지정합니다. 편집한 노드에 새 Pod를 예약하려면 노드의 라벨과 동일한key
및values
매개변수를 사용합니다. - 5
연산자
를 지정합니다. 연산자는In
,NotIn
,Exists
또는DoesNotExist
일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자In
을 사용합니다.
Pod를 생성합니다.
$ oc create -f <file-name>.yaml
4.3.4. 노드 유사성 규칙 샘플
다음 예제에서는 노드 유사성을 보여줍니다.
4.3.4.1. 일치하는 라벨이 있는 노드 유사성
다음 예제에서는 일치하는 라벨이 있는 노드 및 Pod의 노드 유사성을 보여줍니다.
Node1 노드에는 라벨
zone:us
가 있습니다.$ oc label node node1 zone=us
작은 정보다음 YAML을 적용하여 레이블을 추가할 수도 있습니다.
kind: Node apiVersion: v1 metadata: name: <node_name> labels: zone: us #...
pod-s1 Pod에는 필수 노드 유사성 규칙에 따라
zone
및us
키/값 쌍이 있습니다.$ cat pod-s1.yaml
출력 예
apiVersion: v1 kind: Pod metadata: name: pod-s1 spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "zone" operator: In values: - us #...
pod-s1 Pod를 Node1에 예약할 수 있습니다.
$ oc get pod -o wide
출력 예
NAME READY STATUS RESTARTS AGE IP NODE pod-s1 1/1 Running 0 4m IP1 node1
4.3.4.2. 일치하는 라벨이 없는 노드 유사성
다음 예제에서는 일치하는 라벨이 없는 노드 및 Pod의 노드 유사성을 보여줍니다.
Node1 노드에는 라벨
zone:emea
가 있습니다.$ oc label node node1 zone=emea
작은 정보다음 YAML을 적용하여 레이블을 추가할 수도 있습니다.
kind: Node apiVersion: v1 metadata: name: <node_name> labels: zone: emea #...
pod-s1 Pod에는 필수 노드 유사성 규칙에 따라
zone
및us
키/값 쌍이 있습니다.$ cat pod-s1.yaml
출력 예
apiVersion: v1 kind: Pod metadata: name: pod-s1 spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - image: "docker.io/ocpqe/hello-pod" name: hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "zone" operator: In values: - us #...
pod-s1 Pod는 Node1에 예약할 수 없습니다.
$ oc describe pod pod-s1
출력 예
... Events: FirstSeen LastSeen Count From SubObjectPath Type Reason --------- -------- ----- ---- ------------- -------- ------ 1m 33s 8 default-scheduler Warning FailedScheduling No nodes are available that match all of the following predicates:: MatchNodeSelector (1).