

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# IngressClass를 생성하여 Application Load Balancer 구성
<a name="auto-configure-alb"></a>

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

 AWS에서는 Application Load Balancer(ALB)를 사용하여 HTTP 및 HTTPS 트래픽을 제공할 것을 제안합니다. Application Load Balancer는 요청의 내용을 기반으로 요청을 라우팅할 수 있습니다. Application Load Balancer에 대한 자세한 내용은 [What is Elastic Load Balancing?](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)을 참조하세요.

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

 **개요** 

1. 인터넷에 노출하려는 워크로드를 생성합니다.

1. SSL/TLS 및 VPC 서브넷에 사용할 인증서와 같은 AWS 특정 구성 값을 지정하여 `IngressClassParams` 리소스를 생성합니다.

1. EKS Auto Mode가 `IngressClass` 리소스의 컨트롤러가 되도록 지정하는 리소스를 생성합니다.

1. HTTP 경로 및 포트를 클러스터 워크로드와 연결하는 `Ingress` 리소스를 생성합니다.

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

## 사전 조건
<a name="_prerequisites"></a>
+ Amazon EKS 클러스터에서 활성화된 EKS Auto Mode
+ 클러스터에 연결하도록 구성된 Kubectl
  + `kubectl apply -f <filename>`를 사용하여 아래의 샘플 구성 YAML 파일을 클러스터에 적용할 수 있습니다.

**참고**  
EKS 자동 모드에서는 퍼블릭 및 프라이빗 서브넷을 식별하기 위해 서브넷 태그가 필요합니다.  
`eksctl`로 클러스터를 생성한 경우 이미 이러한 태그가 있는 것입니다.  
[EKS 자동 모드의 태그 서브넷](tag-subnets-auto.md) 방법에 대해 알아봅니다.

## 1단계: 워크로드 생성
<a name="_step_1_create_a_workload"></a>

