1 watch -d kubectl get ing,svc,deploy,rs,pods cd mkdir 8 cd 8 2 EKS 전용 Ingress 코드 (ingress-eks.yaml) EKS에서는 annotations(주석) 설정이 매우 중요합니다. 이 주석들이 AWS 상에 어떤 로드밸런서를 만들지 결정하기 때문입니다. vi ingress-eks.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: game-2048-ingress namespace: game-2048 annotations: # AWS Load Balancer Controller에게 ALB 생성을 명령함 alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip # 만약 기존에 사용하던 인그레스 클래스가 있다면 명시 (생략 가능) kubernetes.io/ingress.class: alb spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: game-2048-service port: number: 80 3 # 정책 # AWS 공식 정책 다운로드 curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json # 정책 생성 (이미 존재한다는 에러가 나면 다음 단계로 가셔도 됩니다) aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json 4 *IAM OIDC 제공자(Provider)가 클러스터에 연결 1. 왜 이 단계가 필요한가요? 쿠버네티스의 ServiceAccount(포드용 계정)가 AWS의 IAM Role(실제 권한)을 빌려 쓰려면, 둘 사이를 신뢰할 수 있게 연결해주는 "다리"가 필요합니다. 그 다리 역할을 하는 것이 바로 OIDC Provider입니다. 연결 방법 (딱 두 단계만 더 하시면 됩니다) Step 1: OIDC Provider 연결하기 에러 메시지에서 추천해준 명령어를 그대로 실행하여 다리를 먼저 놓습니다. eksctl utils associate-iam-oidc-provider \ --region=ap-northeast-2 \ --cluster=eks-demo \ --approve Step 2: OIDC 연결이 끝나면, 이제 서비스 어카운트를 생성합니다. # <클러스터명> 부분을 실제 EKS 클러스터 이름으로 바꾸세요. eksctl create iamserviceaccount \ --cluster=<클러스터명> \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name AmazonEKSLoadBalancerControllerRole \ --attach-policy-arn=arn:aws:iam::<내-계정-ID>:policy/AWSLoadBalancerControllerIAMPolicy \ --approve eksctl create iamserviceaccount \ --cluster=eks-demo \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name AmazonEKSLoadBalancerControllerRole \ --attach-policy-arn=arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --approve \ --region ap-northeast-2 5 aws eks list-clusters --region ap-northeast-2 aws sts get-caller-identity --query Account --output text kubectl config current-context 6 Helm을 이용해 컨트롤러를 설치하시면 됩니다. # 1. 저장소 주소 등록 helm repo add eks https://aws.github.io/eks-charts # 2. 최신 리스트로 업데이트 helm repo update # Helm 설치 예시 helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=eks-demo \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller \ --set region=ap-northeast-2 7 # 다시 확인 (이제 READY 상태가 보여야 합니다) kubectl get deployment -n kube-system aws-load-balancer-controller 8 # pod 생성 초과시 # deployment/이름 -n 네임스페이스 --replicas=원하는수 kubectl scale deployment/game-2048-deployment -n game-2048 --replicas=1 9 k ns k ns kube-system 이 명령어의 결과가 READY 1/1 또는 2/2로 나오면 드디어 성공입니다! 만약 정상적으로 조회가 된다면, 이제 마지막 단계인 Ingress를 적용하실 차례입니다. 10 k ns game-2048 kubectl apply -f ingress-eks.yaml 11 트러블슈팅: 만약 10분이 지나도 주소가 안 나온다면? kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller AccessDenied: ... is not authorized to perform: elasticloadbalancing:DescribeListenerAttributes 12 curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json # 1. 기존 정책의 ARN을 가져옵니다. POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AWSLoadBalancerControllerIAMPolicy`].Arn' --output text) # 2. 새로운 버전의 정책을 적용합니다. aws iam create-policy-version \ --policy-arn $POLICY_ARN \ --policy-document file://iam_policy.json \ --set-as-default 13 kubectl rollout restart deployment -n kube-system aws-load-balancer-controller 14 log # 다시 로그 확인 kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller --tail 20 # 인그레스 주소 확인 kubectl get ingress -n game-2048 15 # 1. 최신 정책 파일 다운로드 curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json # 2. 정책 버전 업데이트 (한 줄씩 복사해서 실행) POLICY_ARN=arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy aws iam create-policy-version \ --policy-arn $POLICY_ARN \ --policy-document file://iam_policy.json \ --set-as-default kubectl rollout restart deployment -n kube-system aws-load-balancer-controller 필수 확인 grep -E "DescribeListenerAttributes|DescribeTargetGroupAttributes" iam_policy.json (topasvga@eks-demo:game-2048) [root@kops-ec2 7]# grep -E "DescribeListenerAttributes|DescribeTargetGroupAttributes" iam_policy.json "elasticloadbalancing:DescribeTargetGroupAttributes", "elasticloadbalancing:DescribeListenerAttributes", 16 # v1 버전을 삭제합니다 (만약 v1이 현재 사용 중이면 v2 등 다른 번호를 시도하세요) aws iam delete-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --version-id v1 aws iam create-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json \ --set-as-default kubectl rollout restart deployment -n kube-system aws-load-balancer-controller # 로그 확인 kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller --tail 10 # 인그레스 주소 확인 kubectl get ingress -n game-2048 kubectl rollout restart deployment -n kube-system aws-load-balancer-controller kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller --tail 20 17 aws iam list-policy-versions --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy aws iam delete-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --version-id v3 aws iam delete-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --version-id v4 aws iam create-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json \ --set-as-default kubectl rollout restart deployment -n kube-system aws-load-balancer-controller kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller --tail 10 18 curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json grep -E "DescribeListenerAttributes|DescribeTargetGroupAttributes" iam_policy.json aws iam delete-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --version-id v5 aws iam create-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json \ --set-as-default kubectl rollout restart deployment -n kube-system aws-load-balancer-controller aws iam delete-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --version-id v7 aws iam create-policy-version \ --policy-arn arn:aws:iam::697016550159:policy/AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json \ --set-as-default kubectl rollout restart deployment -n kube-system aws-load-balancer-controller 19 이번 트러블슈팅의 핵심 요인은 두 가지였습니다: IAM 버전 제한: AWS IAM 정책은 최대 5개 버전만 보관할 수 있습니다. 이미 5개가 꽉 차 있어서 새로운 권한이 담긴 정책을 등록하지 못하고 계속 실패했었습니다. 누락된 권한: AWS Load Balancer Controller가 업데이트되면서 리스너 속성을 확인하는 DescribeListenerAttributes 권한이 필수적으로 필요해졌는데, 기존 정책 파일에는 이 내용이 빠져 있었습니다.