Loadbalancer 기반 배포

update : 2025-01-25 / 2h

Loadbalancer 서비스 타입 소개.

Loadbalancer 기반의 서비스 타입은 현재 CLB (Classic Load Balancer)와 NLB(Network Load Balancer) 2가지 타입을 지원하고 있습니다. 모두 Port 기반의 LB를 제공하고 있으며, Kubernetes 의 Node와 Service 전면에서 서비스를 제공합니다.

CLB Loadbalancer 서비스 기반 구성

1.CLB 기반 ServiceType

Service Type 필드를 LoadBalancer로 설정하여 프로브저닝합니다. Cloud Service Provider의 기본 로드밸런서 타입을 사용하게 되며, AWS의 경우에는 CLB를 사용합니다. CLB는 내부 또는 외부 로드밸런서로 지정이 가능합니다.

2. CLB Service Type 트래픽 흐름

Traffic 흐름은 다음과 같습니다.

  • 외부 사용자는 CLB DNS A Record:Port로 접근

  • CLB는 NodePort로 LB 처리 (NodePort는 임의로 할당 됩니다.)

  • NodePort는 ClusterIP로 Forwarding되고 IPTable에 의해 분산 처리 됩니다.

3. CLB Service 시험

CLB Loadbalance Service Type 을 시험하기 위해 아래와 같이 namespace와 pod,service를 배포합니다.

정상적으로 배포되었는지 아래 Command로 확인합니다.

정상적으로 배포되었는지 아래 Command로 확인합니다.

다음과 같은 결과를 얻을 수 있습니다

아래와 같이 구성됩니다 . nodeport는 별도의 지정이 없으면 생성할때 자동으로 지정됩니다.

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

ClbTestPod01에 접속해서 아래와 같이 확인해 봅니다. K9s에서 접속해도 됩니다.

IDE Terminal에서 CLB External IP:8080 으로 접속합니다.

Node에서 iptable에 설정된 NAT Table, Loadbalancing 구성을 확인해 봅니다.

CLB에서는 아래와 같은 다양한 Annotation을 추가하여 CLB의 속성 또는 AWS 자원을 연결해서 사용할 수 있습니다

CLB Application 배포

다음과 같은 구성을 통해서 CLB 서비스를 구현해 봅니다.

  • namespace : clb-test

  • eksdemo-frontend service type : LoadbBlancer

  • eksdemo-crystal service type: Cluster-IP

  • eksdemo-nodejs service type: Cluster-IP

4. FrontEnd 어플리케이션 배포와 서비스 구성.

기본 Loadbalacer 구성을 위해 새로운 Namespace를 생성합니다.

어플리케이션을 배포하고, service를 구성합니다.

정상적으로 Pod가 배포되었는지 아래 명령을 통해서 확인해 봅니다.

Replica를 3개로 늘려서 LB가 FrontEnd에서 정상적으로 이뤄지는 지 확인합니다.

아래 출력되는 결과의 EXTERNAL-IP를 복사해서 브라우져 창에서 실행해 봅니다.

CLB 접속 URL 주소는 아래 결과로 출력할 수 있습니다.

출력결과 예시

앞서 설치해 둔 K9s 유틸리티를 통해서 , 현재 배포된 Pod들의 상태를 확인해 봅니다.

5. BackEnd 어플리케이션 배포

Backend 어플리케이션 Nodejs와 Crystal을 배포합니다. 이 2개의 어플리케이션들은 Private Subnet에 배포할 것입니다. 이 구성은 앞서 이미 Yaml 파일의 Deployment에서 nodeSelector로 지정하였습니다.

정상적으로 Pod가 배포되었는지 아래 명령을 통해서 확인해 봅니다.

Replica를 3개로 늘려서 Service Type이 없는 경우, BackEnd에서 정상적으로 이뤄지는 지 확인합니다.

k9s 를 통해 Pod의 구성을 확인합니다.

LAB 을 진행하면서, Pod의 배포 상황을 계속 모니터링하기 위해서 IDE Terminal을 하나 더 열고 K9s를 실행 시켜 두는 것이 좋습니다.

6. Loadbalancer 확인.

이제 서비스 타입을 확인하기 위해서 EC2 대시보드에서 Loadbalancer를 확인합니다.

CLB의 DNS Name을 복사해서 Web Browser에서 입력합니다.

service 매니페스트에서 Service Type을 LoadBalancer로 지정하면, Default로 Classic LB가 구성됩니다. 또한 별도로 Service Type을 지정하지 않으면, ClusterIP로 지정됩니다.

아래 kubectl 명령을 통해 service type을 확인해 봅니다.

7. Super Mario 어플리케이션 배포하기

CLB 로드밸런서를 사용하는 간단한 게임 앱을 배포해 봅니다.

정상적으로 배포되었는지 확인해 봅니다.

아래와 같이 배포된 것을 확인 할 수 있습니다.

실제 deployment에 사용된 YAML 을 확인해 봅니다.

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

3~4분 뒤에 웹 브라우저를 통해 위 명령에서 실행된 URL을 접속하면 , CLB를 통해서 아래와 같이 게임이 실행됩니다.

  • "s" - 게임시작

  • 방향키로 각 스테이지 이동

  • "s" - 점프

  • 방향키 - 마리오 이동

