ALB 생성 ★

- ALB의 경우엔 따로 애드온을 설치해야한다.

- 온프레미스 로컬클러스터에는 path기반 라우팅을 하려면 ingress-controller를 설치했었는데, AWS의 EKS에서는 Load Balancer Controller를 설치해줘야한다(helm으로)

# 우리가 원하는건, EKS에서 ingress를 생성했을때 EKS애드온인 LB Controller가 ALB를 생성하는것이다. 이를 위해선 LoadBalancer Controller가 AWS에 ALB를 생성할 수 있는 권한이 있어야한다. 그럴려면 IAM에서 생성한 Role(역할)을 EKS의 SA에 부여해야하는데, 서로 다른 플랫폼이기 때문에 불가능하다. 따라서 OIDC라는 매개체를 통해 AWS IAM Role을 쿠버네티스의 IRSA에 부여(Assume, LB Controller가 마치 AWS의 리소스인것처럼 동작)해야한다

 

OIDC라는건 결국 서로 다른 인증/인가 체계를 갖는 AWS IAM과 EKS IRSA를 묶어주는 개념이라고 생각해도 무방하다. 

  • AWS LB Controller 생성 가이드
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/lbc-helm.html
  • 정책 생성
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.12.0/docs/install/iam_policy.json

# json 형태의 Policy 다운로드

  • iam_policy.json 파일로 AWSLoadBalancerControllerIAMPolicy 라는 정책(Policy) 생성
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json

# 생성한 정책이 콘솔에서도 잘 보임

  • 내 계정 정보 조회
aws sts get-caller-identity

 

export CLUSTER_NAME=<내 클러스터 이름>

export ACCOUNT_ID=<내계정ID>

export VPC_ID=<EKS설치된 vpc의 ID>

export REGION=ap-northeast-2

export CLUSTER_NAME=pric
export ACCOUNT_ID=651109015678
export VPC_ID=vpc-0085e6292a9a98114
export REGION=ap-northeast-2

  • OIDC 활성화. 내 클러스터의 OIDC를 AWS IAM에 등록
eksctl utils associate-iam-oidc-provider --cluster $CLUSTER_NAME --approve

# OIDC를 활성화하면 AWS IAM에 자격증명공급자가 생김

# AWS SSO는 절대 지우지 마세요.

  • 위에서 생성한 AWSLoadBalancerControllerIAMPolicy라는 정책으로 AmazonEKSLoadBalancerControllerRole라는 IAM Role을 생성한 다음, 이 IAM Role을 aws-load-balancer-controller라는 IRSA에게 부여
eksctl create iamserviceaccount   --cluster=$CLUSTER_NAME   --namespace=kube-system   --name=aws-load-balancer-controller   --role-name AmazonEKSLoadBalancerControllerRole   --attach-policy-arn=arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy   --override-existing-serviceaccounts   --approve

# 만약 설치시 에러가 뜨면 스택이나 Role을 지우고 새로 만드는게 편함

  • Role에 Policy가 잘 적용된걸 확인 가능

  • 나중에 헬름으로 LB Controller를 설치하면 이 IRSA가 들어갈것

  • 설치 가능한 다양한 애드온들
eksctl utils describe-addon-versions --kubernetes-version 1.32 | grep AddonName

 


사전준비는 끝났고, 이제 헬름으로 로드밸런서 컨트롤러를 설치하면 된다.

  • 헬름설치
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
  • 로드밸런서 컨트롤러가 있는 헬름 레포 추가
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=$CLUSTER_NAME \
	--set serviceAccount.create=false \
	--set serviceAccount.name=aws-load-balancer-controller \
	--set image.repository=602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller \
	--set region=ap-northeast-2 \
	--set vpcId=$VPC_ID

# 나는 aws-load-balancer-controller 라는 헬름 릴리스를 생성할껀데, eks/aws-load-balancer-controller 차트를 기반으로 할꺼고, 아까 생성한 aws-load-balancer-controller이라는 IRSA를 부여할거다. 이 로드밸런서 컨트롤러는 602401143452.dkr.ecr.ap-northeast-2.amazonaws.com/amazon/aws-load-balancer-controller 이라는 ECR에 push된 이미지를 통해 생성된 파드다. 따라서, 어카운트아이디를 변경하진 마세요.

 

# kube-system ns에 잘 생성이 됐다.

 

kubectl describe pod -n kube-system aws-load-balancer-controller | grep -i account

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/

# ALB의 다양한 설정들을 위 페이지의 annotation을 통해 구성 가능하다..

acm 설정, 헬스체크, 서브넷 지정, 여러개의 ingress를 묶을 수도 있다(group)

  • yaml ↔ json 호환. 원래 LoadBalancer 타입이었는데 ClusterIP로 변경
kubectl patch svc test -p '{"spec": {"type": "ClusterIP"}}'
vi ip-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "ip-ingress"
  labels:
    app.kubernetes.io/name: "nginx-ingress"
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip

spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: test
                port:
                  number: 80
kubectl apply -f ip-ingress.yml
kubectl describe ingress ip-ingress

# ingress를 특성 서브넷에 생성을 할텐데, 그 서브넷이 특정되지 않았음.

# subnet에 tag를 달아줘야 한다.


https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/network-load-balancing.html

  • 퍼블릭서브넷
kubernetes.io/cluster/pric            shared
kubernetes.io/role/elb                    1
  • 프라이빗서브넷
kubernetes.io/cluster/pric              shared
kubernetes.io/role/internal-elb          1
  • 서브넷을 명시하면 alb가 생성

# 각 서비스마다 대상그룹이 생성된다고 생각하면 좋다.

 

질문) NLB나 클래식로드밸런서를 생성할때는 왜 IRSA나 IAM-SA가 필요하지 않았나?

답) NLB나 클래식로드밸런서를 생성할때는 그 명령을 치거나 매니페스트 파일을 apply한 사람이 '나'라는 사용자였기때문에 로드밸런서를 생성하는 주체가 '나'였다고 생각하면 편하고, ingress를 구성했을때는 ALB를 생성하는 주체가 '나'가 아닌 헬름으로 생성한 LoadBalancer Controller 였다.


실습)

vpc이름 : rapa-vpc

eks클러스터 이름 : rapa-cluster

web-was-db 서브넷 구성후 web-was-db 연동을 확인해보세요. 예전에 매니페스트를 쓰셔도 좋습니다. db는 rds로 해보세요! web-was에는 ALB를 붙이되 web-alb는 퍼블릭, was-alb는 프라이빗