본문 바로가기

Cloud-native/Istio

[Istio]Configuring istio-ingressgateway with AWS NLB

AWS Load Balancer Controller Annotations

AWS EKS Network Load Balancing

Istio Ingress Gateway using Network Load Balancer on EKS

개요

  • 목표: istio-ingressgateway의 로드밸런서를 CLB에서 NLB로 변경
  • 배경: Istio Helm Chart 설치 시 기본적으로 istio-ingressgateway는 AWS CLB로 설정됨

주의사항

  • 교차 영역 로드밸런싱을 활성화해야 함
  • AWS NLB는 Kubernetes에서 Alpha 기능으로, 프로덕션 환경에서 사용 시 주의 필요
  • Kubernetes Bug #69264로 인해, 동일한 영역에서 Istio를 실행하는 두 개 이상의 Kubernetes 클러스터에서 AWS NLB 사용이 제한될 수 있음

NLB 설정 방법

Istio Gateway의 Helm 차트 values.yaml 파일에서 service 섹션을 수정하여 NLB 설정을 추가할 수 있습니다.

service:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-attributes: load_balancing.cross_zone.enabled=true
  type: LoadBalancer

이미 설치된 Istio를 업그레이드하면서 NLB 설정을 적용할 수 있습니다.

helm upgrade istio-ingressgateway -n istio-system ./istio-charts/gateway -f custom-values.yaml

추가 설명

  • annotations 없이 type이 LoadBalancer인 경우: CLB 생성
  • annotations 추가 후 type이 LoadBalancer인 경우: NLB 생성
  • aws-load-balancer-nlb-target-type: ip: NLB가 파드 IP를 직접 대상으로 사용
  • aws-load-balancer-scheme: internet-facing: 인터넷 연결 NLB 생성 (내부용은 internal)
  • aws-load-balancer-type: external: AWS Load Balancer Controller 관리 외부 로드밸런서 사용
  • load_balancing.cross_zone.enabled=true: 교차 영역 로드밸런싱 활성화

[참고]Annotations options

istio-ingressgateway 서비스에 다음 annotations를 추가하여 프로덕션 환경에 적합한 설정을 할 수 있습니다:

metadata:
  annotations:
    # SSL 인증서 설정
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: <ACM-인증서-ARN>
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
    service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy: "ELBSecurityPolicy-TLS13-1-2-2021-06"

    # 보안 그룹 설정 (트래픽 제한)
    service.beta.kubernetes.io/load-balancer-source-ranges: "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"

    # 교차 영역 로드 밸런싱
    service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"

    # 액세스 로그 활성화
    service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true"
    service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "<your-s3-bucket>"
    service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "ingress-logs"

    # 헬스 체크 설정
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: "HTTP"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "15021"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: "/healthz/ready"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval: "10"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-timeout: "5"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-healthy-threshold: "2"
    service.beta.kubernetes.io/aws-load-balancer-healthcheck-unhealthy-threshold: "2"

    # 추가 리소스 태그
    service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: "Environment=prod,Project=istio"

    # 타겟 그룹 속성: 등록 취소 지연 시간을 조정하여 연결 드레이닝을 최적화합니다.
    service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: deregistration_delay.timeout_seconds=30