4.2. 유사성 및 유사성 방지 규칙을 사용하여 다른 Pod에 상대적인 Pod 배치
유사성은 예약할 노드를 제어하는 Pod의 속성입니다. 유사성 방지는 Pod가 노드에서 예약되지 않도록 하는 Pod의 속성입니다.
AWS의 Red Hat OpenShift Service에서 Pod 유사성 및 Pod 유사성 방지를 사용하면 다른 Pod의 키 값 레이블을 기반으로 Pod를 예약할 수 있는 노드를 제한할 수 있습니다.
4.2.1. Pod 유사성 이해
Pod 유사성 및 Pod 유사성 방지를 사용하면 다른 Pod의 키/값 라벨에 따라 Pod를 예약할 수 있는 노드를 제한할 수 있습니다.
- Pod 유사성을 사용하면 새 Pod의 라벨 선택기가 현재 Pod의 라벨과 일치하는 경우 다른 Pod와 동일한 노드에서 새 Pod를 찾도록 스케줄러에 지시할 수 있습니다.
- Pod 유사성 방지를 사용하면 새 Pod의 라벨 선택기가 현재 Pod의 라벨과 일치하는 경우 스케줄러에서 동일한 라벨을 사용하여 Pod와 동일한 노드에서 새 Pod를 찾지 않도록 할 수 있습니다.
예를 들어 유사성 규칙을 사용하여 서비스 내에서 또는 다른 서비스의 Pod와 관련하여 Pod를 분배하거나 패키징할 수 있습니다. 유사성 방지 규칙을 사용하면 특정 서비스의 Pod가 첫 번째 서비스의 Pod 성능을 방해하는 것으로 알려진 다른 서비스의 Pod와 동일한 노드에 예약되지 않도록 할 수 있습니다. 또는 서비스의 Pod를 노드, 가용성 영역 또는 가용성 세트에 분배하여 관련 오류를 줄일 수 있습니다.
라벨 선택기는 여러 Pod 배포가 있는 Pod와 일치할 수 있습니다. 일치하는 Pod를 방지하려면 유사성 방지 규칙을 구성할 때 레이블의 고유한 조합을 사용합니다.
Pod 유사성 규칙에는 필수 및 기본 두 가지의 유형이 있습니다.
노드에 Pod를 예약하려면 먼저 필수 규칙을 충족해야 합니다. 기본 규칙은 규칙이 충족되는 경우 스케줄러가 규칙을 적용하려고 하지만 반드시 적용되는 것은 아닙니다.
Pod 우선순위 및 선점 설정에 따라 유사성 요구 사항을 위반하지 않으면 스케줄러에서 Pod에 적절한 노드를 찾지 못하는 경우가 있습니다. 이 경우 Pod를 예약하지 못할 수 있습니다.
이러한 상황을 방지하려면 우선순위가 같은 Pod를 사용하여 Pod 유사성을 신중하게 구성합니다.
Pod
사양 파일을 통해 Pod 유사성/유사성 방지를 구성합니다. 필수 규칙, 기본 규칙 또는 둘 다 지정할 수 있습니다. 둘 다 지정하는 경우 노드는 먼저 필수 규칙을 충족한 다음 기본 규칙을 충족하려고 합니다.
다음 예제에서는 Pod 유사성 및 유사성 방지를 위해 구성된 Pod
사양을 보여줍니다.
이 예제에서 Pod 유사성 규칙은 노드에 이미 실행 중인 Pod가 한 개 이상 있고 키가 security
이고 값이 S1
인 라벨이 있는 경우에만 노드에 Pod를 예약할 수 있음을 나타냅니다. Pod 유사성 방지 규칙은 노드에서 이미 Pod를 실행 중이고 키가 security
이고 값이 S2
인 라벨이 있는 경우 Pod를 노드에 예약하지 않는 것을 선호함을 나타냅니다.
Pod 유사성이 포함된 샘플 Pod
구성 파일
apiVersion: v1 kind: Pod metadata: name: with-pod-affinity spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault affinity: podAffinity: 1 requiredDuringSchedulingIgnoredDuringExecution: 2 - labelSelector: matchExpressions: - key: security 3 operator: In 4 values: - S1 5 topologyKey: topology.kubernetes.io/zone containers: - name: with-pod-affinity image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
Pod 유사성 방지가 포함된 샘플 Pod
구성 파일
apiVersion: v1 kind: Pod metadata: name: with-pod-antiaffinity spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault affinity: podAntiAffinity: 1 preferredDuringSchedulingIgnoredDuringExecution: 2 - weight: 100 3 podAffinityTerm: labelSelector: matchExpressions: - key: security 4 operator: In 5 values: - S2 topologyKey: kubernetes.io/hostname containers: - name: with-pod-affinity image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
런타임 시 노드의 라벨이 변경되어 Pod의 유사성 규칙이 더 이상 충족되지 않는 경우 Pod가 노드에서 계속 실행됩니다.
4.2.2. Pod 유사성 규칙 구성
다음 단계에서는 라벨이 있는 Pod 및 유사성을 사용하여 해당 Pod에 예약할 수 있는 Pod를 생성하는 간단한 2-Pod 구성을 보여줍니다.
예약된 Pod에 선호도를 직접 추가할 수 없습니다.
프로세스
Pod 사양에서 특정 라벨을 사용하여 Pod를 생성합니다.
다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.
apiVersion: v1 kind: Pod metadata: name: security-s1 labels: security: S1 spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: security-s1 image: docker.io/ocpqe/hello-pod securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault
Pod를 생성합니다.
$ oc create -f <pod-spec>.yaml
다른 Pod를 생성할 때 유사성을 추가하도록 다음 매개변수를 구성합니다.
다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.
apiVersion: v1 kind: Pod metadata: name: security-s1-east # ... spec: affinity: 1 podAffinity: requiredDuringSchedulingIgnoredDuringExecution: 2 - labelSelector: matchExpressions: - key: security 3 values: - S1 operator: In 4 topologyKey: topology.kubernetes.io/zone 5 # ...
- 1
- Pod 유사성을 추가합니다.
- 2
requiredDuringSchedulingIgnoredDuringExecution
매개변수 또는preferredDuringSchedulingIgnoredDuringExecution
매개변수를 구성합니다.- 3
- 충족해야 하는
키와
값을
지정합니다. 새 Pod를 다른 Pod와 함께 예약하려면 첫 번째 Pod의 라벨과 동일한key
및values
매개변수를 사용합니다. - 4
연산자
를 지정합니다. 연산자는In
,NotIn
,Exists
또는DoesNotExist
일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자In
을 사용합니다.- 5
- 이러한 토폴로지 도메인을 나타내기 위해 사용하며 미리 채워져 있는 Kubernetes 라벨인
topologyKey
를 지정합니다.
Pod를 생성합니다.
$ oc create -f <pod-spec>.yaml
4.2.3. Pod 유사성 방지 규칙 구성
다음 단계에서는 라벨이 있는 Pod 및 유사성 방지 기본 규칙을 사용하여 해당 Pod에 예약하지 않는 Pod를 생성하는 간단한 2-Pod 구성을 보여줍니다.
예약된 Pod에 선호도를 직접 추가할 수 없습니다.
프로세스
Pod 사양에서 특정 라벨을 사용하여 Pod를 생성합니다.
다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.
apiVersion: v1 kind: Pod metadata: name: security-s1 labels: security: S1 spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: security-s1 image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
Pod를 생성합니다.
$ oc create -f <pod-spec>.yaml
다른 Pod를 생성할 때 다음 매개변수를 구성합니다.
다음 콘텐츠를 사용하여 YAML 파일을 생성합니다.
apiVersion: v1 kind: Pod metadata: name: security-s2-east # ... spec: # ... affinity: 1 podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: 2 - weight: 100 3 podAffinityTerm: labelSelector: matchExpressions: - key: security 4 values: - S1 operator: In 5 topologyKey: kubernetes.io/hostname 6 # ...
- 1
- Pod 유사성 방지를 추가합니다.
- 2
requiredDuringSchedulingIgnoredDuringExecution
매개변수 또는preferredDuringSchedulingIgnoredDuringExecution
매개변수를 구성합니다.- 3
- 기본 규칙의 경우 노드의 가중치 1-100을 지정합니다. 가중치가 높은 노드가 우선합니다.
- 4
- 충족해야 하는
키와
값을
지정합니다. 새 Pod를 다른 Pod와 함께 예약하지 않으려면 첫 번째 Pod의 라벨과 동일한key
및values
매개변수를 사용합니다. - 5
연산자
를 지정합니다. 연산자는In
,NotIn
,Exists
또는DoesNotExist
일 수 있습니다. 예를 들어 노드에 라벨이 있어야 하는 경우 연산자In
을 사용합니다.- 6
- 이러한 토폴로지 도메인을 나타내는 데 사용하는 미리 채워진 Kubernetes 라벨 인
topologyKey
를 지정합니다.
Pod를 생성합니다.
$ oc create -f <pod-spec>.yaml
4.2.4. 샘플 Pod 유사성 및 유사성 방지 규칙
다음 예제에서는 Pod 유사성 및 Pod 유사성 방지를 보여줍니다.
4.2.4.1. Pod 유사성
다음 예제에서는 일치하는 라벨 및 라벨 선택기가 있는 Pod의 Pod 유사성을 보여줍니다.
Pod team4에는 라벨
team:4
가 있습니다.apiVersion: v1 kind: Pod metadata: name: team4 labels: team: "4" # ... spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: ocp image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
Pod team4a에는
podAffinity
아래에 라벨 선택기team:4
가 있습니다.apiVersion: v1 kind: Pod metadata: name: team4a # ... spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: team operator: In values: - "4" topologyKey: kubernetes.io/hostname containers: - name: pod-affinity image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
- team4a Pod는 team4 Pod와 동일한 노드에 예약됩니다.
4.2.4.2. Pod 유사성 방지
다음 예제에서는 일치하는 라벨 및 라벨 선택기가 있는 Pod의 Pod 유사성 방지를 보여줍니다.
Pod pod-s1에는 라벨
security:s1
이 있습니다.apiVersion: v1 kind: Pod metadata: name: pod-s1 labels: security: s1 # ... spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: ocp image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
Pod pod-s2에는
podAntiAffinity
아래에 라벨 선택기security:s1
이 있습니다.apiVersion: v1 kind: Pod metadata: name: pod-s2 # ... spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - s1 topologyKey: kubernetes.io/hostname containers: - name: pod-antiaffinity image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
-
Pod pod-s2는
pod-s1
과 동일한 노드에 예약할 수 없습니다.
4.2.4.3. 일치하는 라벨이 없는 Pod 유사성
다음 예제에서는 일치하는 라벨 및 라벨 선택기가 없는 Pod의 Pod 유사성을 보여줍니다.
Pod pod-s1에는 라벨
security:s1
이 있습니다.apiVersion: v1 kind: Pod metadata: name: pod-s1 labels: security: s1 # ... spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: ocp image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
Pod pod-s2에는 라벨 선택기
security:s2
가 있습니다.apiVersion: v1 kind: Pod metadata: name: pod-s2 # ... spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - s2 topologyKey: kubernetes.io/hostname containers: - name: pod-affinity image: docker.io/ocpqe/hello-pod securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] # ...
security:s2
라벨이 있는 Pod가 포함된 노드가 없는 경우 Pod pod-s2는 예약되지 않습니다. 해당 라벨이 있는 기타 Pod가 없는 경우 새 Pod는 보류 중인 상태로 유지됩니다.출력 예
NAME READY STATUS RESTARTS AGE IP NODE pod-s2 0/1 Pending 0 32s <none>