[AWS] EKS Load Balancer Controller 구성 방법
AWS EKS (Elastic Kubernetes Service)에서 Amazon Load Balancer Controller를 활용한 Ingress를 구성하는 방법
AWS EKS Document : https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html
[ 사전 준비 ]
- EKS Cluster에 접속 할 환경에 aws-cli, eksctl, kubectl, helm, git 설치
- AWS ALB (kuberntes Ingress)가 위치 할 Subnet의 Tags에 해당되는 아래 내용 추가
※ Internet-facing ALB는 Public Subnet에 위치해야 하며 Internal ALB는 Private Subnet에 위치해야 함
※ 각 타입의 ALB에 맞는 Subnet에 아래 Tag를 추가합니다.
ex) Internet-facing ALB의 경우 Public Subnet에 아래 Tag 추가
- Key | value
- kubernetes.io/role/elb | 1
- kubernetes.io/cluster/<cluster name> | shared
ex) Internal ALB의 경우 Private Subnet에 아래 Tag 추가
- Key | value
- kubernetes.io/role/internal-elb | 1 ( Private )
- kubernetes.io/cluster/<cluster name> | shared
[ CLI 작업 ]
1. EKS Cluster 접속
$ aws eks --region <region-code> update-kubeconfig --name <cluster_name>
2. OIDC 공급자 확인
$ aws eks describe-cluster --name <cluster_name> --query "cluster.identity.oidc.issuer" --output text
> https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
2.1 OIDC 공급자가 없을 경우 생성
$ eksctl utils associate-iam-oidc-provider --cluster <cluster_name> --approve
3. kubernetes iamserviceaccount를 위한 policy 생성
$ aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
4. kubernetes iamserviceaccount 생성
$ eksctl create iamserviceaccount --cluster=<cluster_name> --namespace=kube-system --name=aws-load-balancer-controller --attach-policy-arn=arn:aws:iam::aws:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve
5. 생성된 iamserviceaccount 확인
$ eksctl get iamserviceaccount --cluster <cluster_name> --name aws-load-balancer-controller --namespace kube-system
6. Helm에 EKS Repository 추가
$ kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
$ helm repo add eks https://aws.github.io/eks-charts
7. AWS Load Balancer Controller 배포
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller --set clusterName=<cluster_name> --set serviceAccount.create=false --set region=<region-code> --set vpcId=<VPC_ID> --set serviceAccount.name=aws-load-balancer-controller -n kube-system
8. AWS Load Balancer Controller 배포 확인
$ kubectl get deployment -n kube-system aws-load-balancer-controller
9. 이후 deployment, service, ingress를 EKS Cluster에 적용 후 AWS Console > EC2 > Load Balancers에서 ALB가 생성되었는지 확인
[ 겪은 시행착오 ]
1. fargate의 경우 coredns 상태를 꼭 확인해봐야 함, 만약 상태가 비정상이라면 재시작
$ kubectl rollout restart deployment -n kube-system coredns
2. 필자의 경우에는 EKS Document에서 제공하는 iamserviceaccount에 적용 할 policy 정책을 사용하면 permission Denied가 발생 했었음, 그래서 필자는 모든 권한을 iamserviceaccount에 할당하여 보니 정상 작동 함.
만약 필자와 같은 경우라면 iamserviceaccount를 새로 생성
$ eksctl delete iamserviceaccount --cluster=<cluster_name> --namespace=kube-system --name=aws-load-balancer-controller
$ eksctl create iamserviceaccount --cluster=<cluster_name> --namespace=kube-system --name=aws-load-balancer-controller --attach-policy-arn=arn:aws:iam::aws:policy/AdministratorAccess --override-existing-serviceaccounts --approve
3. Ingress가 정상적이지 않다면 로그 확인
$ kubectl get pod -n kube-system
$ kubectl logs <AWS Load Balancer pod> -n kube-system