DevOps와 Infra/AWS EKS / / 2023. 10. 28. 15:48

2. AWS Load Balancer Controller 설치 ( IAM, Service Account )

잡설

최근 인터넷 용어 중 TL;DR이 있다. (세미콜론은 오타가 아님)

원래는 Too Long; Didn't Read.라는 뜻으로, 저 글은 너무 길어서 읽지 않았다라는 채팅용어로 쓰이다가, 이제는 다음과 같이 비즈니스 이메일에서도 쓰인다고 한다. 

Please read this article (TLDR: It's a summary of how ALB works)

즉, 이제는 'Summary'와 완전한 동의어로 쓰이고, 단지 summary라는 단어보다 조금 더 힙해 보일 뿐이다.

논문의 Abstract(초록)과 같은 뜻이다. 그래서 나도 이 용어를 써보겠다.

 

TL;DR

AWS EKS에 AWS Load Balancer Controller를 설치하는 첫번째 단계로

아래 그림에서 노란색 영역으로 보여지는 IAM policy, IAM role, IAM OIDC provider, Service Account를 우선 설치할 것이다.

이 과정은 왜 거치나?

Load Balancer를 controller(Service Account)가 생성할 수 권한을 부여하기 위함이다.

 

Pre-requisites (설치되어있다고 가정)

1. eksctl 설치 확인

$ eksctl version

2. kubectl 설치 확인

$ kubectl version

client와 server의 버전이 0.01 초과로 차이나면 안 된다.

3. AWS CLI 설치

4. AWS EKS Cluster 생성된 상태

5. AWS EKS에 Node Group 생성된 상태

 

1. IAM OIDC Provider 생성

공식 문서: https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.6/

이론 

AWS는 RBAC(Role-based Access Control, 역할 기반 액세스 제어)라는 기능을 사용한다.

IAM role(역할)에 annotation으로 SA(service account)가 권한을 갖게 된다.

OIDC는 OpenID Connect의 약자로 OAuth2.0기반인데

OAuth는 인가(Authorization)만이 목적이었다면

OIDC는 인가(Authorization)과 인증(Authentication)을 같이 하는 목적이 있다.

 

실습

EKS Cluster 이름을 까먹었다면 다음을 실행해서 확인

$ eksctl get cluster
결과:
NAME		REGION		EKSCTL CREATED
JWM-EKS-01	ap-northeast-2	False

cluster 이름을 알았으면 이제 다음과 같이 eksctl로 이 K8s cluster를 위한 OIDC provider를 생성한다.

eksctl utils associate-iam-oidc-provider \
    --region ap-northeast-2 \
    --cluster JWM-EKS-01 \
    --approve
결과:
2023-10-19 16:06:15 [ℹ]  will create IAM Open ID Connect provider for cluster "JWM-EKS-01" in "ap-northeast-2"
2023-10-19 16:06:16 [✔]  created IAM Open ID Connect provider for cluster "JWM-EKS-01" in "ap-northeast-2"

 

EKS Cluster에 IAM Service Account가 이미 있는지 확인

$ eksctl get iamserviceaccount --cluster=JWM-EKS-01
결과:
No iamserviceaccounts found

 

2. AWS Load Balancer Controller를 위한 IAM Policy 생성

IAM Policy(정책) 다운로드 받기

다음 command로 자동으로 이미 공식문서에 만들어놓은 IAM policy 최신버전을 받는다.

curl -o iam_policy_latest.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

다운로드받은 iam_policy_latest.json을 열어보면 각종 권한을 허용하는 문구들이 있다.

 

이제 다운로드 받은 IAM policy 생성

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy \
    --policy-document file://iam_policy_latest.json

AWS console에서 IAM > Policies 메뉴에 이미 같은 정책이 생성되어있으면 (당연하지만) 다시 생성이 안 된다.

이 AWS console에서 추후 사용해야되니 (다음과 같은 양식의) ARN을 복사해놓는다.

arn:aws:iam::3xxxxxxxxxx3:policy/AWSLoadBalancerControllerIAMPolicy

 

3. IAM Service Account 생성, 그리고 IAM role(역할) 생성 및 K8s service account에 attach하기

우선 aws-load-balancer-controller라는 ServiceAccount가 있는지 확인

아래 command에서 'sa'는 'ServiceAccount'의 약자로 둘 중 아무거나 써도 된다.

kubectl get sa -n kube-system

여러 개가 뜨지만

kubectl get sa aws-load-balancer-controller -n kube-system
결과:
  Error from server (NotFound): serviceaccounts "aws-load-balancer-controller" not found

아직 생성이 되지 않았다.

eksctl로 service account를 생성한다. 위에서 복사해두었던 ARN을 아래 command에 붙여넣기한다.

eksctl create iamserviceaccount \
  --cluster=JWM-EKS-01 \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::3xxxxxxxxxx3:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

위를 실행한 결과 화면 :

2023-10-19 16:40:26 [ℹ]  1 iamserviceaccount (kube-system/aws-load-balancer-controller) was included (based on the include/exclude rules)
2023-10-19 16:40:26 [!]  metadata of serviceaccounts that exist in Kubernetes will be updated, as --override-existing-serviceaccounts was set
2023-10-19 16:40:26 [ℹ]  1 task: {
    2 sequential sub-tasks: {
        create IAM role for serviceaccount "kube-system/aws-load-balancer-controller",
        create serviceaccount "kube-system/aws-load-balancer-controller",
    } }2023-10-19 16:40:26 [ℹ]  building iamserviceaccount stack "eksctl-JWM-EKS-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-10-19 16:40:27 [ℹ]  deploying stack "eksctl-JWM-EKS-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-10-19 16:40:27 [ℹ]  waiting for CloudFormation stack "eksctl-JWM-EKS-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-10-19 16:40:57 [ℹ]  waiting for CloudFormation stack "eksctl-JWM-EKS-01-addon-iamserviceaccount-kube-system-aws-load-balancer-controller"
2023-10-19 16:40:57 [ℹ]  created serviceaccount "kube-system/aws-load-balancer-controller"

위 결과 화면을 보면 IAM role이 생성되고, service account가 생성되었다는 메세지가 나온다. 그리고 CloudFormation stack이 생겼다고 나온다.

 

4. CloudFormation에서 Service Account 생성 확인

1. AWS console에서 확인:

들어가서 CloudFormation > Stack 서비스로 가면 아래와 같이 생성된 것을 확인할 수 있다.

클릭하고 Stack name을 클릭 후 > Resources 탭으로 가서 생성 확인

 

2. eksctl로 CLI에서 확인:

$ eksctl get iamserviceaccount --cluster JWM-EKS-01

결과:
NAMESPACE	NAME				ROLE ARN
istio-system	aws-load-balancer-controller	arn:aws:iam::3xxxxxxxxxx3:role/eksctl-JWM-EKS-01-addon-iamserviceaccount-kub-Role1-NQxxxxxxMFU

 

3. kubectl로 확인

$ kubectl get sa aws-load-balancer-controller -n kube-system

결과 :
NAME                           SECRETS   AGE
aws-load-balancer-controller   0         93s

아까는 나오지 않았던 Service Account가 새로 생성된 것을 확인할 수 있다.

describe을 이용하면 좀 더 자세한 정보를 볼 수 있다.

kubectl describe sa aws-load-balancer-controller -n kube-system

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유