EKS로 연결되는 ALB 만들기 (CrashLoopBackOff 오류 해결하기)

우리의 목표

ALB를 만들어서 Route53을 통해 특정 도메인으로 들어오는 애들은 해당 LB로 보내줄 것이다.

해당 LB는 EKS상에 배포되어있는 프론트엔드 파드들로 연결될 예정이다.

 

ALB 만들기

AWS Load Balancer Controller는 IAM OIDC 공급자가 필요하다. 활성화 되어 있는지 확인해보자.

aws eks describe-cluster --name {cluster이름} --query "cluster.identity.oidc.issuer" --output text

(https://oidc.eks.ap-northeast-2.amazonaws.com/id/xxxxxx)  이런 주소가 나오면 된것이다.

없으면 다음 명령어로 활성화 해야한다.

eksctl utils associate-iam-oidc-provider \
  --region=ap-northeast-2 \
  --cluster=eks-cluster \
  --approve

 

이제 다음 명령어 실행을 통해 iam account를 생성한다.

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

eksctl create iamserviceaccount \
  --cluster={클러스터이름} \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

 

설치를 하자

helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
    -n kube-system \
    --set clusterName=eks-cluster \
    --set serviceAccount.create=false \
    --set serviceAccount.name=aws-load-balancer-controller

 

다음 명령어를 실행했을때 정상이라면 두개가 떠 있을 것이다.

kubectl get deployment -n kube-system aws-load-balancer-controller

 

오류 해결하기

하지만 우리는 정상이 아니었다.

$ kubectl get rolebinding -n kube-system aws-load-balancer-controller
Error from server (NotFound): rolebindings.rbac.authorization.k8s.io "aws-load-balancer-controller" not found

분명 롤을 준거 같은데 없다고 주장한다.

gpt가 알려주는 방법대로 롤바인딩을 했다.

yaml을 생성하고

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: aws-load-balancer-controller
  namespace: kube-system
subjects:
- kind: ServiceAccount
  name: aws-load-balancer-controller
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: aws-load-balancer-controller
  apiGroup: rbac.authorization.k8s.io
kubectl apply -f aws-load-balancer-controller-rolebinding.yaml
kubectl get rolebinding -n kube-system aws-load-balancer-controller

이제 다시 확인 해보면

잘 바인딩 됐다.

하지만 여전히 안된다

이번엔 어째서 둘중에 하나는 CrashLoopBackOff인지...

pod의 로그를 확인해보자

$ kubectl logs -n kube-system aws-load-balancer-controller-6cdb88bcc5-d7c22
{"level":"info","ts":"2025-02-21T01:21:29Z","msg":"version","GitVersion":"v2.11.0","GitCommit":"ba4152c1ba7c75be194d75cf343219d4aeaeb116","BuildDate":"2024-12-12T21:01:50+0000"}
{"level":"error","ts":"2025-02-21T01:21:34Z","logger":"setup","msg":"unable to initialize AWS cloud","error":"failed to get VPC ID: failed to fetch VPC ID from instance metadata: error in fetching vpc id through ec2 metadata: get mac metadata: operation error ec2imds: GetMetadata, canceled, context deadline exceeded"}

vpc id를 가져올 수 없다고 한다..

 

다음 사항들을 점검해보았다.

- IAM 역할이 EC2 인스턴스에 올바르게 연결되어 있는가? → 정상임

- EC2 메타데이터 서비스에 접근할 수 있는가? → 정상임

- aws-load-balancer-controller가 vpc 정보에 접근할 수 잇는 권한을 가지고 있는가? → 애초에 안되면 왜 하나는 되냐는 의문이 생김

- 리소스가 부족한가? → 전혀 아님

 

결국 내가 선택한 방법은...

vpc-id를 직접 그냥 지정해주기로 했다.

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  --namespace kube-system \
  --set clusterName={클러스터이름} \
  --set vpcId={vpc id} \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller

이렇게 직접인자를 넘겼다.

이 방법이 정말 임시 조치이고 별로인 방법이라고 생각하긴 하지만 프로젝트 기간이 얼마 남지 않아서 테스트를 위해 급하게 연결하기 위해 어쩔 수 없이 사용한 방법이다.

하지만 정상적으로 잘 뜬 모습이다.

시간이 남는다면 뭐가 문제였는지 자세히 찾아보고 싶다..