본문 바로가기
Amazon AWS/EKS

Ingress 사용을 위한 AWS Loadbalancer Controller 설치

by 홍띠 2022. 9. 4.

이번에 구성하는 클러스터에 인그레스를 적용하고자 한다. 인그레스는 인그레스 컨트롤러가 있어야 동작해야 하는데, AWS에서는 AWS Loadbalancer Controller가 Ingress Controller의 역할을 수행한다.

💡 Ingress란? 인그레스는 클러스터 외부에서 클러스터 내부 서비스로 HTTP와 HTTPS 경로를 노출한다. 트래픽 라우팅은 인그레스 리소스에 정의된 규칙에 의해 컨트롤된다. 또한, 인그레스는 외부에서 서비스로 접속이 가능한 URL, 로드 밸런스 트래픽, SSL / TLS 종료 그리고 이름-기반의 가상 호스팅을 제공하도록 구성할 수 있다.

1. IAM OIDC 공급자 생성

AWS Loadbalancer Controller를 설치하기 전에, 클러스터에 대한 AWS Identity and Access Management(IAM) OpenID Connect(OIDC) 공급자가 생성되어야있어야 한다.

💡 OIDC란? OpenID Connect(OIDC)를 사용하면 지원되는 자격증명 공급자를 이용해 AWS api 호출을 인증하고 유효한 OIDC JWT(Json Web Token)을 수신한다. 이 토큰을 AWS STS AssumeRoleWithWebIdentityAPI 작업에 전달하고 IAM 임시 역할 자격 증명을 수신 할 수 있다. 이 자격증명을 사용하여 AWS 서비스 자원들을 k8s자원들이 사용할 수 있다.

IAM OIDC Provider는 기본으로 활성화 되어있지 않으므로, eksctl을 사용하여 생성한다.

#클러스터 리스트 확인
$ aws eks list-clusters
{
    "clusters": [
        "demo-eks"
    ]
}
#IAM OIDC Provider 생성
$ eksctl utils associate-iam-oidc-provider \
 --region us-east-2 \
 --cluster demo-eks \
 --approve
#생성 확인
$ aws eks describe-cluster --name demo-eks --query "cluster.identity.oidc.issuer" --output text
https://oidc.eks.us-east-2.amazonaws.com/id/xxxxxxxxxxxxxxxxxx
#현재 계정 IAM에 등록된 OIDC 공급자 확인
$ aws iam list-open-id-connect-providers

2. AWS Loadbalancer 컨트롤러에 대한 IAM 정책 다운로드

ALB Load Balancer 컨트롤러에 대한 IAM정책을 다운로드 받는다.

## ALB Load Balancer Controller 의 IAM Policy Download
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy.json

3. AWSLoadBalancerControllerIAMPolicy 이름의 IAM 정책 생성

# 정책 이름: AWSLoadBalancerControllerIAMPolicy , 정책 내용: iam_policy.json
aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://./iam_policy.json

4. AWS Load Balancer 컨트롤러에 대한 IAM역할 및 ServiceAccount 생성

이 단계에서는 AWS LoadBalancer Controller 에 대한 Service Account를 생성하고, 앞서 생성한 IAM Role을 연결한다.

# service account 생성
$ eksctl create iamserviceaccount \
 --cluster=demo-eks \
 --namespace=kube-system \
 --name=aws-load-balancer-controller \
 --attach-policy-arn=<3에서 생성한 정책 ARN> \
 --override-existing-serviceaccounts \
 --region us-east-2 \
 --approve
#등록 확인
$ kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml

5.Helm 설치

컨트롤러를 설치하는 방법은 Helm을 이용하거나, kubernetes manifest를 apply해서 설치 할 수 있다.

이번에는 이후에도 헬름을 이용할 예정이므로 Helm을 이용해서 컨트롤러를 설치할 것이다.

#인스톨러 스크립트 다운로드
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
#인스톨러 권한 설정 및 실행
$ chmod 700 get_helm.sh
$ ./get_helm.sh
#설치 확인
$ helm version

 

6. Helm을 이용한 AWS Loadbalancer Controller 설치

명령어 가장 마지막에 이미지 리포지토리를 지정 할 때에는 아래 링크를 참고하여 각 리전별로 적정한 값을 넣어주어야 한다. 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/add-ons-images.html

$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=<클러스터이름>\
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller \
  --set image.repository=602401143452.dkr.ecr.us-east-2.amazonaws.com/amazon/aws-load-balancer-controller

#설치확인  
$ kubectl get deployment -n kube-system aws-load-balancer-controller
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
aws-load-balancer-controller   2/2     2            2           20s

위와 같이 컨트롤러가 정상적으로 설치되어있음을 확인 할 수 있다.

 

참고:

https://kubernetes.io/ko/docs/concepts/services-networking/ingress/

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/aws-load-balancer-controller.html