Cloud/AWS

[AWS] EKS Load Balancer Controller 구성 방법

고지식한청춘 2021. 11. 18. 16:55
728x90

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
728x90