배포 모범 사례

배포 모범 사례 (Deployment Best Practices)

Istio 배포에서 최대한의 효과를 얻기 위한 일반 원칙을 소개해요. 잘못된 구성 변경의 영향을 제한하고 배포 관리를 더 쉽게 만드는 데 목적이 있어요.

출처: Istio 문서

본문

Istio 배포에서 최대한의 효과를 얻는 데 도움이 되는 다음과 같은 일반 원칙을 확인했어요. 이 모범 사례들은 잘못된 구성 변경의 영향을 제한하고 배포 관리를 더 쉽게 만들기 위한 것이에요.

더 적은 수의 클러스터에 배포하기

작은 클러스터를 많이 배포하는 대신, 큰 클러스터를 적은 수로 배포하세요. 배포에 클러스터를 추가하는 대신 네임스페이스 테넌시를 사용해 큰 클러스터를 관리하는 것이 모범 사례예요. 이 방식을 따르면 존 또는 리전당 하나 또는 두 개의 클러스터에 Istio를 배포할 수 있어요. 그런 다음 리전 또는 존당 하나의 클러스터에 컨트롤 플레인을 배포해서 안정성을 추가할 수 있어요.

사용자 근처에 클러스터 배포하기

최종 사용자와의 지리적 근접성(geographic proximity) 을 위해 전 세계에 클러스터를 배포에 포함하세요. 근접성은 배포의 지연 시간을 낮게 유지하는 데 도움이 돼요.

여러 가용성 존에 걸쳐 배포하기

각 지리적 리전 내의 여러 가용성 리전과 존에 걸쳐 클러스터를 배포에 포함하세요. 이 방식은 배포의 장애 도메인(failure domain) 크기를 제한하고 전역 장애를 피하는 데 도움이 돼요.

여러 istiod 레플리카 실행하기

기본적으로 istiod는 단일 레플리카로 배포돼요. 그 레플리카를 사용할 수 없게 되면(예: 노드 드레인 또는 롤링 업데이트 중) sidecar 주입용 muating webhook(failurePolicy: Fail)이 클러스터 전체에서 모든 파드 생성 요청을 거부해요. 이는 실질적으로 단일 istiod 레플리카가 파드를 생성하는 모든 작업에 대해 단일 장애 지점(single point of failure)이 되게 해요.

이를 피하려면 istio/istiod 차트의 Helm values override에서 autoscaleMin을 최소 2로 설정하세요. 이 차트는 기본적으로 autoscaleEnabled: true로 배포되므로 Horizontal Pod Autoscaler가 레플리카 수를 제어해요. 최소값을 2로 설정하면 중단 중에도 레플리카가 하나 이상 사용 가능하게 보장돼요.

autoscaleMin: 2

레플리카를 노드와 존에 분산시키려면 istio/istiod 차트의 Helm values override에 다음을 추가하세요. 노드 수준 분리를 위해 requiredDuringSchedulingIgnoredDuringExecution을 사용해 레플리카가 서로 다른 노드에서 실행되도록 보장하세요. 용량이 부족하면 스케줄할 수 없는 파드가 두 레플리카를 한 노드에 조용히 함께 배치하는 대신 문제를 표면화해요. 존 수준 분산에는 preferredDuringSchedulingIgnoredDuringExecution을 사용해 레플리카보다 더 적은 존을 가진 클러스터에서 스케줄링을 막지 않도록 하세요.

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - istiod
      topologyKey: kubernetes.io/hostname
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - istiod
        topologyKey: topology.kubernetes.io/zone

더 알아보기 (Learn more)