우리의 목표
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
이렇게 직접인자를 넘겼다.
이 방법이 정말 임시 조치이고 별로인 방법이라고 생각하긴 하지만 프로젝트 기간이 얼마 남지 않아서 테스트를 위해 급하게 연결하기 위해 어쩔 수 없이 사용한 방법이다.
하지만 정상적으로 잘 뜬 모습이다.

시간이 남는다면 뭐가 문제였는지 자세히 찾아보고 싶다..
'프로젝트기록' 카테고리의 다른 글
| AWS API gateway로 SQS에 메시지 전달 후 Lambda에서 처리하기 (+CORS 설정) (0) | 2025.02.25 |
|---|---|
| Elasticache와 AWS Lambda 연결하기 (연결 안되는 에러 해결기) (0) | 2025.02.24 |
| Jenkins 용량 부족 문제 해결해보기 (0) | 2025.02.19 |
| 클라우드 프론트에 https달기 (0) | 2025.02.17 |
| 서브도메인을 등록하기 위해 AWS Route 53, CloudFront, S3, ACM 설정하기 (0) | 2025.02.14 |