본문 바로가기

Study/도커씨와쿠버씨

로드FC 아니고 로드 밸런싱(Elastic Load Balancing)

 

ALB Ingress Controller 사용 전에 필요한 선수지식

이라고 쓰고

정확하게 말하자면 AWS EKS에서 Fargate 사용 중에 Ingress와 ALB의 역할 궁금해서 정리한 내용

이라고 읽으면 된다.


AWS Elastic Load Balancing

AWS에서 지원하는 ELB(Elastic Load Balancing)에는 4가지 종류가 있다.

  1. ALB(Application Load Balancer)
  2. NLB(Network Load Balancer)
  3. GLB(Gateway Load Balancer)
  4. CLB(Classic Load Balancer)

여기서 ALB는

L7 Load Balancer 라고도 하는데, OSI 7 Layer(Application) 계층에서  작동하기 때문임

 

그러면 NLB는

L4 Load Balancer 라고도 하는데, OSI 4 Layer(Network) 계층에서 작동하기 때문임

정확히는 4 계층은 Transport Layer이기 때문에,  L4 로드 밸런서는 네트워크 계층(IP, IPX) 이나 전송 계층(TCP, UDP)의 정보(IP, Port)를 바탕으로 분산함


4가지 밸런서들 특징을 다 알아야 하나?

주관적인 생각인데 로드 밸런서 개념만 알고 있고 상황에 맞게 찾아보고 선택해서 사용하면 될 것 같음.AWS에서는 기본적으로 아래처럼 다른 타입을 사용함

  • Kubernetes Ingress를 사용할 때는, Application Load Balancer로 프로 비저닝
  • Kubernetes Service를 사용할 때는, Network Load Balncer로 프로 비정닝

ALB와 NLB의 가장 큰 차이점도 알고 있으면 좋아 보임

  • ALB의 프로토콜 리스너는 HTTP/HTTPS
  • NLB의 프로토콜 리스너는 TCP/UDP

AWS Application Load Balancer(ALB)

애플리케이션 계층(Layer 7)에서 들어오는 트래픽을 K8s 클러스터에서 실행되는 파드 같은 대상에 걸쳐 로드 밸런싱 하는 AWS 서비스


Fargate on EKS와 ALB

  • EKS 클러스터에서 Fargate를 사용해서 Pod를 배포한다면 “Fargate 포드에 대한 Ingress 기반 로드 밸런싱”을 할 상황이 있는데, 그러기 위해서는 ALB Ingress Controller를 사용해 ALB를 적용할 수 있다
  • 즉, Fargate 형태로 서비스를 구성하고 특정 URL과 해당 서비스를 매칭시켜서 사용자들의 요청을 받기를 원한다면 AWS에서 ALB Ingress Controller를 사용한다라고 알면 될 것 같다.

AWS ALB Ingress controller

  • 2가지 트래픽(인스턴스 모드, IP 모드)을 지원함
  • 인스턴스 모드 : 클러스터 내 Node를 ALB 대상으로 함. ALB에 도달한 트래픽을 NodePort로 라우팅 후 Pod로 프락시함
  • IP 모드 : 파드를 ALB 대상으로 함. ALB에 도달한 트래픽은 POD의 IP로 직접 라우팅함

아래 그림에서 mode IP(파란색 모드)를 보면 파드 부분으로 직접 라우팅 하고

mode Instance(초록, 보라)를 보면 NP(NodePort)로 라우팅 중인 것을 볼 수 있음

그림 1

그러면 Ingress가 뭔데?

  • 클러스터 서비스(일반적으로 HTTP)에 대한 외부 액세스를 관리하는 API 개체
  • Ingress는 클러스터 외부에서 클러스터 내 서비스에 연결할 수 있는 URL 제공, 트래픽 부하 분산, SSL/TLS 종료 및 이름 기반 가상 호스팅 제공

Ingress controller는 뭐고?

예시

  • path 경로가 /nginx 요청 시 nignx-service 서비스로 연결
  • path 경로가 /hgom 요청 시, hgom-service 서비스로 연결
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "nginx-ingress"
  namespace: "default"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
  labels:
    app: nginx-ingress
spec:
  rules:
  - http:
      paths:
      - path: /nginx
        backend:
          serviceName: "nginx-service"
          servicePort: 80
      - path: /hgom
        backend:
          serviceName: "hgom-service"
          servicePort: 123

처음에 헷갈린 것은 Ingress와 Service의 차이점이었다.

  • Service는 Pod를 로드 밸런싱 함. Pod를 묶는 상위 객체
  • Ingress는 Service를 로드 밸런싱함. Service를 묶는 상위 객체


참고

 

Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?

Recently, someone asked me what the difference between NodePorts, LoadBalancers, and Ingress were. They are all different ways to get…

medium.com