3.5. 노드 유사성 규칙을 사용하여 노드에 대한 Pod 배치 제어

유사성은 예약할 노드를 제어하는 Pod의 속성입니다.

OpenShift Container Platform 노드 유사성은 스케줄러에서 Pod를 배치할 수 있는 위치를 결정하는 데 사용하는 규칙 집합입니다. 규칙은 노드의 사용자 정의 라벨과 Pod에 지정된 라벨 선택기를 사용하여 정의합니다.

3.5.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:
  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

1
노드 유사성을 구성하는 스탠자입니다.
2
필요한 규칙을 정의합니다.
3 5 6
규칙을 적용하려면 일치해야 하는 키/값(라벨)입니다.
4
연산자는 노드의 라벨과 Pod 사양에 있는 matchExpression 매개변수의 값 집합 간의 관계를 나타냅니다. 이 값은 In, NotIn, Exists, DoesNotExist, Lt 또는 Gt일 수 있습니다.

다음 예제는 Pod에 대해 키가 e2e-az-EastWest이고 값이 e2e-az-East 또는 e2e-az-West인 라벨이 있는 노드를 선호하는 기본 규칙이 있는 노드 사양입니다.

노드 유사성 기본 규칙이 있는 Pod 구성 파일의 예

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  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

1
노드 유사성을 구성하는 스탠자입니다.
2
기본 규칙을 정의합니다.
3
기본 규칙의 가중치를 지정합니다. 가중치가 높은 노드가 우선합니다.
4 6 7
규칙을 적용하려면 일치해야 하는 키/값(라벨)입니다.
5
연산자는 노드의 라벨과 Pod 사양에 있는 matchExpression 매개변수의 값 집합 간의 관계를 나타냅니다. 이 값은 In, NotIn, Exists, DoesNotExist, Lt 또는 Gt일 수 있습니다.

명시적인 노드 유사성 방지 개념은 없지만 NotIn 또는 DoesNotExist 연산자를 사용하여 해당 동작을 복제합니다.

참고

노드 유사성 및 노드 선택기를 동일한 Pod 구성으로 사용하는 경우 다음 사항에 유의하십시오.

  • nodeSelectornodeAffinity를 둘 다 구성하는 경우 Pod를 후보 노드에 예약하기 위해서는 두 상태를 모두 충족해야 합니다.
  • nodeAffinity 유형과 연결된 nodeSelectorTerms를 여러 개 지정하는 경우 nodeSelectorTerms 중 하나를 충족하면 Pod를 노드에 예약할 수 있습니다.
  • nodeSelectorTerms와 연결된 matchExpressions를 여러 개 지정하는 경우 모든 matchExpressions를 충족할 때만 Pod를 노드에 예약할 수 있습니다.

3.5.2. 필수 노드 유사성 규칙 구성

노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다.

프로세스

다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치해야 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.

  1. 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
  2. Pod 사양에서 nodeAffinity 스탠자를 사용하여 requiredDuringSchedulingIgnoredDuringExecution 매개변수를 구성합니다.

    1. 충족해야 하는 키와 값을 지정합니다. 편집한 노드에 새 Pod를 예약하려면 노드의 라벨과 동일한 keyvalue 매개변수를 사용합니다.
    2. operator를 지정합니다. 연산자는 In, NotIn, Exists, DoesNotExist, Lt 또는 Gt일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자 In을 사용합니다.

      출력 예

      spec:
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: e2e-az-name
                  operator: In
                  values:
                  - e2e-az1
                  - e2e-az2

  3. Pod를 생성합니다.

    $ oc create -f e2e-az2.yaml

3.5.3. 기본 노드 유사성 규칙 구성

기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.

프로세스

다음 단계에서는 하나의 노드 및 스케줄러에서 해당 노드에 배치하려고 하는 하나의 Pod를 생성하는 간단한 구성을 보여줍니다.

  1. oc label node 명령을 사용하여 노드에 라벨을 추가합니다.

    $ oc label node node1 e2e-az-name=e2e-az3
  2. Pod 사양에서 nodeAffinity 스탠자를 사용하여 preferredDuringSchedulingIgnoredDuringExecution 매개변수를 구성합니다.

    1. 노드의 가중치를 숫자 1~100으로 지정합니다. 가중치가 높은 노드가 우선합니다.
    2. 충족해야 하는 키와 값을 지정합니다. 편집한 노드에 새 Pod를 예약하려면 노드의 라벨과 동일한 keyvalue 매개변수를 사용합니다.

      spec:
        affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1
              preference:
                matchExpressions:
                - key: e2e-az-name
                  operator: In
                  values:
                  - e2e-az3
    3. operator를 지정합니다. 연산자는 In, NotIn, Exists, DoesNotExist, Lt 또는 Gt일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자 In을 사용합니다.
  3. Pod를 생성합니다.

    $ oc create -f e2e-az3.yaml

3.5.4. 노드 유사성 규칙 샘플

다음 예제에서는 노드 유사성을 보여줍니다.

3.5.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에는 필수 노드 유사성 규칙에 따라 zoneus 키/값 쌍이 있습니다.

    $ cat pod-s1.yaml

    출력 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
      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

3.5.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에는 필수 노드 유사성 규칙에 따라 zoneus 키/값 쌍이 있습니다.

    $ cat pod-s1.yaml

    출력 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-s1
    spec:
      containers:
        - image: "docker.io/ocpqe/hello-pod"
          name: hello-pod
      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).

3.5.5. 추가 리소스