NLB Loadbalancer 서비스 기반 구성

8. NLB 기반 Service Type

Service Type 필드를 LoadBalancer로 설정하여 프로브저닝합니다. CLB와 다르게 반드시 annotation을 통해 NLB를 지정해야 합니다. NLB도 내부 또는 외부 로드밸런서로 지정이 가능합니다. 또한 NLB는 외부의 IP를 PoD까지 그대로 전달 할 수 있습니다

  • NLB Annotation

9.NLB Service Type 트래픽 흐름

Traffic 흐름은 다음과 같습니다.

  • 외부 사용자는 NLB DNS A Record:Port로 접근합니다.

  • NLB는 NodePort로 LB 처리 (NodePort는 임의로 할당 됩니다.)

  • NodePort는 ClusterIP로 Forwarding되고 IPTable에 의해 분산 처리 됩니다.

10. NLB Service 시험

NLB Loadbalance Service Type 을 시험하기 위해 아래와 같이 namespace와 pod,service를 배포합니다.

정상적으로 배포되었는지 아래 명령어로 확인합니다.

다음과 같은 결과를 얻을 수 있습니다.

아래와 같이 구성됩니다 . nodeport는 별도의 지정이 없으면 생성할때 자동으로 지정됩니다.

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

NlbTestPod01에 접속해서 아래와 같이 확인해 봅니다.

IDE Terminal에서 NLB External IP:8080 으로 접속합니다.

Node에서 iptable에 설정된 NAT Table, Loadbalancing 구성을 확인해 봅니다.

NLB는 "externalTrafficPolicy: Local"을 지원합니다. 외부의 소스 IP를 그대로 보존하여, Node로 유입된 Traffic을 Node 내의 PoD로 전달합니다.

아래와 같이 새롭게 서비스와 PoD를 배포하고 확인해 봅니다.

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

NlbTestPod에 접속해서 외부의 Client IP가 보이는지 확인해 봅니다.

Node에서 iptable에 설정된 NAT Table, Loadbalancing 구성을 확인해 봅니다.

NLB기반 Loadbalancer 배포

다음과 같은 구성을 통해서 NLB 서비스를 구현해 봅니다.

  • namespace : nlb-test

  • ecsdemo-frontend service type : nlb (external)

  • ecsdemo-crystal service type: nlb(internal)

  • ecsdemo-nodejs service type: nlb(internal)

10.FrontEnd 어플리케이션 배포

어플리케이션을 배포하고, service를 구성합니다.

정상적으로 Pod가 배포되었는지 아래 명령을 통해서 확인해 봅니다.

Replica를 3개로 늘려서 LB가 FrontEnd에서 정상적으로 이뤄지는 지 확인합니다.

NLB를 구성하기 위해서는 annotation을 통한 Labeling이 필요합니다. 아래 내용을 확인하고 목적에 맞게 설정합니다. 배포 파일에 이미 설정되어 있습니다

NLB를 위해서는 사전에 서브넷에 태그가 지정되어야 합니다. 각 가용 영역에서 퍼블릭 서브넷을 선택하는 대신 외부 로드 밸런서에 대해 이러한 서브넷만 사용해야 한다는 것을 Kubernetes가 알 수 있도록 다음과 같이 퍼블릭 서브넷에 태그를 지정해야 합니다 .March 26, 2020 이후에 eksctl 또는 Amazon EKS AWS CloudFormation 템플릿을 사용하여 VPC를 생성하는 경우 서브넷은 생성될 때 적절하게 태그가 지정됩니다.

참조 - 외부 로드밸런서를 위한 Public subnet 태그

kubernetes.io/role/elb

1

내부 로드밸런서를 위한 Private subnet 태그

kubernetes.io/role/internal-elb

1

아래 출력되는 결과의 EXTERNAL-IP를 복사해서 브라우져 창에서 실행해 봅니다.

앞서 설치해 둔 K9s 유틸리티를 통해서 , 현재 배포된 Pod들의 상태를 확인해 봅니다.

우리 LAB에서는 NLB의 Internal과 External을 어떻게 변경했는지 yaml 파일을 다시 확인해 봅니다.

12.BackEnd 어플리케이션 배포

Backend 어플리케이션 Nodejs와 Crystal을 배포합니다. 이 2개의 어플리케이션들은 Private Subnet에 배포할 것입니다. 이 구성은 앞서 이미 Yaml 파일의 Deployment에서 nodeSelector로 지정하였습니다.

정상적으로 Pod가 배포되었는지 아래 명령을 통해서 확인해 봅니다.

Replica를 3개로 늘려서 Service Type이 없는 경우, BackEnd에서 정상적으로 이뤄지는 지 확인합니다.

k9s 를 통해 Pod의 구성을 확인합니다.

13. Tetris 어플리케이션 배포

NLB 로드밸런서를 사용하는 간단한 게임 앱을 배포해 봅니다.

정상적으로 배포되었는지 확인해 봅니다.

아래와 같이 배포된 것을 확인 할 수 있습니다.

실제 deployment에 사용된 YAML 을 확인해 봅니다.

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

브라우저를 통해 접속하면 아래와 같이 게임이 실행됩니다.

NLB는 배포시간이 5분 정도 소요 됩니다.

Last updated

Was this helpful?