Application Load Balancer 구성용 IngressClass 생성하기

Application Load Balancer 구성용 IngressClass 생성하기

EKS Auto Mode는 클러스터 앱을 인터넷에 노출하는 것을 포함한 일상적인 로드 밸런싱 작업을 자동화합니다.

AWS는 HTTP와 HTTPS 트래픽을 서비스하기 위해 Application Load Balancers(ALB)를 사용할 것을 권장합니다. Application Load Balancer는 요청의 콘텐츠를 기반으로 요청을 라우팅할 수 있어요. Application Load Balancers에 대한 자세한 내용은 What is Elastic Load Balancing?을 참고하세요.

EKS Auto Mode는 Application Load Balancers(ALB)를 생성·구성합니다. 예를 들어 Ingress Kubernetes 객체를 만들면 EKS Auto Mode가 로드 밸런서를 만들고 클러스터 워크로드로 트래픽을 라우팅하도록 구성합니다.

출처: 문서

본문

개요

  1. 인터넷에 노출하려는 워크로드를 만듭니다.
  2. SSL/TLS에 사용할 인증서, VPC 서브넷 같은 AWS 특화 구성 값을 지정하는 IngressClassParams 리소스를 만듭니다.
  3. EKS Auto Mode가 리소스의 컨트롤러가 될 것임을 지정하는 IngressClass 리소스를 만듭니다.
  4. HTTP 경로와 포트를 클러스터 워크로드와 연결하는 Ingress 리소스를 만듭니다.

EKS Auto Mode는 Ingress 리소스에 지정된 워크로드를 가리키는 Application Load Balancer를 만들며, IngressClassParams 리소스에 지정된 로드 밸런서 구성을 사용합니다.

사전 조건

  • Amazon EKS 클러스터에서 EKS Auto Mode 활성화
  • 클러스터에 연결하도록 kubectl 구성

kubectl apply -f 로 아래 샘플 구성 YAML 파일을 클러스터에 적용할 수 있어요.

Note: EKS Auto Mode는 공용·프라이빗 서브넷을 식별하려면 서브넷 태그가 필요합니다. eksctl로 클러스터를 만들었다면 이미 이 태그가 있어요. Tag subnets for EKS Auto Mode 방법을 배워 보세요.

1단계: 워크로드 생성

시작하려면 인터넷에 노출하려는 워크로드를 만듭니다. HTTP 트래픽을 서비스하는 Deployment나 Service 같은 어떤 Kubernetes 리소스든 될 수 있어요. 이 예시는 포트 80에서 수신하는 service-2048이라는 간단한 HTTP 서비스를 사용합니다. 2048-deployment-service.yaml 매니페스트를 적용해 이 서비스와 배포를 만듭니다.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 2
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
        - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
          imagePullPolicy: Always
          name: app-2048
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: app-2048

구성을 클러스터에 적용합니다.

kubectl apply -f 2048-deployment-service.yaml

위 리소스들은 default 네임스페이스에 생성됩니다. 다음 명령으로 확인할 수 있어요.

kubectl get all -n default

2단계: IngressClassParams 생성

Application Load Balancer에 대한 AWS 특화 구성 옵션을 지정하는 IngressClassParams 객체를 만듭니다. 이 예시에서는 alb-ingressclassparams.yaml 파일에 로드 밸런서 scheme을 internet-facing으로 지정하는 alb라는 IngressClassParams 리소스(다음 단계에서 사용)를 만듭니다.

apiVersion: eks.amazonaws.com/v1
kind: IngressClassParams
metadata:
  name: alb
spec:
  scheme: internet-facing

구성을 클러스터에 적용합니다.

kubectl apply -f alb-ingressclassparams.yaml

3단계: IngressClass 생성

alb-ingressclass.yaml 파일에서 IngressClassParams 리소스에 설정된 AWS 특화 구성 값을 참조하는 IngressClass를 만듭니다. IngressClass의 이름을 기록하세요. 이 예시에서는 IngressClass와 IngressClassParams 모두 alb로 이름이 지정됩니다.

is-default-class 어노테이션을 사용해 Ingress 리소스가 기본적으로 이 클래스를 사용해야 하는지 제어합니다.

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: alb
  annotations:
    # Use this annotation to set an IngressClass as Default
    # If an Ingress doesn't specify a class, it will use the Default
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  # Configures the IngressClass to use EKS Auto Mode
  controller: eks.amazonaws.com/alb
  parameters:
    apiGroup: eks.amazonaws.com
    kind: IngressClassParams
    # Use the name of the IngressClassParams set in the previous step
    name: alb

구성 옵션에 대한 자세한 내용은 IngressClassParams Reference를 참고하세요.

구성을 클러스터에 적용합니다.

kubectl apply -f alb-ingressclass.yaml

4단계: Ingress 생성

alb-ingress.yaml 파일에 Ingress 리소스를 만듭니다. 이 리소스의 목적은 Application Load Balancer의 경로와 포트를 클러스터의 워크로드와 연결하는 것입니다. 이 예시에서는 포트 80의 service-2048 서비스로 트래픽을 라우팅하는 2048-ingress라는 Ingress 리소스를 만듭니다.