먼저 인터넷에 공개하려는 워크로드를 생성합니다. 배포 또는 서비스와 같이 HTTP 트래픽을 제공하는 모든 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
```

위에 나열된 리소스는 기본 네임스페이스에서 생성됩니다. 다음 명령을 실행하여 확인할 수 있습니다.

```
kubectl get all -n default
```

## 2단계: IngressClassParams 생성
<a name="_step_2_create_ingressclassparams"></a>

`IngressClassParams` 객체를 생성하여 Application Load Balancer에 대한 AWS 특정 구성 옵션을 지정합니다. 이 예제에서는 다음 단계에서 사용할 `alb`라는 `IngressClassParams` 리소스를 생성합니다. 이 리소스는 `alb-ingressclassparams.yaml`이라는 파일에서 로드 밸런서 체계를 `internet-facing`으로 지정합니다.

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

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

```
kubectl apply -f alb-ingressclassparams.yaml
```

## 3단계: IngressClass 생성
<a name="_step_3_create_ingressclass"></a>

`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 참조](#ingress-reference) 섹션을 참조하세요.

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

```
kubectl apply -f alb-ingressclass.yaml
```

## 4단계: 수신 생성
<a name="_step_4_create_ingress"></a>

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

이 리소스 구성에 대한 자세한 내용은 Kubernetes 설명서의 [Ingress](https://kubernetes.io/docs/concepts/services-networking/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단계: 상태 확인
<a name="_step_5_check_status"></a>

`kubectl`을 사용하여 `Ingress`의 상태를 찾습니다. 로드 밸런서를 사용할 수 있기까지 몇 분 정도 걸릴 수 있습니다.

이전 단계에서 설정한 `Ingress` 리소스의 이름을 사용합니다. 예제:

```
kubectl get ingress 2048-ingress
```

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

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

웹 브라우저에서 서비스를 보려면 `Ingress` 복구에 지정된 포트와 경로를 검토합니다.

## 6단계: 정리
<a name="_step_6_cleanup"></a>

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

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

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

## IngressClassParams 참조
<a name="ingress-reference"></a>

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


| 필드 | 설명 | 예시 값 | 
| --- | --- | --- | 
|  `scheme`  | ALB가 내부인지 인터넷 연결인지를 정의 |  `internet-facing`  | 
|  `namespaceSelector`  | 이 IngressClass를 사용할 수 있는 네임스페이스 제한 |  `environment: prod`  | 
|  `group.name`  | 여러 수신을 그룹화하여 단일 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`  | 

## 고려 사항
<a name="_considerations"></a>
+ IngressClass에서 주석을 사용하여 EKS Auto Mode로 로드 밸런서를 구성할 수 없습니다. IngressClass 구성은 IngressClassParams를 통해 완료되어야 합니다. 그러나 개별 수신 리소스에 주석을 사용하여 로드 밸런서 동작(예: `alb.ingress.kubernetes.io/security-group-prefix-lists` 또는 `alb.ingress.kubernetes.io/conditions.*`)을 구성할 수 있습니다.
+ EKS 자동 모드에서 [ListenerAttribute](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_ListenerAttribute.html)를 설정할 수 없습니다.
+ Kubernetes에서 AWS 로드 밸런서 리소스로 태그 전파를 활성화하려면 클러스터 IAM 역할을 업데이트해야 합니다. 자세한 내용은 [EKS Auto 리소스에 대한 사용자 지정 AWS 태그](auto-cluster-iam-role.md#tag-prop) 섹션을 참조하세요.
+ EKS Auto Mode 또는 자체 관리형 AWS 로드 밸런서 컨트롤러와 리소스를 연결하는 방법에 대한 자세한 내용은 [마이그레이션 참조](migrate-auto.md#migration-reference) 섹션을 참조하세요.
+ 로드 밸런서 관련 문제 해결에 대한 자세한 내용은 [EKS Auto Mode 문제 해결](auto-troubleshoot.md) 섹션을 참조하세요.
+ EKS Auto Mode의 로드 밸런싱 기능 사용에 대한 자세한 고려 사항은 [로드 밸런싱](auto-networking.md#auto-lb-consider) 섹션을 참조하세요.

다음 표에서는 EKS Auto Mode에 대한 IngressClassParams, Ingress 주석, TargetGroupBinding 구성의 변경 사항을 자세히 비교합니다. 이 표에서는 API 버전 변경, 사용 중단된 기능, 업데이트된 파라미터 이름을 포함하여 EKS Auto Mode의 로드 밸런싱 기능과 오픈 소스 로드 밸런서 컨트롤러 간의 주요 차이점을 강조합니다.

### IngressClassParams
<a name="_ingressclassparams"></a>


| 이전 | New | 설명 | 
| --- | --- | --- | 
|  `elbv2.k8s.aws/v1beta1`  |  `eks.amazonaws.com/v1`  | API 버전 변경 | 
|  `spec.certificateArn`  |  `spec.certificateARNs`  | 여러 인증서 ARN 지원 | 
|  `spec.subnets.tags`  |  `spec.subnets.matchTags`  | 서브넷 일치 스키마가 변경됨 | 
|  `spec.listeners.listenerAttributes`  | 지원되지 않음 | 아직 EKS 자동 모드에서 지원하지 않음 | 

### 수신 주석
<a name="_ingress_annotations"></a>


| 이전 | New | 설명 | 
| --- | --- | --- | 
|  `kubernetes.io/ingress.class`  | 지원되지 않음 | 수신 객체에서 `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/shield-advanced-protection`  | 지원되지 않음 | Shield 통합 비활성화됨 | 
|  `alb.ingress.kubernetes.io/auth-type: oidc`  | 지원되지 않음 | OIDC 인증 유형은 현재 지원되지 않습니다. | 

### TargetGroupBinding
<a name="_targetgroupbinding"></a>


| 이전 | New | 설명 | 
| --- | --- | --- | 
|  `elbv2.k8s.aws/v1beta1`  |  `eks.amazonaws.com/v1`  | API 버전 변경 | 
|  `spec.targetType` 선택 사항 |  `spec.targetType` 필수 | 명시적 대상 유형 사양 | 
|  `spec.networking.ingress.from`  | 지원되지 않음 | 보안 그룹 없이 더 이상 NLB를 지원하지 않음 | 

사용자 지정 TargetGroupBinding 기능을 사용하려면 대상 그룹에 클러스터 이름을 포함하는 eks:eks-cluster-name 태그를 지정하여 컨트롤러에 필요한 IAM 권한을 부여해야 합니다. TargetGroupBinding 리소스 또는 클러스터가 삭제되면 컨트롤러가 대상 그룹을 삭제합니다.