DevOps/Kubernetes

[Kubernetes] AWS ALB Controller

twoDeveloper 2021. 11. 10. 14:01

■ ALB Controller 란?

 

 


 ALB Controller Install

※ 기존 EKS Cluster가 존재해야 함

 

1. AWS ALB IAM 정책을 다운로드 (사용자 대신 AWS API를 호출해야 함)

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

 

2. 다운로드 한 정책을 이용해 IAM 정책을 만듬

$ aws iam create-policy \
    --policy-name [IAM 정책 이름] \
    --policy-document file://iam_policy.json

☞ 정책 생성 시 'IAM 대시보드' -> '정책' 부분에서 생성된 것을 볼 수 있음

 

3. AWS Management Console을 이용해서 생성 (feat. kubectl)

1) https://console.aws.amazon.com/iam/

 

https://console.aws.amazon.com/iam/

 

console.aws.amazon.com

☞ 위 링크에서 'IAM 콘솔'을 연다.

 

2) 대시보드에서 '역할' 클릭

 

3) '역할 만들기' 클릭

 

4) '웹 ID' 클릭

  1. '자격 증명 공급자' 에서 기존 생성한 EKS Cluster URL을 선택

  2. 'Audience' 에서 sts.amazonaws.com 을 입력

 

5) '다음: 권한' 클릭

 

6) 권한 정책 연결

☞ 기존 생성한 IAM 정책과 연결

 

7) 태그 추가 (선택 사항)

8) 검토

☞ 역할 이름에 기존 생성한 IAM 정책 이름과 같게 입력

 

9) 확인

IAM 대시보드에서 '역할' -> 'eks_alb' 역할이 생성된 것을 확인할 수 있다.

 

10) 생성한 'eks_alb'를 클릭 후 편집

 

"oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

다음과 같은 줄이 존재, 이 줄을 수정

 

"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"

*region-code : ap-northeast-2

*EXAMPLED539D4633E53DE1B716D3041E 부분 -> EKS Cluster OIDC 공급자 ID로 변경

이 후 '신뢰 정책 업데이트' 클릭

 

11) 이 후 구축 단계에서 사용할 역할의 'ARN' 복사!!

 

12) aws-load-balancer-controller-service-account.yaml 파일 생성 및 저장

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/name: aws-load-balancer-controller
  name: aws-load-balancer-controller
  namespace: kube-system
  annotations:
      eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole

* 기존 복사한 ARN 을 위 파일에 수정 및 저장

-----------------------------------------------------

ㅣannotations:                                                                ㅣ

ㅣ  eks.amazonaws.com/role-arn: [기존 복사한 ARN]  ㅣ

-----------------------------------------------------

 

13) Cluster Service Account 생성

$ kubectl apply -f aws-load-balancer-controller-service-account.yaml
---
serviceaccount/aws-load-balancer-controller created

 

4. Helm V3 을 사용하여 AWS ALB Controller 설치

1) Helm Install

$ sudo snap install helm --classic
---
helm 3.7.0 from Snapcrafters installed

 

2) TargetGroupBinding 사용자 지정 리소스 정의 설치

$ kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
---
customresourcedefinition.apiextensions.k8s.io/ingressclassparams.elbv2.k8s.aws created
customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws created

 

3) EKS-charts repo를 추가

$ helm repo add eks https://aws.github.io/eks-charts
---
NAME     	URL
eks      	https://aws.github.io/eks-charts

 

4) 최신 차트가 적용되도록 repo update

$ helm repo update
---
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "eks" chart repository
Update Complete. ⎈Happy Helming!⎈

 

5) AWS ALB Controller 설치

$ helm upgrade -i aws-load-balancer-controller eks/aws-load-balancer-controller \
  --set clusterName=[eks-cluster-name] \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller \
  --set region=ap-northeast-2
  --set vpcId=[eks-cluster-vpc-id]
  -n kube-system

* clusterName

* vpcId

* region

 

6) ALB 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           63s

 


■ EKS Cluster Subnet 태그 설정 및 배포 테스트

1. 주석을 사용하여 Cluster에 Kubernetes Ingress Resource를 만듬

annotations:
    kubernetes.io/ingress.class: alb

 

2. [Internal], [internet-facint] 주석을 추가하여 Ingress가 Load Balancer를 생성할 위치를 지정

alb.ingress.kubernetes.io/scheme: internal

☞ 내부 Load Balancer

alb.ingress.kubernetes.io/scheme: internet-facing

☞ 외부(Public) Load Balancer

 

3. 태그를 사용하여 ALB Ingreess Controller가 자동 검색을 통해 Load Balancer를 생성

kubernetes.io/role/internal-elb                Set to 1 or empty tag value for internal load balancers
kubernetes.io/role/elb                         Set to 1 or empty tag value for internet-facing load balancers

* 내부 Load Balancer가 있는 Cluster에 대한 올바른 태그가 지정된 Subnet (Private Subnet 태그에 지정)

kubernetes.io/role/internal-elb          1

* Public Load Balancer가 있는 Cluster에 대한 올바른 태그가 지정된 Subnet (Public Subnet 태그에 지정)

kubernetes.io/cluster/$CLUSTER_NAME    shared

* EKS Cluster를 생성하면 생성된 모든 Subnet 태그에 위 태그를 추가

 

4. Amazon EKS VPC Subnets에 올바른 태그가 있는지 확인

$ aws ec2 describe-subnets --subnet-ids

 

5. 배포 테스트 !

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
kubectl get ingress/2048-ingress -n 2048-game
---
NAME           CLASS    HOSTS   ADDRESS                                                                        PORTS   AGE
ingress-2048   <none>   *       k8s-game2048-ingress2-fbdfc1111-11111523852.ap-northeast-2.elb.amazonaws.com   80      10s

☞ ADDRESS 가 생성된 것을 확인 할 수 있다.

☞ AWS 로드밸런서에 들어가보면 생성된 것도 확인할 수 있다.

 

참고 : https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-subnet-auto-discovery-alb/

 

Amazon EKS의 Application Load Balancer에서 사용하는 서브넷을 자동으로 검색

참고: 클러스터 버전 1.18 이전 버전의 경우, Amazon EKS에서는 클러스터 생성 중에 전달된 모든 서브넷에 다음 태그를 추가합니다. 태그는 버전 1.19 클러스터에 추가되지 않습니다. 태그를 사용하고

aws.amazon.com

 

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

 

AWS 로드 밸런서 컨트롤러 - Amazon EKS

Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 대한 액세스가 제한적인 Amazon EC2 노드에 컨트롤러를 배포하거나 Fargate에 배포하는 경우, 실행하는 명령에 다음 플래그를 추가해야 합니다. --set region

docs.aws.amazon.com

 

'DevOps > Kubernetes' 카테고리의 다른 글

[kubernetes] Argo CD Install  (0) 2021.12.22
[kubernetes] Helm으로 Jenkins Deploy  (1) 2021.11.12
[kubernetes] EKS Cluster 내부에 AWS RDS 구축  (0) 2021.11.10
[kubernetes] EKS Install  (0) 2021.10.27
[k8s] kubespray 로 k8s Install  (0) 2021.10.23