본문으로 바로가기

[AWS] AWS LoadBalancer Controller 설치 방법

category 카테고리 없음 2023. 3. 6. 23:20
반응형

AWS LoadBalancer Controller 란 무엇일까?


AWS에서 제공하는 ALB 와 NLB 를 관리하기 위한 Kubernetes Controller 이다.

Kubernetes API 와 상호 작용하여 Kubernetes 클러스터 내부에 존재하는 Service 를 ALB 또는 NLB와 연결 할 수 있다.

AWS LoadBalancer Controller 는 이러한 Kubernetes Service 를 인식하여 이를 기반으로 ALB 또는 NLB와 연결하여 외부로 노출시킬 수 있다.

즉, 사용자가 배포한 애플리케이션의 서비스를 AWS LoadBalancer 와 연동할 수 있게 해주는 것이다.

(Kubernetes Ingress 와 연동하여 사용할 수도 있으며, 클러스터 내부의 파드와 노드들을 자동으로 LoadBalancer의 백엔드 서버 그룹으로 관리할 수 있음)

 

 

 

설치 환경

EKS version : 1.23

eksctl version : 0.131.0

kubectl version : 1.23

 

 

 

IAM Policy Create

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json
aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy.json

 

Service Account Create

eksctl create iamserviceaccount \
  --cluster=EKS-Cluster-01 \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --role-name AmazonEKSLoadBalancerControllerRole \
  --attach-policy-arn=arn:aws:iam::349460955611:policy/AWSLoadBalancerControllerIAMPolicy \
  --approve

ServiceAccount 는 OIDC 를 통해 인증 및 권한 부여를 받아 AWS 리소스에 액세스하게 된다.

따라서, 해당 ServiceAccount 를 사용하는 파드나 다른 리소들은 AmazonEKSLoadBalancerControllerRole 역할의 권한을 사용하여 AWS 리소스에 접근할 수 있게 된다.

※ 만약 eksctl 에 사용하고자 하는 리전을 지정 안했다면 OIDC 관련 에러가 아닌 다른 에러가 발생할 것이다.

그럴 경우 아래와 같이 해결한다.

위의 코드에서 --region=ap-northeast-2 를 추가하거나 aws configure 로 서울 리전으로 설정해준다.

(eksctl은 AWS CLI에 의존하므로 AWS CLI의 기본 리전을 설정하면 eksctl도 해당 리전을 사용한다.)

 

[root@ip-172-20-2-13 ~] eksctl create iamserviceaccount \
>   --cluster=EKS-Cluster-01 \
>   --namespace=kube-system \
>   --name=aws-load-balancer-controller \
>   --role-name AmazonEKSLoadBalancerControllerRole \
>   --attach-policy-arn=arn:aws:iam::349460955611:policy/AWSLoadBalancerControllerIAMPolicy \
>   --approve
2023-03-06 13:14:26 [!]  no IAM OIDC provider associated with cluster, try 'eksctl utils associate-iam-oidc-provider --region=ap-northeast-2 --cluster=EKS-Cluster-01'
Error: unable to create iamserviceaccount(s) without IAM OIDC provider enabled

IAM OIDC Provider 를 활성화하지 않고 iamserviceaccount 를 생성할 수 없다는 에러가 발생한다.

이럴 경우 OIDC 설치를 해주어야 한다. (제일 처음에 설치해주자.)

 

OIDC install

eksctl utils associate-iam-oidc-provider \
    --cluster EKS-Cluster-01 \
    --approve

 

[root@ip-172-20-2-13 ~] eksctl utils associate-iam-oidc-provider \
>     --cluster EKS-Cluster-01 \
>     --approve
2023-03-06 13:19:28 [ℹ]  will create IAM Open ID Connect provider for cluster "EKS-Cluster-01" in "ap-northeast-2"
2023-03-06 13:19:29 [✔]  created IAM Open ID Connect provider for cluster "EKS-Cluster-01" in "ap-northeast-2"

 

IAM OIDC 가 생성되었으므로 다시 ServiceAccount 를 생성해본다.

