Kubernetes에서 NodePort 서비스는 클러스터 외부에서 내부 서비스로 접근할 수 있도록 해주는 중요한 기능이다.
이 글에서는 NodePort 서비스가 iptables를 기반으로 어떻게 동작하는지 분석하고, 실제로 iptables에 등록되는 규칙들을 살펴본다.
1. NodePort란?
Kubernetes에서 Service를 생성할 때 type: NodePort로 설정하면, 클러스터의 각 노드가 특정 포트를 열어 외부 트래픽을 서비스로 전달할 수 있습니다. NodePort의 기본 동작 방식은 다음과 같다.
- 클러스터 내의 각 노드는 동일한 NodePort를 open
- 외부에서 해당 NodePort로 요청하면, 해당 요청이 내부의 Pod로 라우팅
- iptables 또는 IPVS를 사용하여 트래픽을 서비스의 백엔드(Pod)로 전달
2. iptables 기반 NodePort 동작 원리
Kubernetes의 kube-proxy가 iptables 규칙을 자동으로 설정하여 NodePort 트래픽을 처리한다.
실제 iptables를 확인하면서 NodePort의 동작을 살펴보자.
2.1 NodePort 서비스 생성
먼저 NodePort 서비스를 생성한다.
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
selector:
app: my-app
type: NodePort
ports:
- protocol: TCP
port: 80 # 서비스 내부 포트
targetPort: 80 # Pod에서 사용하는 포트
nodePort: 30080 # 노드에서 열리는 포트
이제 해당 서비스가 어떻게 iptables에 등록되는지 확인해보자.
2.2 iptables 규칙 확인
iptables-save 명령어를 사용하여 관련된 규칙을 찾을 수 있다.
iptables-save | grep 30080
출력 예시는 다음과 같다.
-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.0.10/32 -p tcp -m tcp --dport 30080 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.0.10/32 -p tcp -m tcp --dport 30080 -j KUBE-NODEPORTS
-A KUBE-NODEPORTS -p tcp -m tcp --dport 30080 -j KUBE-SVC-XXXXX
위 규칙을 하나씩 분석해 보면
- KUBE-SERVICES 체인의 첫 번째 규칙:
- 외부 IP에서 들어오는 요청이라면 KUBE-MARK-MASQ 체인으로 보내서 SNAT 처리를 한다.
- SNAT : Source IP를 실제 Client가 아닌 Node의 IP로 변경. 실제 Client의 IP가 유지될 경우 pod가 응답을 실제 Client에게 직접 전달할 수 있기 때문에 변경 필요.
- KUBE-SERVICES 체인의 두 번째 규칙:
- 목적지가 서비스의 클러스터 IP(10.96.0.10)이고 NodePort(30080)로 접근하면 KUBE-NODEPORTS 체인으로 보냄.
- KUBE-NODEPORTS 체인:
- 30080 포트의 패킷을 KUBE-SVC-XXXXX 체인으로 전달하여 실제 Pod로 트래픽을 라우팅
2.3 KUBE-SVC 및 DNAT 동작
이제 KUBE-SVC-XXXXX 체인으로 전달된 패킷이 어떻게 처리되는지 확인해 보면
-A KUBE-SVC-XXXXX -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-YYYYY
-A KUBE-SVC-XXXXX -j KUBE-SEP-ZZZZZ
위 규칙에서, KUBE-SVC-XXXXX 체인은 라운드 로빈 방식으로 KUBE-SEP-YYYYY와 KUBE-SEP-ZZZZZ 중 하나로 트래픽을 전달된다.
각 KUBE-SEP-YYYYY 체인은 특정 Pod로 트래픽을 전달하는 DNAT 규칙을 포함한다.
- DNAT : Destination의 IP를 pod의 IP로 변경
-A KUBE-SEP-YYYYY -s 10.244.1.5/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-YYYYY -p tcp -m tcp -j DNAT --to-destination 10.244.1.5:80
위 규칙을 보면 최종적으로 요청이 Pod의 IP(예: 10.244.1.5)와 포트(80)로 전달된다.
3. 정리
- 외부에서 노드의 IP와 NodePort(예: http://<node-ip>:30080)로 요청이 들어옴.
- iptables의 KUBE-NODEPORTS 체인에서 해당 트래픽을 KUBE-SVC-XXXXX 체인으로 보냄.
- KUBE-SVC-XXXXX에서 라운드 로빈 방식으로 특정 Pod로 트래픽을 전달.
- 최종적으로 DNAT 규칙에 의해 요청이 해당 Pod의 IP와 포트로 변경되어 전달됨.
iptables를 기반으로 NodePort 서비스가 동작하는 원리를 분석할 수 있습니다.
Kubernetes에서 트래픽이 어떻게 흐르는지 이해하는 데 도움이 되기를 바랍니다!
'Cloud > Kubernetes' 카테고리의 다른 글
Container의 개념 (0) | 2024.10.13 |
---|---|
Kubernetes PodDisruptionBudget(PDB) 활용 (0) | 2023.05.03 |
HTTPS통신을 위한 Nginx Ingress 설정 (0) | 2023.04.13 |
kubernetes환경에 nginx ingress 설치하기 (0) | 2023.04.12 |
EKS multiple CIDR사용 방법 (0) | 2023.04.01 |