NodePort 기반 배포

Update: 2025-01-25 / 40min

Overview

nodeport 타입의 service는 Node(EC2인스턴스)의 포트를 통해서 서비스로 전달하는 방식입니다. 특정 노드로 유입 시킨 이후에 Service에서 로드밸런싱을 사용할 수 있습니다.하지만 최초 모든 트래픽이 하나의 노드로 집중되기 때문에 이에 대한 설계 고려가 필요합니다.

Nodeport 이해

nodeport type의 service는 클러스터에서 실행되는 서비스를 Node의 포트를 외부에 노출 시켜서 사용하는 방식입니다. NodePort로 노드그룹의 각 워커 노드의 공인 IP(ENI)에서 서비스를 노출 시키게 됩니다.

이 NodeIP:NodePort는 30000~32767번 포트를 사용하게 되며, NodePort 서비스가 라우팅 되는 ClusterIP 서비스가 자동 생성됩니다.

1.Nodeport 동작 방식

  • 외부 사용자는 Node(EC2)의 공인 IP/Port로 접근하게 됩니다.

  • 공인 IP/Port로 접근한 트래픽은 Node(EC2)의 IPTable 규칙에 의해 Cluster IP/Port로 이동합니다.

  • IPTable 규칙에 의해 PoD 분산하게 됩니다.

아래와 같이 새로운 Namespace와 Pod를 생성합니다.

생성한 pod를 확인합니다.

shell 연결을 편리하게 접속하기 위해 아래와 같이 IDE terminal 의 bash profile에 등록합니다.

2.NodePort Service 시험

Nodeport service를 배포합니다.

Nodeport service yaml은 아래와 같이 구성되어 있습니다.

nodePort Service가 정상적으로 배포되었는지 확인합니다.

아래와 같은 구성이 배포되었습니다. 외부에 Node IP:30080 으로 노출되어 있으며, Cluster 8080으로 Forwarding됩니다. 이후 Iptable에 의해 Pod들로 80 Port로 로드밸런싱됩니다.

pod shell로 접속해서 Service A Record를 확인해 봅니다.

Yaml 파일에 정의된 Service의 NodePort는 EKS Node에서 허용되지 않은 서비스 포트입니다. 허용하기 위해 Security Group을 추가합니다.

Public-SG 라는 이름으로 Security Group을 생성합니다.

AWS Console 또는 아래의 Shell을 통해 실행합니다.

아래와 같이 Security Group을 생성합니다.

  • VPC Name:

  • Security Group Name:

생성한 Security Group을 아래 Managed Node Group 인스턴스에 적용합니다.

Enter the Node Name (노드 이름 입력):

Enter the Security Group Name (Security Group 이름 입력):

아래는 AWS Console에서 작업하는 방법이므로, 위의 Shell을 실행한 경우는 생략합니다.

  • TCP 30080-30090 허용

아래와 같이 Security Group이 생성됩니다.

Pod가 배포된 Node를 AWS 관리콘솔 - EC2 대시보드에서 선택합니다. 해당 EC2 대시보드에서 인스턴스를 선택합니다. 이 랩에서는 "eksworkshop-managed-ng-public-01-Node"에 배포됩니다.

생성한 Public-SG 라는 Security Group을 해당 인스턴스에 적용합니다.

eksworkshop-managed-ng-public-01-Node 들의 EIP를 확인합니다.

아래와 같이 EC2 Public IP 주소와 Nodeport로 접속해 봅니다.

왜 고르게 로드밸런싱이 안될까요?

NodePort로 인입된 후 ClusterIP에서 다시 LB되기 때문입니다.

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

Nodeport 기반 Service 구성

이제 실제 웹서비스를 배포해 봅니다.

  • namespace : nodeport-test

  • ecsdemo-frontend service type : nodePort

3.배포용 yaml 복제.

NodePort 타입의 서비스 구성을 위해서 LAB에서 사용할 App을 IDE Terminal에서 복제합니다.

Application 배포

4.namespace 생성

이제 Namespace를 먼저 생성합니다.

5. Application , Service 배포

nodeport 용 어플리케이션과 서비스를 배포합니다.

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

아래와 같은 결과를 볼 수 있습니다.

6. 서비스 확인

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

Output wide 옵션을 통해서 실제 Pod가 배포된 Node를 확인합니다.

아래 Node 이름을 확인 할 수 있습니다.

Node 이름을 아래와 같이 상세하게 확인 할 수 있습니다.

이제 해당 인스턴스의 공인 IP로 브라우저를 통해서 접근해서 서비스를 확인해 봅니다. Node의 IP 주소는 EC2 서비스 대시 보드에서 확인 할 수 있습니다.

eksworkshop-managed-ng-public-01-node 들의 EIP를 확인합니다.

eksworkshop-ng-public-01-Node 의 IP 주소를 확인하고 , 브라우저에서 아래와 같이 주소를 입력합니다.

아래와 같은 결과를 확인할 수 있습니다. Pod를 1개 배포했기 때문에 1개의 Pod로 라우팅 되는 것을 확인할 수 있습니다.

이제 Pod를 3개로 늘려서 서비스를 확인해 봅니다.

Pod 3개로 브라우저에서 정상적으로 서비스 되는지 확인해 봅니다.

NodePort 30080~30081을 하나의 노드에서만 Security Group으로 허용했는데도, 서비스 분산이 이뤄집니다. 이것은 특정 Node로 Nodeport로 트래픽이 인입하고, 내부에서는 Service를 통해서 부하 분산이 이뤄지고 있는 것입니다.

Last updated

Was this helpful?