iptables

iptables

🔹 iptables란? (Kubernetes에서 트래픽을 라우팅하는 핵심 구성 요소)

iptables는 리눅스에서 패킷 필터링 및 네트워크 주소 변환(NAT)을 수행하는 방화벽 및 패킷 처리 도구다.
쿠버네티스에서는 kube-proxy가 iptables 규칙을 설정하여 서비스 트래픽을 적절한 Pod로 라우팅한다.


📌 Kubernetes에서 iptables 역할

1. 서비스의 클러스터 IP(가상 IP)를 Pod의 실제 IP로 매핑
2. NodePort 서비스의 트래픽을 적절한 노드의 Pod로 전달
3. 외부에서 들어오는 요청을 내부 Pod로 전달 (DNAT 적용)
4. Pod 간 통신을 제어하여 네트워크 정책 적용 가능


📌 1. iptables를 활용한 서비스 트래픽 흐름

🔹 서비스 생성 후 iptables 변화 예제

kubectl apply -f my-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  • my-service가 생성되면 kube-proxy가 iptables 규칙을 설정

📌 2. iptables 규칙 확인

✅ iptables NAT 테이블 확인

iptables -t nat -L -n -v | grep my-service

출력 예시:

DNAT       tcp  --  0.0.0.0/0   10.96.0.50  tcp dpt:80 -> 10.244.1.10:8080
DNAT       tcp  --  0.0.0.0/0   10.96.0.50  tcp dpt:80 -> 10.244.2.15:8080

💡 해석:

  • 10.96.0.50 (my-service의 Cluster IP)로 들어온 요청을 Pod IP(10.244.1.10, 10.244.2.15)로 전달
  • targetPort: 8080에 맞춰 변환됨

✅ iptables 필터 테이블 확인

iptables -t filter -L -n -v
  • Pod 간 통신이 허용되는지 확인 가능

📌 3. iptables 기반 트래픽 흐름 예제

🔹 my-service로 요청을 보낼 때 흐름

1️⃣ curl my-service:80 요청 시, DNS 조회를 통해 클러스터 IP(10.96.0.50) 획득
2️⃣ iptables NAT 규칙을 확인하여 요청을 Pod IP(10.244.1.10:8080)로 포워딩
3️⃣ kube-proxyiptables을 사용하여 트래픽을 적절한 Pod로 전달
4️⃣ Pod에서 응답 후 클라이언트로 반환


📌 4. iptables 기반 NodePort 동작 방식

kubectl expose deployment my-app --type=NodePort --port=80 --target-port=8080

NodePort를 사용하면 모든 노드의 특정 포트(예: 30080)에서 트래픽을 받을 수 있음

🔹 iptables NAT 규칙 예제

iptables -t nat -L -n -v | grep 30080
DNAT       tcp  --  0.0.0.0/0   192.168.56.101  tcp dpt:30080 -> 10.244.1.10:8080

💡 해석:

  • 192.168.56.101:30080으로 들어온 요청을 Pod(10.244.1.10:8080)로 전달

✅ 정리

쿠버네티스는 kube-proxy를 통해 iptables 규칙을 자동 설정
ClusterIP 서비스는 가상 IP를 통해 Pod로 트래픽을 라우팅
NodePort 서비스는 모든 노드의 특정 포트를 통해 접근 가능
iptables NAT을 활용하여 패킷의 목적지를 Pod로 변경

🚀 iptables는 Kubernetes 서비스 라우팅의 핵심 역할을 수행!