인프라/시스템 구축

[ EKS ] Aws LoadBalancer Controller

김붕어87 2023. 3. 31. 14:37
반응형
개요
aws LoadBalancer Controller 이란? 

aws LoadBalancer Controller는 kubernetes의 ALB(Ingress Controller)를 관리해주는 컨트롤러 입니다.
aws LoadBalancer Controller는 AWS ALB, NLB를 사용한다.
aws LoadBalancer Controller를 사용하기 위해선 "aws LoadBalancer Controller" 패키지는 설치해줘야한다.
AWS 권한이 필요하다.
AWS ALB는 호스트 기반 라우팅, URL 경로 기반 라우팅, TLS 종료, Websockets, HTTPS/2, AWS WAF 통합, 통합 엑세스 로그 및 상태 확인 등 기능 제공을 해준다.

 

[ 작동 원리 ]

  1. aws LoadBalancer Controller(POD)는 kubernetes API 서버의 “Ingress 이벤트”를 감시한다.
  2. 요구 사항이 맞는 Ingress(alb) 리소스를 찾으면 AWS ALB 리소스를 생성한다.
  3. AWS ALB의 TargetGroups은 Ingress 리소스에 지정된 각 백엔드에 대해서 생성된다.
    (Ingress Rule에 연결된 SVC의 백엔드 정보(Endpoints))
  4. Ingress 리소스 annotation으로 설정된 Port에 대한 AWS ALB Listener가 생성된다.
    (설정된 포트가 없으면, default값 80 또는 443으로 설정된다)
  5. Ingress 리소스 annotation으로 설정된 Port의 ANY Open으로 AWS ALB SG 그룹이 생성된다.
    (미리 생성된 SG그룹으로 설정하면, 신규 SG그룹은 생성되지 않는다.)
  6. Ingress 리소스에 설정된 Rule에 맞는 TargetGroup이 생성되며, 해당 경로로 라우팅 된다.

 

[ 전제 조건(Prerequisites) ]

전제 조건 링크 : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/alb-ingress.html

  • AWS EKS Cluster가 있어야한다.
  • 서로 다른 가용 영역에 2개 이상 서브넷이 있어야한다.
  • AWS Load Balancer Controller 버전(V2.1.2) 이상에서 서브넷에 다음과 같은 태그 지정이 필요하다.
  • 모든 subnet에 Tag 설정
    Key : kubernetes.io/cluster/"cluster-name"
    Value : shared or owned
  • private subnet만 Tag 설정
    Key : kubernetes.io/role/internal-elb
  • Value : 1
  • Public subnet Tag
    Key : kubernetes.io/role/elb
  • Value : 1

 

 

[ aws LoadBalancer Controller 설치 ]

 

1. AWS IAM 설정

  1. AWS policy 생성
  2. AWS role 생성
  3. AWS role에 생성한 policy 연결
    > 모든 작업은 terraform code으로 작성해놓았습니다.
    > terraform code 실행으로 생성
    > GitHub :

 

2. kubernetes AWS Loadbalancer Controller 설치

  1. SA 생성 (terraform code 구축 예정)
    > “AWS Loadbalancer Controller” ServiceAccount 설치
    > 빨간색 글자 AWS Account ID 값으로 수정 필요
    > eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
# sa yaml 생성
vi 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
    
    
# sa 설치
kubectl apply -f aws-load-balancer-controller-service-account.yaml

 

 

2. POD 생성

  • “AWS Loadbalancer Controller” POD 설치
  • 설치 파일 위치 :
  • values-infra-aws.yaml 파일 수정
    • clusterName
    • vpcId
    • nodeSelector
    • region
# "aws-load-balancer-controller" 폴더 위치로 이동
helm upgrade --install aws-load-balancer-controller  .  -f values-infra-aws.yaml  -n kube-system

 

 

[ 설치 시 오류 해결 방법 ]
Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: unable to recognize no matches for kind "IngressClassParams" in version "elbv2.k8s.aws/v1beta1"

"elbv2.k8s.aws/v1beta1" CRD가 없어서 발생하는 오류입니다.


[ CRD 배포 방법 ]
kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

kubectl api-resources |grep elbv2.k8s.aws

 

반응형

'인프라 > 시스템 구축' 카테고리의 다른 글

[ EKS ] metrics-server  (0) 2023.03.31
[ EKS ] External-DNS  (0) 2023.03.31
[ AWS ] VPN + TGW  (0) 2023.02.14
[ AWS ] NTH(Node Termination Handler)  (0) 2023.02.13
[ AWS ] TGW(Transit GateWay)  (0) 2023.02.13