Kubernetes

Kubernetes podAntiAffinity

DevelopC 2023. 3. 23. 12:36
728x90

Kubernetes podAntiAffinity

Kubernetes podAntiAffinity는 Pod을 배포할 때, 특정 조건에 따라 서로 다른 노드에 Pod 스케줄 되도록 지정하는 방법입니다. 이를 통해 노드에 동일한 애플리케이션 또는 작업이 과도하게 집중되는 것을 피할 수 있으며, 노드 장애 시 애플리케이션의 가용성을 높일 수 있습니다.

 

Kubernetes podAntiAffinity는 두 가지 유형이 있습니다. preferredDuringSchedulingIgnoredDuringExecution와 requiredDuringSchedulingIgnoredDuringExecution 두 유형의 차이점은 다음과 같습니다.

 

preferredDuringSchedulingIgnoredDuringExecution

스케줄러가 Pod 스케줄링할 때, 가능한 한 다른 노드에 위치시키려고 노력하지만, 그렇지 않은 경우에도 스케줄링됩니다. 이는 가용 노드에 제한이 있는 경우에 유용할 수 있습니다. 이 옵션은 Pod을 분산시키려는 목표를 가지지만, 그렇지 않은 경우에도 Pod이 실행될 수 있도록 하기 때문에 상대적으로 유연합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: nginx
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app.kubernetes.io/name
                  operator: In
                  values:
                  - nginx
              topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx:1.23.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

requiredDuringSchedulingIgnoredDuringExecution

이 유형은 스케줄러가 무조건 다른 노드에 Pod을 위치시키도록 요구합니다. 이 조건을 충족하지 않으면 스케줄링되지 않습니다. 이 옵션은 엄격한 Pod 분산 요구 사항이 필요한 경우에 적합합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: nginx
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app.kubernetes.io/name
                operator: In
                values:
                - nginx
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx:1.23.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

 

결론적으로, preferredDuringSchedulingIgnoredDuringExecution은 유연한 Pod 분산을 제공하는 반면, requiredDuringSchedulingIgnoredDuringExecution은 엄격한 Pod 분산 요구 사항을 강제합니다. 사용 사례에 따라 필요한 수준의 Pod 분산을 선택하여 구성할 수 있습니다.

728x90