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
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/helm.html