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