이 리소스 구성에 대한 자세한 내용은 Kubernetes Documentation의 Ingress를 참고하세요.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: 2048-ingress
spec:
  # this matches the name of IngressClass.
  # this can be omitted if you have a default ingressClass in cluster: the one with ingressclass.kubernetes.io/is-default-class: "true"  annotation
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /*
            pathType: ImplementationSpecific
            backend:
              service:
                name: service-2048
                port:
                  number: 80

구성을 클러스터에 적용합니다.

kubectl apply -f alb-ingress.yaml

5단계: 상태 확인

kubectl로 Ingress의 상태를 확인합니다. 로드 밸런서를 사용할 수 있게 되기까지 몇 분 걸릴 수 있어요. 이전 단계에서 설정한 Ingress 리소스 이름을 사용합니다. 예:

kubectl get ingress 2048-ingress

리소스가 준비되면 로드 밸런서의 도메인 이름을 가져옵니다.

kubectl get ingress 2048-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'

웹 브라우저에서 서비스를 보려면 Ingress 리소스에 지정된 포트와 경로를 확인하세요.

6단계: 정리

로드 밸런서를 정리하려면 다음 명령을 사용합니다.

kubectl delete ingress 2048-ingress
kubectl delete ingressclass alb
kubectl delete ingressclassparams alb

EKS Auto Mode가 AWS 계정의 연결된 로드 밸런서를 자동으로 삭제합니다.

IngressClassParams 참조

아래 표는 일반적으로 사용되는 구성 옵션에 대한 빠른 참조입니다.

필드 설명 예시 값
scheme ALB가 내부인지 internet-facing인지 정의 internet-facing
namespaceSelector 이 IngressClass를 사용할 수 있는 네임스페이스를 제한 environment: prod
group.name 여러 Ingress를 그룹화해 단일 ALB를 공유 retail-apps
ipAddressType ALB의 IP 주소 유형 설정 dualstack
subnets.ids ALB 배포용 서브넷 ID 목록 subnet-xxxx, subnet-yyyy
subnets.tags ALB용 서브넷을 선택하는 태그 필터 Environment: prod
certificateARNs 사용할 SSL 인증서의 ARN arn:aws:acm:region:account:certificate/id
tags AWS 리소스용 커스텀 태그 Environment: prod, Team: platform
loadBalancerAttributes 로드 밸런서 특정 속성 idle_timeout.timeout_seconds: 60

고려 사항

  • EKS Auto Mode에서 로드 밸런서를 구성하기 위해 IngressClass에 어노테이션을 사용할 수 없습니다. IngressClass 구성은 IngressClassParams를 통해 해야 해요. 하지만 개별 Ingress 리소스에는 어노테이션을 사용해 로드 밸런서 동작을 구성할 수 있습니다(예: alb.ingress.kubernetes.io/security-group-prefix-lists, alb.ingress.kubernetes.io/conditions.*).
  • EKS Auto Mode로 ListenerAttribute를 설정할 수 없습니다.
  • Kubernetes에서 AWS Load Balancer 리소스로 태그 전파를 활성화하려면 Cluster IAM Role을 업데이트해야 합니다. 자세한 내용은 Custom AWS tags for EKS Auto resources를 참고하세요.
  • 리소스가 EKS Auto Mode 또는 자체 관리형 AWS Load Balancer Controller 중 무엇과 연관될지에 대한 정보는 Migration reference를 참고하세요.
  • 로드 밸런서 문제 해결은 Troubleshoot EKS Auto Mode를 참고하세요.
  • EKS Auto Mode의 로드 밸런싱 기능 사용에 대한 더 많은 고려 사항은 Load balancing을 참고하세요.

다음 표는 EKS Auto Mode에 대한 IngressClassParams, Ingress 어노테이션, TargetGroupBinding 구성 변경의 상세 비교입니다. 이 표들은 API 버전 변경, 사용 중단 기능, 업데이트된 매개변수 이름을 포함한 EKS Auto Mode의 로드 밸런싱 기능과 오픈 소스 로드 밸런서 컨트롤러 간의 주요 차이점을 강조합니다.

IngressClassParams:

이전 새 설명
elbv2.k8s.aws/v1beta1 eks.amazonaws.com/v1 API 버전 변경
spec.certificateArn spec.certificateARNs 여러 인증서 ARN 지원
spec.subnets.tags spec.subnets.matchTags 서브넷 매칭 스키마 변경
spec.listeners.listenerAttributes 지원 안 함 EKS Auto Mode가 아직 지원하지 않음

Ingress 어노테이션:

이전 새 설명
kubernetes.io/ingress.class 지원 안 함 Ingress 객체에 spec.ingressClassName 사용
alb.ingress.kubernetes.io/group.name 지원 안 함 IngressClass에서만 그룹 지정
alb.ingress.kubernetes.io/waf-acl-id 지원 안 함 대신 WAF v2 사용
alb.ingress.kubernetes.io/web-acl-id 지원 안 함 대신 WAF v2 사용
alb.ingress.kubernetes.io/wafv2-acl-name 지원 안 함 곧 지원 예정
alb.ingress.kubernetes.io/dry-run-plan 지원 안 함 dry-run plan은 현재 미지원
alb.ingress.kubernetes.io/create-acm-cert 지원 안 함 ACM 인증서 생성 현재 미지원
alb.ingress.kubernetes.io/acm-pca-arn 지원 안 함 ACM PCA ARN 현재 미지원
alb.ingress.kubernetes.io/auth-type: oidc 지원 안 함 OIDC Auth Type 현재 미지원

TargetGroupBinding:

이전 새 설명
elbv2.k8s.aws/v1beta1 eks.amazonaws.com/v1 API 버전 변경
spec.targetType 선택 spec.targetType 필수 명시적 대상 유형 지정
spec.networking.ingress.from 지원 안 함 더 이상 보안 그룹 없는 NLB 미지원

커스텀 TargetGroupBinding 기능을 사용하려면 컨트롤러에 필요한 IAM 권한을 부여하도록 대상 그룹에 eks:eks-cluster-name 태그(값은 클러스터 이름)를 태깅해야 합니다. 컨트롤러는 TargetGroupBinding 리소스나 클러스터가 삭제되면 대상 그룹을 삭제한다는 점을 유의하세요.

더 알아보기 (Learn more)