4.4. 노드 유사성 규칙을 사용하여 노드에 대한 Pod 배치 제어
유사성은 예약할 노드를 제어하는 Pod의 속성입니다.
OpenShift Container Platform 노드 유사성은 스케줄러에서 Pod를 배치할 수 있는 위치를 결정하는 데 사용하는 규칙 집합입니다. 규칙은 노드의 사용자 정의 라벨과 Pod에 지정된 라벨 선택기를 사용하여 정의합니다.
4.4.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.4.2. 필수 노드 유사성 규칙 구성
노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다.
프로세스
다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치해야 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.
oc label node
명령을 사용하여 노드에 라벨을 추가합니다.$ oc label node node1 e2e-az-name=e2e-az1
작은 정보다음 YAML을 적용하여 레이블을 추가할 수도 있습니다.
kind: Node apiVersion: v1 metadata: name: <node_name> labels: e2e-az-name: e2e-az1 #...
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.4.3. 기본 노드 유사성 규칙 구성
기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.
프로세스
다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치하려고 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.
oc label node
명령을 사용하여 노드에 라벨을 추가합니다.$ oc label node node1 e2e-az-name=e2e-az3
특정 라벨을 사용하여 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.4.4. 노드 유사성 규칙 샘플
다음 예제에서는 노드 유사성을 보여줍니다.
4.4.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.4.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).
4.4.5. 노드 유사성을 사용하여 Operator가 설치된 위치 제어
기본적으로 Operator를 설치할 때 OpenShift Container Platform은 Operator Pod를 임의로 작업자 노드 중 하나에 설치합니다. 그러나 특정 노드 또는 노드 세트에 해당 Pod를 예약하려는 경우가 있을 수 있습니다.
다음 예제에서는 Operator Pod를 특정 노드 또는 노드 세트에 예약해야 하는 상황을 설명합니다.
-
Operator에
amd64
또는arm64
와 같은 특정 플랫폼이 필요한 경우 - Operator에 Linux 또는 Windows와 같은 특정 운영 체제가 필요한 경우
- 동일한 호스트에서 또는 동일한 랙에 있는 호스트에서 예약된 Operator를 원하는 경우
- 네트워크 또는 하드웨어 문제로 인해 다운타임을 방지하기 위해 인프라 전체에 Operator를 분산하려는 경우
Operator의 Subscription
오브젝트에 노드 유사성 제약 조건을 추가하여 Operator Pod가 설치된 위치를 제어할 수 있습니다.
다음 예제에서는 노드 유사성을 사용하여 Custom Metrics Autoscaler Operator 인스턴스를 클러스터의 특정 노드에 설치하는 방법을 보여줍니다.
Operator Pod를 특정 노드에 배치하는 노드 유사성 예
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: openshift-custom-metrics-autoscaler-operator
namespace: openshift-keda
spec:
name: my-package
source: my-operators
sourceNamespace: operator-registries
config:
affinity:
nodeAffinity: 1
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- ip-10-0-163-94.us-west-2.compute.internal
#...
- 1
ip-10-0-163-94.us-west-2.compute.internal
이라는 노드에 Operator의 Pod를 예약해야 하는 노드 유사성입니다.
특정 플랫폼이 있는 노드에 Operator Pod를 배치하는 노드 유사성 예
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: openshift-custom-metrics-autoscaler-operator
namespace: openshift-keda
spec:
name: my-package
source: my-operators
sourceNamespace: operator-registries
config:
affinity:
nodeAffinity: 1
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
- key: kubernetes.io/os
operator: In
values:
- linux
#...
- 1
kubernetes.io/arch=arm64
및kubernetes.io/os=linux
라벨이 있는 노드에 Operator의 Pod를 예약해야 하는 노드 유사성입니다.
프로세스
Operator Pod 배치를 제어하려면 다음 단계를 완료합니다.
- Operator를 정상적으로 설치합니다.
- 필요한 경우 선호도에 올바르게 응답하도록 노드에 레이블이 지정되어 있는지 확인합니다.
Operator
Subscription
오브젝트를 편집하여 선호도를 추가합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-custom-metrics-autoscaler-operator namespace: openshift-keda spec: name: my-package source: my-operators sourceNamespace: operator-registries config: affinity: 1 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - ip-10-0-185-229.ec2.internal #...
- 1
nodeAffinity
를 추가합니다.
검증
Pod가 특정 노드에 배포되도록 하려면 다음 명령을 실행합니다.
$ oc get pods -o wide
출력 예
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES custom-metrics-autoscaler-operator-5dcc45d656-bhshg 1/1 Running 0 50s 10.131.0.20 ip-10-0-185-229.ec2.internal <none> <none>