

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

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

# 매니페스트를 사용하여 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) 섹션을 참조하세요.