

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

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

# AWS 로드 밸런서 컨트롤러를 통해 인터넷 트래픽 라우팅
<a name="aws-load-balancer-controller"></a>

**작은 정보**  
 향후 예정된 Amazon EKS 워크숍에 [등록](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)합니다.

AWS 로드 밸런서 컨트롤러는 Kubernetes 클러스터의 AWS Elastic Load Balancer를 관리합니다. 컨트롤러를 사용하여 클러스터 앱을 인터넷에 노출할 수 있습니다. 컨트롤러는 클러스터 Service 또는 Ingress 리소스를 가리키는 AWS 로드 밸런서를 프로비저닝합니다. 다시 말해 컨트롤러는 클러스터의 여러 포드를 가리키는 단일 IP 주소 또는 DNS 이름을 생성합니다.

![\[아키텍처 다이어그램 인터넷 사용자로부터 Amazon Load Balancer로 들어오는 트래픽을 보여주는 그림 Amazon Load Balancer는 클러스터의 포드에 트래픽을 분산합니다.\]](http://docs.aws.amazon.com/ko_kr/eks/latest/userguide/images/lbc-overview.png)


컨트롤러는 Kubernetes Ingress 또는 Service 리소스를 감시합니다. 이에 대한 응답으로 해당 AWS Elastic Load Balancing 리소스를 생성합니다. Kubernetes 리소스에 주석을 적용하여 로드 밸런서의 특정 동작을 구성할 수 있습니다. 예를 들어, 주석을 사용하여 로드 밸런서에 AWS 보안 그룹을 연결할 수 있습니다.

이 컨트롤러는 다음 리소스를 프로비저닝합니다.

 **Kubernetes `Ingress` **   
LBC는 Kubernetes `Ingress` 생성 시 [AWS Application Load Balancer(ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)를 생성합니다. [Ingress 리소스에 적용할 수 있는 주석을 검토합니다.](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)

 **`LoadBalancer` 유형의 Kubernetes 서비스**   
LBC는 `LoadBalancer` 유형의 Kubernetes 서비스 생성 시 [AWS Network Load Balancer(NLB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html)를 생성합니다. [Service 리소스에 적용할 수 있는 주석을 검토합니다.](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/)  
과거에는 *인스턴스* 대상에 대해 Kubernetes Network Load Balancer를 사용했지만 *IP* 대상에 대해서는 LBC를 사용했습니다. AWS Load Balancer Controller 버전 `2.3.0` 이상에서 대상 유형 중 하나를 사용하여 NLB를 생성할 수 있습니다. NLB 대상 유형에 대한 자세한 내용은 Network Load Balancer 사용 설명서에서 [대상 유형](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#target-type)을 참조하세요.

컨트롤러는 GitHub에서 관리되는 [오픈 소스 프로젝트](https://github.com/kubernetes-sigs/aws-load-balancer-controller)입니다.

컨트롤러를 배포하기 전에 [Application Load Balancer를 사용한 애플리케이션 및 HTTP 트래픽 라우팅](alb-ingress.md)과 [Network Load Balancer를 사용하여 TCP 및 UDP 트래픽 라우팅](network-load-balancing.md)의 전제 조건과 고려 사항을 검토하는 것이 좋습니다. 이러한 주제에서는 AWS 로드 밸런서가 포함된 샘플 앱을 배포합니다.

 **Kubernetes `Gateway` API**   
AWS 로드 밸런서 컨트롤러 버전 `2.14.0` 이상에서는 Kubernetes `Gateway`를 생성할 때 LBC에서 [AWS Application Load Balancer(ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)를 생성합니다. Kubernetes 게이트웨이는 수신보다 더 많은 구성을 표준화합니다. 이때 많은 공통 옵션에 사용자 지정 주석이 필요합니다. [게이트웨이 리소스에 적용할 수 있는 구성을 검토합니다.](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/gateway/gateway/) `Gateway` API에 대한 자세한 내용은 Kubernetes 설명서의 [Gateway API](https://kubernetes.io/docs/concepts/services-networking/gateway/)를 참조하세요.

## 컨트롤러 설치
<a name="lbc-overview"></a>

AWS Load Balancer Controller를 설치하려면 다음 절차 중 하나를 사용합니다.
+ Amazon EKS를 처음 사용하는 경우 AWS Load Balancer Controller 설치를 간소화할 수 있으므로 Helm을 사용하여 설치하는 것을 권장합니다. 자세한 내용은 [Helm을 사용하여 AWS Load Balancer Controller 설치](lbc-helm.md) 섹션을 참조하세요.
+ 퍼블릭 컨테이너 레지스트리에 대한 네트워크 액세스가 제한된 클러스터와 같은 고급 구성의 경우 Kubernetes 매니페스트를 사용합니다. 자세한 내용은 [매니페스트를 사용하여 AWS Load Balancer Controller 설치](lbc-manifest.md) 섹션을 참조하세요.

## 더 이상 사용되지 않는 컨트롤러 버전에서 마이그레이션
<a name="lbc-deprecated"></a>
+ 사용되지 않는 AWS Load Balancer Controller 버전이 설치된 경우 [더 이상 사용되지 않는 ALB 수신 컨트롤러에서 앱 마이그레이션](lbc-remove.md) 방법을 알아봅니다.
+ 사용되지 않는 버전은 업그레이드할 수 없습니다. 이를 제거하고 최신 AWS Load Balancer Controller 버전을 설치해야 합니다.
+ 사용되지 않는 버전은 다음과 같습니다.
  +  AWS ALB Ingress Controller for Kubernetes("Ingress Controller"), 이전 AWS Load Balancer Controller.
  + `0.1.x ` 버전의 AWS Load Balancer Controller

## 레거시 클라우드 공급자
<a name="lbc-legacy"></a>

Kubernetes에는 AWS에 대한 레거시 클라우드 제공업체가 포함됩니다. 레거시 클라우드 제공업체는 AWS Load Balancer Controller와 마찬가지로 AWS 로드 밸런서를 프로비저닝할 수 있습니다. 레거시 클라우드 공급자가 Classic Load Balancer를 생성합니다. AWS Load Balancer Controller를 설치하지 않은 경우 Kubernetes에서 기본적으로 레거시 클라우드 제공업체를 사용합니다. AWS Load Balancer Controller를 설치하고 레거시 클라우드 제공업체 사용을 자제해야 합니다.

**중요**  
버전 2.5 이상에서는 AWS Load Balancer Controller가 `type: LoadBalancer`와 함께 Kubernetes *서비스* 리소스의 기본 컨트롤러가 되며 각 서비스에 대한 AWS Network Load Balancer(NLB)를 만듭니다. 이는 서비스에 대한 변형 웹훅을 만들어 이를 수행하며, 이는 `type: LoadBalancer`의 새 서비스에 대한 `spec.loadBalancerClass` 필드를 `service.k8s.aws/nlb`(으)로 설정합니다. 차트 Helm 값을 `enableServiceMutatorWebhook`에서 `false`(으)로 설정하여 이 기능을 끄고 [레거시 클라우드 공급자](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/#legacy-cloud-provider)를 기본 컨트롤러로 사용하도록 되돌릴 수 있습니다. 이 기능을 끄지 않는 한 클러스터는 서비스에 새 Classic Load Balancer를 프로비저닝하지 않습니다. 기존 Classic Load Balancer는 계속 작동합니다.

# Helm을 사용하여 AWS Load Balancer Controller 설치
<a name="lbc-helm"></a>

**작은 정보**  
 향후 예정된 Amazon EKS 워크숍에 [등록](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)합니다.

**작은 정보**  
Amazon EKS Auto Mode를 사용하면 네트워킹 추가 기능을 설치하거나 업그레이드할 필요가 없습니다. Auto Mode에는 포드 네트워킹 및 로드 밸런싱 기능이 포함되어 있습니다.  
자세한 내용은 [EKS Auto Mode를 사용하여 클러스터 인프라 자동화](automode.md) 섹션을 참조하세요.

이 주제에서는 Kubernetes용 패키지 관리자인 Helm과 `eksctl`을 사용하여 AWS Load Balancer Controller를 설치하는 방법을 설명합니다. 컨트롤러는 기본 옵션으로 설치됩니다. 주석을 사용한 구성에 관한 세부 정보를 포함한 컨트롤러에 대한 자세한 내용은 GitHub의 [AWS Load Balancer Controller Documentation](https://kubernetes-sigs.github.io/aws-load-balancer-controller/)를 참조하세요.

다음 단계에서 모든 예제 값을 고유한 값으로 바꿉니다.

## 사전 조건
<a name="lbc-prereqs"></a>

이 자습서를 시작하기 전에 다음 단계를 완료해야 합니다.
+ Amazon EKS 클러스터를 생성합니다. 파일을 만들려면 [Amazon EKS 시작하기](getting-started.md) 섹션을 참조하세요.
+ 로컬 머신에 [헬름](https://helm.sh/docs/helm/helm_install/)을 설치합니다.
+ Kubernetes용 Amazon VPC CNI 플러그인, `kube-proxy` 및 CoreDNS 추가 기능이 [서비스 계정 토큰](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)에 나열된 최소 버전인지 확인합니다.
+ AWS Elastic Load Balancing 개념에 대해 알아보세요. 자세한 내용은 [Elastic Load Balancing User Guide](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/)를 참조하세요.
+ Kubernetes [서비스](https://kubernetes.io/docs/concepts/services-networking/service/) 및 [수신](https://kubernetes.io/docs/concepts/services-networking/ingress/) 리소스에 대해 알아봅니다.

### 고려 사항
<a name="lbc-considerations"></a>

이 페이지의 구성 단계를 진행하기 전에 다음 사항을 고려하세요.
+ IAM 정책과 역할(`AmazonEKSLoadBalancerControllerRole`)은 동일한 AWS 계정의 여러 EKS 클러스터에서 재사용할 수 있습니다.
+ 역할(`AmazonEKSLoadBalancerControllerRole`)이 원래 생성된 동일한 클러스터에 컨트롤러를 설치하는 경우 역할이 있는지 확인한 후 [2단계: Load Balancer Controller 설치](#lbc-helm-install)로 이동합니다.
+ 서비스 계정에 대한 IAM 역할(IRSA)을 사용하는 경우 각 클러스터에 대해 IRSA를 설정해야 하며 역할의 신뢰 정책에서 OpenID Connect(OIDC) 공급자 ARN은 각 EKS 클러스터에 대해 특정합니다. 또한 기존 `AmazonEKSLoadBalancerControllerRole`이 있는 새 클러스터에 컨트롤러를 설치하는 경우 새 클러스터의 OIDC 공급자를 포함하도록 역할의 신뢰 정책을 업데이트하고 적절한 역할 주석으로 새 서비스 계정을 생성합니다. OIDC 공급자가 이미 있는지 아니면 생성해야 하는지 확인하려면 [클러스터에 대한 IAM OIDC 공급자 생성](enable-iam-roles-for-service-accounts.md) 섹션을 참조하세요.

## 1단계: `eksctl`을 사용하여 IAM 역할 생성
<a name="lbc-helm-iam"></a>

다음 단계는 AWS Load Balancer Controller **v2.14.1** 릴리스 버전을 참조하세요. 모든 릴리스에 대한 자세한 내용은 GitHub의 [AWS Load Balancer Controller Release Page](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/)를 참조하세요.

1. 사용자 대신 AWS API를 직접 호출할 수 있는 AWS 로드 밸런서 컨트롤러의 IAM 정책을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```
   + 정부 또는 중국 리전과 같은 비표준 AWS 파티션인 경우 [GitHub의 정책을 검토](https://github.com/kubernetes-sigs/aws-load-balancer-controller/tree/main/docs/install)하고 해당 리전에 적합한 정책을 다운로드합니다.

1. 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책을 만듭니다.

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```
**참고**  
AWS Management Console에서 정책을 보는 경우 콘솔에 **ELB** 서비스에 대한 경고는 표시되지만 **ELB v2** 서비스에 대한 경고는 표시되지 않습니다. 이는 정책의 작업 중 일부가 **ELB v2**에는 있지만 **ELB**에는 없기 때문에 발생합니다. **ELB**에 대한 경고는 무시해도 됩니다.

1. 클러스터 이름, 리전 코드 및 계정 ID의 값을 바꿉니다.

   ```
   eksctl create iamserviceaccount \
       --cluster=<cluster-name> \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region <aws-region-code> \
       --approve
   ```

## 2단계: AWS Load Balancer Controller 설치
<a name="lbc-helm-install"></a>

1. `eks-charts` 차트 Helm 리포지토리를 추가합니다. AWS에서는 [이 리포지토리](https://github.com/aws/eks-charts)를 GitHub에 유지합니다.

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. 최신 차트가 적용되도록 로컬 리포지토리를 업데이트합니다.

   ```
   helm repo update eks
   ```

1. AWS 로드 밸런서 컨트롤러를 설치합니다.

   [Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 대해 제한적인 액세스 권한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)이 있는 Amazon EC2 노드에 컨트롤러를 배포하거나 Fargate 또는 Amazon EKS Hybrid Nodes에 배포하는 경우, 다음 `helm` 명령에 다음 플래그를 추가합니다.
   +  `--set region=region-code ` 
   +  `--set vpcId=vpc-xxxxxxxx ` 

     *my-cluster*를 해당 클러스터의 이름으로 바꿉니다. 다음 명령에서 `aws-load-balancer-controller`는 이전 단계에서 생성한 Kubernetes 서비스 계정입니다.

     차트 Helm 구성에 관한 자세한 내용은 GitHub에서 [values.yaml](https://github.com/aws/eks-charts/blob/master/stable/aws-load-balancer-controller/values.yaml)을 참조하세요.

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --set clusterName=my-cluster \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller \
       --version 1.14.0
     ```

**중요**  
배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드할 때는 이전 명령에서 `upgrade`을 *설치*로 변경합니다.

`helm install` 명령은 컨트롤러의 사용자 지정 리소스 정의(CRD)를 자동으로 설치합니다. `helm upgrade` 명령은 설치하지 않습니다. `helm upgrade,`를 사용하는 경우 CRD를 수동으로 설치해야 합니다. 다음 명령을 실행하여 CRD를 설치합니다.

```
wget https://raw.githubusercontent.com/aws/eks-charts/master/stable/aws-load-balancer-controller/crds/crds.yaml
kubectl apply -f crds.yaml
```

## 3단계: 컨트롤러가 설치되어 있는지 확인
<a name="lbc-helm-verify"></a>

1. 컨트롤러가 설치되어 있는지 확인합니다.

   ```
   kubectl get deployment -n kube-system aws-load-balancer-controller
   ```

   예제 출력은 다음과 같습니다.

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

   Helm을 사용하여 배포한 경우 이전 출력이 표시됩니다. Kubernetes 매니페스트를 사용하여 배포한 경우 복제본이 하나만 있습니다.

1. 컨트롤러를 사용하여 AWS 리소스를 프로비저닝하기 전에 클러스터가 특정 요구 사항을 충족해야 합니다. 자세한 내용은 [Application Load Balancer를 사용하여 애플리케이션 및 HTTP 트래픽 라우팅](alb-ingress.md) 및 [Network Load Balancer를 사용하여 TCP 및 UDP 트래픽 라우팅](network-load-balancing.md) 섹션을 참조하세요.

# 매니페스트를 사용하여 AWS Load Balancer Controller 설치
<a name="lbc-manifest"></a>

**작은 정보**  
Amazon EKS Auto Mode를 사용하면 네트워킹 추가 기능을 설치하거나 업그레이드할 필요가 없습니다. Auto Mode에는 포드 네트워킹 및 로드 밸런싱 기능이 포함되어 있습니다.  
자세한 내용은 [EKS Auto Mode를 사용하여 클러스터 인프라 자동화](automode.md) 섹션을 참조하세요.

이 주제에서는 Kubernetes 매니페스트를 다운로드하고 적용하여 컨트롤러를 설치하는 방법을 설명합니다. GitHub에서 컨트롤러에 대한 전체 [설명서](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/)를 볼 수 있습니다.

다음 단계에서 모든 예제 값을 고유한 값으로 바꿉니다.

## 사전 조건
<a name="lbc-manifest-prereqs"></a>

이 자습서를 시작하기 전에 다음 단계를 완료해야 합니다.
+ Amazon EKS 클러스터를 생성합니다. 파일을 만들려면 [Amazon EKS 시작하기](getting-started.md) 섹션을 참조하세요.
+ 로컬 머신에 [헬름](https://helm.sh/docs/helm/helm_install/)을 설치합니다.
+ Kubernetes용 Amazon VPC CNI 플러그인, `kube-proxy` 및 CoreDNS 추가 기능이 [서비스 계정 토큰](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)에 나열된 최소 버전인지 확인합니다.
+ AWS Elastic Load Balancing 개념에 대해 알아보세요. 자세한 내용은 [Elastic Load Balancing User Guide](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/)를 참조하세요.
+ Kubernetes [서비스](https://kubernetes.io/docs/concepts/services-networking/service/) 및 [수신](https://kubernetes.io/docs/concepts/services-networking/ingress/) 리소스에 대해 알아봅니다.

### 고려 사항
<a name="lbc-manifest-considerations"></a>

이 페이지의 구성 단계를 진행하기 전에 다음 사항을 고려하세요.
+ IAM 정책과 역할(`AmazonEKSLoadBalancerControllerRole`)은 동일한 AWS 계정의 여러 EKS 클러스터에서 재사용할 수 있습니다.
+ 역할(`AmazonEKSLoadBalancerControllerRole`)이 원래 생성된 동일한 클러스터에 컨트롤러를 설치하는 경우 역할이 있는지 확인한 후 [2단계: cert-manager 설치](#lbc-cert)로 이동합니다.
+ 서비스 계정에 대한 IAM 역할(IRSA)을 사용하는 경우 각 클러스터에 대해 IRSA를 설정해야 하며 역할의 신뢰 정책에서 OpenID Connect(OIDC) 공급자 ARN은 각 EKS 클러스터에 대해 특정합니다. 또한 기존 `AmazonEKSLoadBalancerControllerRole`이 있는 새 클러스터에 컨트롤러를 설치하는 경우 새 클러스터의 OIDC 공급자를 포함하도록 역할의 신뢰 정책을 업데이트하고 적절한 역할 주석으로 새 서비스 계정을 생성합니다. OIDC 공급자가 이미 있는지 아니면 생성해야 하는지 확인하려면 [클러스터에 대한 IAM OIDC 공급자 생성](enable-iam-roles-for-service-accounts.md) 섹션을 참조하세요.

## 1단계: IAM 구성
<a name="lbc-iam"></a>

다음 단계는 AWS Load Balancer Controller **v2.14.1** 릴리스 버전을 참조하세요. 모든 릴리스에 대한 자세한 내용은 GitHub의 [AWS Load Balancer Controller Release Page](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/)를 참조하세요.

1. 사용자 대신 AWS API를 직접 호출할 수 있는 AWS 로드 밸런서 컨트롤러의 IAM 정책을 다운로드합니다.  
**Example**  

------
#### [  AWS  ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```

------
#### [  AWS GovCloud (US) ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy_us-gov.json
   ```

   ```
   mv iam_policy_us-gov.json iam_policy.json
   ```

------

1. 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책을 만듭니다.

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```
**참고**  
AWS Management Console에서 정책을 보는 경우 콘솔에 **ELB** 서비스에 대한 경고는 표시되지만 **ELB v2** 서비스에 대한 경고는 표시되지 않습니다. 이는 정책의 작업 중 일부가 **ELB v2**에는 있지만 **ELB**에는 없기 때문에 발생합니다. **ELB**에 대한 경고는 무시해도 됩니다.

**Example**  

1. *my-cluster*를 사용자 클러스터 이름으로 바꾸고 *111122223333*을 계정 ID로 바꾼 다음 명령을 실행합니다.

   ```
   eksctl create iamserviceaccount \
     --cluster=my-cluster \
     --namespace=kube-system \
     --name=aws-load-balancer-controller \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
     --approve
   ```

1. 클러스터의 OIDC 제공자 ID를 검색하고 변수에 저장합니다.

   ```
   oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   ```

1. 클러스터의 ID를 가진 IAM OIDC 제공자가 이미 계정에 있는지 확인합니다. 클러스터와 IAM 모두에 OIDC를 구성해야 합니다.

   ```
   aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
   ```

   출력이 반환되면 해당 클러스터에 대한 IAM OIDC 제공자가 이미 있는 것입니다. 출력이 반환되지 않은 경우 해당 클러스터에 대한 IAM OIDC 공급자를 생성해야 합니다. 자세한 내용은 [클러스터에 대한 IAM OIDC 공급자 생성](enable-iam-roles-for-service-accounts.md) 섹션을 참조하세요.

1. 다음 콘텐츠를 디바이스에 복사합니다. *111122223333*을 계정 ID로 바꿉니다. *region-code*를 클러스터가 있는 AWS 리전으로 바꿉니다. *EXAMPLED539D4633E53DE1B71EXAMPLE*을 이전 단계에서 반환된 출력으로 바꿉니다.

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
               },
               "Action": "sts:AssumeRoleWithWebIdentity",
               "Condition": {
                   "StringEquals": {
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
                   }
               }
           }
       ]
   }
   ```

1. IAM 역할을 생성합니다.

   ```
   aws iam create-role \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
   ```

1. 필요한 Amazon EKS 관리형 IAM 정책을 IAM 역할에 연결합니다. *111122223333*을 계정 ID로 바꿉니다.

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
     --role-name AmazonEKSLoadBalancerControllerRole
   ```

1. 다음 콘텐츠를 디바이스에 복사합니다. *111122223333*을 계정 ID로 바꿉니다. 텍스트를 바꾼 후 수정된 명령을 실행하여 `aws-load-balancer-controller-service-account.yaml` 파일을 생성합니다.

   ```
   cat >aws-load-balancer-controller-service-account.yaml <<EOF
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     labels:
       app.kubernetes.io/component: controller
       app.kubernetes.io/name: aws-load-balancer-controller
     name: aws-load-balancer-controller
     namespace: kube-system
     annotations:
       eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
   EOF
   ```

1. 클러스터에 Kubernetes 서비스 계정을 생성합니다. `aws-load-balancer-controller`라는 이름의 Kubernetes 서비스 계정은 *AmazonEKSLoadBalancerControllerRole* 이름으로 생성된 IAM 역할을 사용하여 주석을 답니다.

   ```
   kubectl apply -f aws-load-balancer-controller-service-account.yaml
   ```

## 2단계: `cert-manager` 설치
<a name="lbc-cert"></a>

다음 방법 중 하나를 사용하여 `cert-manager`를 설치한 다음 인증서 구성을 Webhook에 주입합니다. 자세한 내용은 *cert-manager 문서*의 [시작하기](https://cert-manager.io/docs/installation/#getting-started)를 참조하세요.

`quay.io` 컨테이너 레지스트리를 사용하여 `cert-manager`를 설치하는 것이 좋습니다. 노드가 `quay.io` 컨테이너 레지스트리에 액세스할 수 없는 경우, Amazon ECR을 사용하여 `cert-manager`를 설치하세요(아래 참조).

**Example**  

1. 노드에 `quay.io` 컨테이너 레지스트리에 대한 액세스 권한이 있는 경우, `cert-manager`를 설치한 다음 Webhook에 인증서 구성을 주입합니다.

   ```
   kubectl apply \
       --validate=false \
       -f https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 다음 방법 중 하나를 사용하여 `cert-manager`를 설치한 다음 인증서 구성을 Webhook에 주입합니다. 자세한 내용은 *cert-manager 문서*의 [시작하기](https://cert-manager.io/docs/installation/#getting-started)를 참조하세요.

1. 매니페스트를 다운로드합니다.

   ```
   curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 다음 이미지를 가져와서 노드가 액세스할 수 있는 리포지토리로 푸시합니다. 이미지를 가져오기, 태그 지정 및 자체 리포지토리로 푸시하는 방법에 대한 자세한 내용은 [한 리포지토리에서 다른 리포지토리로 컨테이너 이미지 복사](copy-image-to-repository.md) 단원을 참조하세요.

   ```
   quay.io/jetstack/cert-manager-cainjector:v1.13.5
   quay.io/jetstack/cert-manager-controller:v1.13.5
   quay.io/jetstack/cert-manager-webhook:v1.13.5
   ```

1. 자체 레지스트리 이름으로 세 개의 이미지에 대한 매니페스트 `quay.io`를 바꿉니다. 다음 명령은 개인 리포지토리의 이름이 원본 리포지토리와 같다고 가정합니다. *111122223333.dkr.ecr.region-code.amazonaws.com*을 개인 레지스트리로 바꿉니다.

   ```
   sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com|' ./cert-manager.yaml
   ```

1. 매니페스트를 적용합니다.

   ```
   kubectl apply \
       --validate=false \
       -f ./cert-manager.yaml
   ```

## 3단계: AWS Load Balancer Controller 설치
<a name="lbc-install"></a>

1. 컨트롤러 사양을 다운로드합니다. 컨트롤러에 대한 자세한 내용은 GitHub에서 [문서](https://kubernetes-sigs.github.io/aws-load-balancer-controller/)를 참조하세요.

   ```
   curl -Lo v2_14_1_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_full.yaml
   ```

1. 파일에 대해 편집한 항목:

   1. `v2_14_1_full.yaml` 파일을 다운로드 한 경우 다음 명령을 실행하여 매니페스트에서 `ServiceAccount` 섹션을 제거합니다. 이 섹션을 제거하지 않으면 이전 단계에서 서비스 계정에 작성한 필수 주석이 덮어씌워집니다. 이 섹션을 제거하면 컨트롤러를 삭제할 경우 이전 단계에서 생성한 서비스 계정도 유지됩니다.

      ```
      sed -i.bak -e '764,772d' ./v2_14_1_full.yaml
      ```

      다른 파일 버전을 다운로드한 경우 편집기에서 파일을 열고 다음 줄을 제거합니다.

      ```
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/name: aws-load-balancer-controller
        name: aws-load-balancer-controller
        namespace: kube-system
      ---
      ```

   1. *my-cluster*를 해당 클러스터 이름으로 바꿔 파일의 `Deployment` `spec` 섹션에 있는 `your-cluster-name`을 해당 클러스터의 이름으로 바꿉니다.

      ```
      sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_14_1_full.yaml
      ```

   1. 노드가 Amazon EKS Amazon ECR 이미지 리포지토리에 액세스할 수 없는 경우 다음 이미지를 가져와서 노드가 액세스할 수 있는 리포지토리로 푸시해야 합니다. 이미지를 가져오기, 태깅 및 자체 리포지토리로 푸시하는 방법에 대한 자세한 내용은 [한 리포지토리에서 다른 리포지토리로 컨테이너 이미지 복사](copy-image-to-repository.md) 섹션을 참조하세요.

      ```
      public.ecr.aws/eks/aws-load-balancer-controller:v2.14.1
      ```

      매니페스트에 레지스트리 이름을 추가합니다. 다음 명령은 개인 리포지토리의 이름이 원본 리포지토리와 같다고 가정하고 개인 레스트리의 이름을 파일에 추가합니다. *111122223333.dkr.ecr.region-code.amazonaws.com*을 해당 레지스트리로 바꿉니다. 이 라인에서는 개인 리포지토리의 이름을 원본 리포지토리와 동일하게 지정했다고 가정합니다. 그렇지 않은 경우 개인 레지스트리 이름 뒤에 있는 `eks/aws-load-balancer-controller` 텍스트를 해당 리포지토리 이름으로 바꿉니다.

      ```
      sed -i.bak -e 's|public.ecr.aws/eks/aws-load-balancer-controller|111122223333.dkr.ecr.region-code.amazonaws.com/eks/aws-load-balancer-controller|' ./v2_14_1_full.yaml
      ```

   1. (Fargate 또는 제한된 IMDS에만 필요)

      [Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 대해 제한적인 액세스 권한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)이 있는 Amazon EC2 노드에 컨트롤러를 배포하거나 Fargate 또는 Amazon EKS Hybrid Nodes에 배포하는 경우, `- args:`에서 `following parameters`를 추가합니다.

      ```
      [...]
      spec:
            containers:
              - args:
                  - --cluster-name=your-cluster-name
                  - --ingress-class=alb
                  - --aws-vpc-id=vpc-xxxxxxxx
                  - --aws-region=region-code
      
      
      [...]
      ```

1. 파일을 적용합니다.

   ```
   kubectl apply -f v2_14_1_full.yaml
   ```

1. `IngressClass` 및 `IngressClassParams` 매니페스트를 클러스터에 다운로드합니다.

   ```
   curl -Lo v2.14.1_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_ingclass.yaml
   ```

1. 매니페스트를 클러스터에 적용합니다.

   ```
   kubectl apply -f v2_14_1_ingclass.yaml
   ```

## 4단계: 컨트롤러가 설치되어 있는지 확인
<a name="lbc-verify"></a>

1. 컨트롤러가 설치되어 있는지 확인합니다.

   ```
   kubectl get deployment -n kube-system aws-load-balancer-controller
   ```

   예제 출력은 다음과 같습니다.

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

   Helm을 사용하여 배포한 경우 이전 출력이 표시됩니다. Kubernetes 매니페스트를 사용하여 배포한 경우 복제본이 하나만 있습니다.

1. 컨트롤러를 사용하여 AWS 리소스를 프로비저닝하기 전에 클러스터가 특정 요구 사항을 충족해야 합니다. 자세한 내용은 [Application Load Balancer를 사용하여 애플리케이션 및 HTTP 트래픽 라우팅](alb-ingress.md) 및 [Network Load Balancer를 사용하여 TCP 및 UDP 트래픽 라우팅](network-load-balancing.md) 섹션을 참조하세요.

# 더 이상 사용되지 않는 ALB 수신 컨트롤러에서 앱 마이그레이션
<a name="lbc-remove"></a>

이 주제에서는 사용되지 않는 컨트롤러 버전에서 마이그레이션하는 방법을 설명합니다. 보다 구체적으로 AWS Load Balancer Controller의 사용되지 않는 버전을 제거하는 방법을 설명합니다.
+ 사용되지 않는 버전은 업그레이드할 수 없습니다. 먼저 제거한 다음, 최신 버전을 설치해야 합니다.
+ 사용되지 않는 버전은 다음과 같습니다.
  +  AWS ALB Ingress Controller for Kubernetes("Ingress Controller"), 이전 AWS Load Balancer Controller.
  + `0.1.x ` 버전의 AWS Load Balancer Controller

## 더 이상 사용되지 않는 컨트롤러 버전 제거
<a name="lbc-remove-desc"></a>

**참고**  
Helm을 사용하거나 Kubernetes 매니페스트를 사용하여 수동으로 사용되지 않는 버전을 설치했을 수 있습니다. 원래 설치한 도구를 사용하여 절차를 완료합니다.

1. `incubator/aws-alb-ingress-controller` 차트 Helm이 설치된 경우 제거합니다.

   ```
   helm delete aws-alb-ingress-controller -n kube-system
   ```

1. `eks-charts/aws-load-balancer-controller` 차트의 버전 `0.1.x `이 설치된 경우 제거합니다. 버전 `0.1.x `에서 `1.0.0`으로의 업그레이드는 웹후크 API 버전과 호환되지 않아 작동되지 않습니다.

   ```
   helm delete aws-load-balancer-controller -n kube-system
   ```

1. 이 컨트롤러가 현재 설치되어 있는지 확인합니다.

   ```
   kubectl get deployment -n kube-system alb-ingress-controller
   ```

   컨트롤러가 설치되어 있지 않은 경우의 출력입니다.

   ```
   Error from server (NotFound): deployments.apps "alb-ingress-controller" not found
   ```

   컨트롤러가 설치된 경우의 출력입니다.

   ```
   NAME                   READY UP-TO-DATE AVAILABLE AGE
   alb-ingress-controller 1/1   1          1         122d
   ```

1. 다음 명령을 입력하여 컨트롤러를 제거합니다.

   ```
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
   ```

## AWS Load Balancer Controller로 마이그레이션
<a name="lbc-migrate"></a>

ALB Ingress Controller for Kubernetes에서 AWS Load Balancer Controller로 마이그레이션하려면 다음을 수행해야 합니다.

1. ALB Ingress Controller를 제거합니다(위 내용 참조).

1.  [AWS 로드 밸런서 컨트롤러를 설치합니다.](aws-load-balancer-controller.md#lbc-overview)

1. AWS Load Balancer Controller에서 사용하는 IAM 역할에 정책을 더 추가합니다. 이 정책은 LBC가 ALB Ingress Controller for Kubernetes에서 생성한 리소스를 관리할 수 있도록 허용합니다.

1. IAM 정책을 다운로드합니다. 이 정책을 통해 AWS Load Balancer Controller가 ALB Ingress Controller for Kubernetes에서 생성한 리소스를 관리할 수 있습니다. [정책을 볼](https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_v1_to_v2_additional.json) 수도 있습니다.

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy_v1_to_v2_additional.json
   ```

1. 클러스터가 AWS GovCloud(미국 동부) 또는 AWS GovCloud(미국 서부) AWS 리전에 있는 경우, ` arn:aws: `를 `arn:aws-us-gov:`로 대체합니다.

   ```
   sed -i.bak -e 's|arn:aws:|arn:aws-us-gov:|' iam_policy_v1_to_v2_additional.json
   ```

1. IAM 정책을 생성하고 반환된 ARN 적어둡니다.

   ```
   aws iam create-policy \
     --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \
     --policy-document file://iam_policy_v1_to_v2_additional.json
   ```

1. IAM 정책을 AWS Load Balancer Controller에서 사용하는 IAM 역할에 연결합니다. *your-role-name*을 역할의 이름(예: `AmazonEKSLoadBalancerControllerRole`)으로 바꿉니다.

   `eksctl`을 사용하여 역할을 생성한 경우 생성된 역할 이름을 찾으려면 [AWS CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation)을 열고 **eksctl-*my-cluster*-addon-iamserviceaccount-kube-system-aws-load-balancer-controller** 스택을 선택하세요. **리소스** 탭을 선택합니다. **물리적 ID** 열에 역할 이름이 있습니다.

   ```
   aws iam attach-role-policy \
     --role-name your-role-name \
     --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
   ```