[root@ip-172-20-2-13 ~] eksctl create iamserviceaccount \
>   --cluster=EKS-Cluster-01 \
>   --namespace=kube-system \
>   --name=aws-load-balancer-controller \
>   --role-name AmazonEKSLoadBalancerControllerRole \
>   --attach-policy-arn=arn:aws:iam::349460955611:policy/AWSLoadBalancerControllerIAMPolicy \
>   --approve
2023-03-06 13:20:39 [ℹ]  1 iamserviceaccount (kube-system/aws-load-balancer-controller) was included (based on the include/exclude rules)
2023-03-06 13:20:39 [!]  serviceaccounts that exist in Kubernetes will be excluded, use --override-existing-serviceaccounts to override
2023-03-06 13:20:39 [ℹ]  1 task: {
    2 sequential sub-tasks: {
        create IAM role for serviceaccount "kube-system/aws-load-balancer-controller",
        create serviceaccount "kube-system/aws-load-balancer-controller",
    } }2023-03-06 13:20:39 [ℹ]  building iamserviceaccount stack "eksctl-EKS-Cluster-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-03-06 13:20:39 [ℹ]  deploying stack "eksctl-EKS-Cluster-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-03-06 13:20:39 [ℹ]  waiting for CloudFormation stack "eksctl-EKS-Cluster-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-03-06 13:21:10 [ℹ]  waiting for CloudFormation stack "eksctl-EKS-Cluster-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-03-06 13:21:52 [ℹ]  waiting for CloudFormation stack "eksctl-EKS-Cluster-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-03-06 13:21:52 [ℹ]  created serviceaccount "kube-system/aws-load-balancer-controller"

 

출력된 내용과 같이 CloudFormation Stack이 생기면서 ServiceAccount 가 생성된다.

k get sa aws-load-balancer-controller -n kube-system
NAME                           SECRETS   AGE
aws-load-balancer-controller   1         67s

※ OIDC 란 무엇인가?

OIDC (OpenID Connect)는 EKS 클러스터와 AWS IAM 사이의 인증 매커니즘이다.

OIDC 를 사용하면 클러스터 내의 Kubernetes ServiceAccount 를 IAM Role 에 매핑할 수 있다.

이를 통해 Kubernetes 클러스터를 통해 실행되는 애플리케이션이 ServiceAccount를 사용하여 AWS 리소스 액세스할 때 IAM Role 의 권한이 적용된다.

 

※ ServiceAccount 는 OIDC 를 통해 인증 및 권한 부여를 받아 AWS 리소스에 액세스하게 된다.

따라서, 해당 ServiceAccount 를 사용하는 파드나 다른 리소스들은 생성된 AmazonEKSLoadBalancerControllerRole 역할의 권한을 사용하여 AWS 리소스에 접근할 수 있게 된다.

 

 

helm install

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh

 

helm 버전 확인

[root@ip-172-20-2-13 ~] helm version --short | cut -d + -f 1
v3.11.1

 

eks-charts 리포지토리 추가

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

※ helm repo add 명령어는 Helm 차트 저장소를 추가하는 명령어이다.

eks는 저장소의 이름이며, https://aws.github.io/eks-chart  는 Helm 차트 저장소의 URL 이다.

즉, https://aws.github.io/eks-chart  에서 제공하는 Helm 차트를 eks 라는 이름으로 추가하는 명령어이다.

 

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

helm repo update

 

AWS Load Balancer Controller 설치

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=EKS-Cluster-01 \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller

 

공식 문서에 나와있는대로 Helm 설치 및 AWS Load Balancer Controller 설치하게 되면 다음과 같은 에러가 발생한다.

[root@ip-172-20-2-13 ~] helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
>   -n kube-system \
>   --set clusterName=EKS-Cluster-01 \
>   --set serviceAccount.create=false \
>   --set serviceAccount.name=aws-load-balancer-controller
Error: INSTALLATION FAILED: Kubernetes cluster unreachable: exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1"

Error: INSTALLATION FAILED: Kubernetes cluster unreachable: exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1"

해당 에러는 구글링해보니 현재 Helm 버전과 EKS 버전이 문제가 발생하여 생긴 에러이다.

 

 Helm 버전을 다운그레이드한다. (v3.11.1 -> v3.8.2)

curl -L https://git.io/get_helm.sh | bash -s -- --version v3.8.2
[root@ip-172-20-2-13 ~] helm version --short | cut -d + -f 1
v3.8.2

 

Helm 버전을 다운그레이드 후 다시 AWS Load Balancer Controller 설치해본다.

[root@ip-172-20-2-13 ~] helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
>   -n kube-system \
>   --set clusterName=EKS-Cluster-01 \
>   --set serviceAccount.create=false \
>   --set serviceAccount.name=aws-load-balancer-controller
NAME: aws-load-balancer-controller
LAST DEPLOYED: Mon Mar  6 13:41:02 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

 

성공적으로 설치된 것을 확인할 수 있다.

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           48s

 

참고자료

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/aws-load-balancer-controller.html

 

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/helm.html

 

Amazon EKS에 Helm 사용 - Amazon EKS

openssl을 먼저 설치해야 한다는 메시지가 나타나는 경우 다음 명령으로 설치할 수 있습니다. sudo yum install openssl

docs.aws.amazon.com

 

 

반응형