6. AWS Load Balancer Controller

Update : 2022-10-27 / 1H

Ingress 아키텍쳐

1.소개

Ingress는 앞서 소개된 Loadbalancer 방식과 다르게 URL 패스에 대한 설정을 담당하는 자원입니다. 외부에서 요청하는 HTTP에 대한 트래픽 처리를 지원하게 됩니다. (eg. 도메인 기반 라우팅) 사용자들이 외부에서 접근이 가능한 URL을 제공하여 , 사용자의 접근성을 편리하게 제공합니다.

Ingress는 Ingress Controller가 존재하고, Ingress 에 정의된 트래픽 라우팅 규칙에 따라 라우팅을 처리합니다.

2. Ingress Controller

Ingress 는 반드시 Ingress Controller가 존재 해야하며, 외부에서 내부로 요청되는 트래픽을 읽고 서비스로 전달하는 역할을 합니다. 다른 컨트롤러와 다르게 목적에 맞게 수동으로 설치해야 합니다.

AWS EKS 환경에서는 AWS Load Balancer Controller 를 별도로 설치하고, Ingress는 ALB를 통해 구성됩니다

  • NGINX Ingress Controller

  • HA Proxy

  • AWS Load Balancer Controller (이전 이름 : ALB Ingress Controller)

  • Kong

  • traefik

3. AWS ALB Ingress 개요.

AWS 로드 밸런서 컨트롤러는 Kubernetes 클러스터의 AWS Elastic Load Balancer를 관리합니다. AWS ALB Ingress Controller"로 알려졌으며 "AWS Load Balancer Controller"로 브랜드를 변경했습니다.

수신 리소스는 ALB를 구성하여 HTTP 또는 HTTPS 트래픽을 클러스터 내 다른 포드로 라우팅합니다. ALB 수신 컨트롤러는 Amazon EKS 클러스터에서 실행 중인 프로덕션 워크로드에서 지원됩니다.

AWS 로드 밸런서 컨트롤러 기반 구성

4. Ingress 동작 방식

다음 다이어그램은 이 컨트롤러가 생성하는 AWS 구성 요소를 자세히 설명합니다. 또한 수신 트래픽이 ALB에서 Kubernetes 클러스터로 이동하는 경로를 보여줍니다.

  1. 컨트롤러는 API 서버의 Ingress 이벤트를 모니터링합니다. 요구 사항을 충족하는 수신 리소스를 찾으면 AWS 리소스 생성을 시작합니다.

  2. 새 수신 리소스에 대해 AWS에서 ALB (ELBv2)가 생성됩니다. 이 ALB는 인터넷에 연결되거나 내부에 있을 수 있습니다. Annotation을 사용하여 생성된 서브넷을 지정할 수도 있습니다.

  3. Target Group은 수신 리소스에 설명된 각 고유 Kubernetes 서비스에 대해 AWS에서 생성됩니다.

  4. 수신 리소스 Annotation에 자세히 설명된 모든 포트에 대해 리스너가 생성됩니다. 포트를 지정하지 않으면 적절한 기본값( 80또는 443)이 사용됩니다. Annotation을 통해 인증서를 첨부할 수도 있습니다.

  5. 수신 리소스에 지정된 각 경로에 대해 규칙이 생성됩니다. 이렇게 하면 특정 경로에 대한 트래픽이 적절한 Kubernetes 서비스로 라우팅됩니다.

Reference - https://github.com/kubernetes-sigs/aws-load-balancer-controller , https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases, https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/

5. Ingress Traffic

AWS Load Balancer 컨트롤러는 두 가지 트래픽 모드를 지원합니다.

  • 인스턴스 모드

  • IP 모드

기본적으로 Instance Mode가 사용되며 , Annotation의 target-type 을 통해 모드를 선택할 수 있습니다.

인스턴스 모드

