K8s Ingress와 AWS LB Controller 사용하여 EKS ALB 구성 및 노출

# 목적

EKS 및 데이터플레인을 구성할 때 일반적으로 Private Subnets에 속하도록 구성한다.

이럴 경우, 사설 네트워크에 존재하는 파드들을 외부로 서비스하기 위해선 별도로 공인 IP를 할당받던지, NAT 혹은 LB 구성을 필수적으로 해야한다.

추가적으로, Nginx-Ingress-Controller 등으로, K8s Ingress를 통해 L7 로드밸런싱 구조를 사용하더라도 해당 구성을 별도로 수행해야하는데, AWS 환경에서 일일히 이러한 환경을 구성할 필요는 없다.

AWS에서는 추가 플러그인으로 AWS LB Controller를 EKS 환경에서 사용할 수 있도록 제공하고 있고, 이를 사용하여 EKS 환경에서 K8s Ingress 객체를 통해 ALB 구성을 완성하는 방법을 공유한다.


# 사용 환경

EKS Version: 1.27
DataPlane: Node Group
Network: Private Subnets 3(Not Same AZ)

 

다른 글에서도 자주 볼 수 있는 아래의 환경을 구성하는 것이 목적이였다.


# 사전 조건 - AWS LoadBalancer Controller  및 Subnet Tag

우선, AWS LB Controller를 설치해야한다.

이를 구성하는 방법은 아래의 공식 문서를 참고하면 된다.

 

AWS Load Balancer Controller 추가 기능 설치 - Amazon EKS

배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 install을 upgrade로 변경하되, 이전 명령

docs.aws.amazon.com

최종적으로 AWS LB Controller가 구성되고 나면 2개의 파드가 kube-system 네임스페이스에서 동작한다.


## 주의할 점 ##

AWS LB Controller가 정상적으로 동작하기 위해선, 배포할 Subnets에 태그를 지정하거나, 아래에서 사용할 annotations에 서브넷을 명시해야한다.

기본적으로 태그가 존재하면 Controller가 자동으로 사용할 서브넷을 선택하지만, 태그가 없다면 서브넷을 명시해야한다.

태그가 있어도 원하는 서브넷에 ALB를 구성하기 위해서 지정해도 상관없다.

해당 부분이 만족되지 않으면 AWS LB Controller는 사용할 VPC와 Subnets을 Discovery하지 못한다.

 

만약 Terraform이나 웹 콘솔로 직접 VPC 및 Subnets 같은 네트워크 요소를 구성했다면, 위 요소를 구성해야한다.

참고로 Private Subnet로 지정하면, 당연히 외부에서 접속 못한다. External-IP Pending 발생


# Ingress 구성 및 배포

AWS LB Controller가 정상적으로 동작한다면, 수행할 작업은 원하는 규칙을 적용한 Ingress 객체를 구성하고 배포하면 된다.

본인의 경우 아래의 Ingress를 정의하여 현재 사용중이다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: quest
  name: quest-ingress
  annotations:
	alb.ingress.kubernetes.io/scheme: internet-facing
	alb.ingress.kubernetes.io/target-type: ip
	alb.ingress.kubernetes.io/load-balancer-name: quest-alb
	alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}, {"HTTPS": 8000}]'
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
            name: quest-web-service
            port:
              number: 80
        - path: /api
          pathType: Prefix
          backend:
            service:
            name: quest-api-service
            port:
              number: 8000

 

ingressClassName을 ALB로 지정해야하고, 이를 사용하기 위한 어노테이션을 구성하면 된다.

 

자세한 어노테이션 사항은 공식 문서를 참고하면 된다.

본인은 추가적으로 ALB가 허용할 포트를 지정했다.

HTTPS 구성을 추가적으로 진행했기 때문에 HTTPS 포트를 리스너 규칙으로 지정했다.

ALB에 인증서를 추가해 HTTPS 구성을 수행하는 과정은 추후에 포스팅할 예정이다.

 

아무튼, EKS에 Ingress Object를 배포하면 AWS LB Controller는 어노테이션을 기반하여 이를 읽고 자동으로 ALB 및 backend 요소를 통하여 대상 그룹을 생성한다.

Ingress가 정상적으로 배포된 상황

자동적으로 구성해주기 때문에, 상세한 사항은 자신에 환경에 맞게 구성하면 된다.


## 주의할 점 ##

AWS LB Controller를 통해 ALB 또는 NLB를 구성하게 된다면, 웹 콘솔에서 자동으로 구성된 요소를 변경해도 나중에 다시 돌아온다.

AWS LB Controller가 해당 요소를 프로비저닝한 것이기 때문에, K8s 객체의 명세에 따라 이를 지속적으로 유지하기 때문이다.

만약, 다른거 구성해놔도 나중에 적용이 풀린다면 K8s 내에 해당 구성이 존재해야한다.

이는 공식 문서를 통해 해결할 수 밖에 없다.

 

Welcome - AWS Load Balancer Controller

Welcome A Kubernetes controller for Elastic Load Balancers AWS Load Balancer Controller AWS Load Balancer Controller is a controller to help manage Elastic Load Balancers for a Kubernetes cluster. This project was formerly known as "AWS ALB Ingress Control

kubernetes-sigs.github.io

728x90
반응형