수신 트래픽은 ALB에서 시작하여 각 서비스의 NodePort를 통해 Kubernetes 노드에 도달합니다. 이는 수신 리소스에서 참조하는 서비스가 ALB에 도달하기 위해 에서 type:NodePort가 있어야 함을 의미합니다.

IP 모드

수신 트래픽은 ALB에서 시작하여 Kubernetes Pod에 직접 도달합니다. CNI는 ENI의 Secondary IP 주소를 통해 직접 액세스할 수 있는 POD IP를 지원해야 합니다.

6. ALB Ingress & AWS Load Balancer Controller 트래픽 흐름

  • 외부 사용자는 ALB DNS A Record:Port 번호로 접근합니다

  • ALB는 각 노드로 로드밸런싱 합니다

  • Kube-API에 의해 업데이트 된 정보를 가지고 ALB에서 Loadbalancing 처리를 합니다.

아래와 같은 구성 단계로 ALB Loadbalancer Controller를 구성합니다.

  1. IAM OIDC 공급자 생성

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

  3. AWSLoadBalancerControllerIAMPolicy 이름의 IAM 정책 생성.

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

  5. EKS Cluster에 컨트롤러 추가

7. IAM OIDC Provider 생성

AWS IAM(Identity and Access Management)에서는 OpenID Connect(OIDC)를 사용해 연동 자격 증명을 지원하는 기능을 추가하였습니다. 이 기능을 사용하면 지원되는 자격 증명 공급자를 이용해 AWS API 호출을 인증하고 유효한 OIDC JWT(JSON WebToken)을 수신할 수 있습니다. 이 토큰을 AWS STS AssumeRoleWithWebIdentity API 작업에 전달하고 IAM 임시 역할 자격 증명을 수신할 수 있습니다. 이 자격 증명을 사용하여 AWS 서비스 자원들을 Kubernetes 자원들이 사용할 수 있습니다.

IAM OIDC Provider는 기본으로 활성화되어 있지 않습니다. eksctl을 사용하여 IAM OIDC Provider를 생성합니다.

다음과 같이 Cloud9 Console 또는 IAM 서비스 메뉴에서 생성된 OIDC를 확인 할 수 있습니다.

8. AWS Load Balancer 컨트롤러에 대한 IAM 정책 다운로드 (생략)

ALB Load Balancer 컨트롤러에 대한 IAM정책을 다운로드 받습니다. (이미 앞서 git에서 받은 폴더에 포함되어 있습니다. 생략합니다.)

9. AWSLoadBalancerControllerIAMPolicy IAM 정책 생성.

AWSLoadBalancerControllerIAMPolicy라는 IAM 정책을 생성합니다.

아래 처럼 결과가 출력됩니다.

아래와 같이 IAM - 정책 메뉴에서 새롭게 생성된 정책을 확인할 수 있습니다.

10. AWS LoadBalancer Controller IAM 역할 및 Service Account 생성

이 단계에서는 AWS LoadBalancer Controller 에 대한 Service Account를 생성하고, 앞서 생성한 IAM Role을 연결합니다. (2~3분 소요 됩니다.)

Kubernetes에 정상적으로 Service Account가 등록되었는지 확인해 봅니다.

아래와 같이 출력 예제를 확인해 볼 수 있습니다.

참조 URL - https://eksctl.io/usage/iamserviceaccounts/

Amazon EKS는 클러스터 운영자가 AWS IAM 역할을 Kubernetes 서비스 계정에 매핑 할 수 있도록하는 IRSA (IAM Roles for Service Accounts) 를 지원합니다 .

이를 통해 EKS에서 실행되고 다른 AWS 서비스를 사용하는 앱에 대해 세분화 된 권한 관리를 제공합니다. S3, 다른 데이터 서비스 (RDS, MQ, STS, DynamoDB) , AWS ALB Ingress 컨트롤러 또는 ExternalDNS와 같은 Kubernetes 구성 요소를 사용하는 어플리케이션 들이 대표적입니다. IAM OIDC Provider는 기본적으로 활성화되어 있지 않습니다. 따라서 앞선 과정들을 수행해야 합니다.

11. 인증서 관리자 설치

아래와 같이 Cert Manager (인증서 관리자)를 설치합니다. 설치 후에 pod가 모두 READY가 되는 것을 확인 하고 다음 단계를 진행합니다.

cert-manager pod 3대가 모두 정상적으로 동작되는지 확인하고 , 다음 단계를 진행합니다.

12. AWS Loadbalancer Controller Pod 설치

Helm 기반 또는 mainfest 파일을 통해 ALB Loadbalancer Controller Pod를 설치합니다. 여기에서는 Yaml을 통해 직접 설치해 봅니다. (이미 앞서 git을 통해서 다운 받았을 경우에는 생략해도 됩니다.)

AWS Loadbalancer Controller Pod의 Deployment file에 지정된 cluster-name 값을 , 현재 배포한 Cluster name으로 변경합니다. (이미 앞서 git을 통해서 다운 받았을 경우에는 생략해도 됩니다.)

앞서서 Service Account와 IAM Role을 연결하는 작업을 이미 완료했으므로, kind: ServiceAccount 섹션은 삭제하거나 주석처리하는 것이 좋습니다.

이미 git을 통해 사전에 다운로드 받아 두었습니다. 해당 AWS Loadbalancer Controller Pod의 yaml에는 Cluster Name이 eksworkshop으로 수정되어 있고 kine: ServiceAccount 섹션은 주석처리되어 있습니다. 해당 yaml을 배포합니다. pod가 정상적으로 Running 되는지 확인하고 다음 단계를 진행합니다.

12.Ingress Annotation

kubernetes Ingress 및 Service Object에 Annotation을 추가하여 동작을 상세하게 지정할 수 있습니다

13.ALB Ingress Traffic 흐름 확인

ALB Ingress를 시험하기 위해 아래와 같이 namespace와 pod,service를 배포합니다.

아래와 같은 명령으로 결과를 확인 할 수 있습니다.

아래와 같은 결과를 확인하고 ingress LB의 외부 A Record를 확인합니다.

아래와 같은 결과를 확인하고 ingress LB의 외부 A Record를 확인합니다. 해당 A Record를 Cloud9 IDE Terminal에서 Curl을 통해 접속하거나 브라우저에서 접속해 봅니다.

앞서 생성된 ALB 주소로 접속을 시도해 봅니다.Cloud9 IDE Terminal에서 ALB External IP:80 으로 접속합니다.

아래와 같이 배포된 pod에 접속을 편리하게 하기 위해 Cloud9 IDE terminal Shell에 등록 합니다.

alb-ing-01에 container 접속해서 아래와 같이 확인해 봅니다.

Cloud9에서 아래와 같이 ALB 주소로 접속해 봅니다.

Pod에서 TCPDump로 확인하면 정상적으로 Pakcet이 덤프되고 X-Forwarded를 통해 Source IP를 확인할 수 있습니다.

아래와 같이 ALB Ingress가 구성되었습니다.

ALB Ingress Controller는 Target Group을 IP기반으로 Pod에 직접 배포할 수 있습니다.

IP Mode로 아래와 같이 배포해 봅니다.

아래와 같은 명령으로 결과를 확인 할 수 있습니다.

아래와 같이 구성되었습니다.

아래와 같이 ALB 구성의 Target Group이 PoD IP로 등록됩니다.

14.ALB Ingress Controller 기반 Application 배포

아래와 같이 새로운 aplication game을 실행합니다.

yaml 파일을 배포하고, 서비스를 확인합니다.

아래와 같은 결과를 확인 할 수 있습니다.

아래 명령을 통해서 게임앱 URL을 확인하고에 브라우저를 통해 접속해 봅니다.

Last updated