쿠버네티스 네트워킹은 Pod 간 통신, 서비스 디스커버리, 외부 접근 등을 포함한다.
앞서 서비스, 인그레스 등을 다뤘지만, 이번에는 내부 네트워크 동작 원리에 초점을 맞춰 간략히 정리한다.
Pod간 통신 관점
Pod IP 및 통신
- Kubernetes에서 각 Pod는 고유 IP를 갖는다 (Pods are given unique IPs).
- 클러스터 내 모든 Pod는 하나의 가상 네트워크에 연결되어 있으며, IP를 통해 서로 직접 통신 가능하다.
- (클러스터의 CNI 플러그인, k3s 기본은 Flannel VXLAN이 이를 구현)
- 즉, Pod A에서 Pod B의 IP로 요청을 보내면, 노드 경계와 상관없이 네트워크 패킷이 전달된다. 이는 kube-proxy와 CNI가 협력하여 이루어진다.
- 그러나 직접 Pod IP를 사용해 통신하는 것은 Pod 생멸이 빈번하기에 바람직하지 않고, 서비스를 통해 간접 통신하는 패턴이 일반적이다.
Service와 DNS 재관
- Service를 만들면 clusterIP (가상IP)가 생성되고, DNS 이름도 할당된다.
- 예를 들어 "my-service"라는 서비스가 "default" 네임스페이스에 있다면
- DNS 이름: my-service.default.svc.cluster.local (간단히 my-service로도 조회 가능, Pod의 DNS search 설정에 의해).
- 이 DNS 이름을 조회하면 clusterIP를 반환하고, 클러스터 내 kube-proxy가 해당 IP로 오는 트래픽을 실제 백엔드 Pod들로 전달한다 (iptables 또는 IPVS 사용).
- 이렇게 서비스 디스커버리가 이루어져, Pod 수가 동적으로 변해도 클라이언트는 서비스 이름만으로 통신할 수 있다.
- 예: 앞서 BusyBox Pod에서 wget http://hello-service로 Nginx Pods에 요청한 사례.
CoreDNS
- k3s 클러스터에는 CoreDNS가 기본으로 설치되어, Service와 Pod의 DNS 엔트리를 관리한다.
- CoreDNS는 Kubernetes API를 감시하여 새 서비스/Pod 발생 시 DNS 레코드를 추가하는 플러그인을 사용한다.
- Pod가 조회 시 /etc/resolv.conf에 설정된 클러스터 DNS(CoreDNS 서비스 IP)를 통해 질의하고, CoreDNS가 적절히 응답한다.
외부 통신 (out)
- 클러스터 내부 Pod가 인터넷 등 외부로 나갈 때는, 기본적으로 노드 IP를 통해 NAT되어 나가게 된다 (쿠버네티스 MASQUERADE 동작).
- 특별한 네트워크 정책 없으면 Pod에서 curl google.com 같은 외부통신이 가능하며, 노드의 네트워크를 통해 나간다.
외부 통신 (in)
- 외부에서 클러스터로 들어오는 통신은 앞서 본 NodePort나 LoadBalancer, Ingress 등을 통해서만 가능하다.
- 기본적으로 클러스터 Pod 네트워크는 외부에서 접근 불가 (사설)이며, NodePort나 LoadBalancer Service가 노드 방화벽 규칙을 만들어 포트를 열어준다.
- k3s ServiceLB는 LoadBalancer 서비스시 각 노드 hostPort 포워딩 Pod를 생성하여 동작한다.
Network Policy
- 쿠버네티스에서는 NetworkPolicy를 통해 Pod 간 트래픽을 제어할 수 있다.
- 이는 쿠버네티스의 방화벽 규칙이라고 생각하면 된다.
- 기본 설정에서는 모든 Pod 간 통신이 열려있지만, NetworkPolicy 리소스를 만들면 특정 Pod의 인바운드/아웃바운드 트래픽을 제한할 수 있다. (k3s는 kube-router netpol controller를 내장)
클러스터 아키텍처 관점
클러스터는 크게 다음과 같은 구성으로 분류한다
- Control Plane
- API server
- scheduler
- etcd
- controller manager
- Worker Node
- kubelet
- kube-proxy
- container runtime
- pods
k3s single-node에서는 모두 한 노드에 있지만, multi-node에서는 control plane와 nodes가 네트워크로 연결된다.
kube-proxy
각 노드에서 실행되며, Service의 clusterIP를 위한 iptables 규칙을 관리한다.
client가 clusterIP:port로 패킷을 보내면, kube-proxy가 endpoints 중 하나로 DNAT해준다. (SessionAffinity 등 고려)
CNI (Container Network Interface)
CNI는 Pod 네트워크 구현 모듈이다.
k3s default flannel은 overlay 네트워크로 각 Pod에 IP를 할당하고, 노드 간 VXLAN으로 패킷을 전달한다.
요약
Kubernetes 네트워킹의 기본은 flat Pod network와 서비스를 통한 서비스 디스커버리이다.
- 모든 Pod는 (Policy 없으면) 서로 통신 가능하며, 서비스는 안정적인 이름과 가상 IP로 Pod들을 묶어주는 역할을 한다
- DNS는 서비스와 Pod 이름 해석을 지원하여 사람이 읽기 좋은 이름으로 접근하게 해준다.
- 외부 접근은 NodePort/LoadBalancer/Ingress로 제어되고, 보안적으로도 ClusterIP만 있는 서비스는 외부에 노출되지 않는다.
배운 개념
- Pod Network(모든 Pod IP 통신), Service ClusterIP 동작
- DNS 구성
- Ingress Controller 역할 (L7)
- NetworkPolicy로 통신 제어 가능함 등.
'WEB BE Repository > kubernetes, k8s' 카테고리의 다른 글
| [쿠버네티스 튜토리얼] 4. ConfigMap과 Secret 활용 (0) | 2025.12.20 |
|---|---|
| [쿠버네티스 튜토리얼] 3. 서비스 노출: ClusterIP, NodePort, Ingress (0) | 2025.12.19 |
| [쿠버네티스 튜토리얼] 2. Deployment 생성과 ReplicaSet 이해 (0) | 2025.12.18 |
| [쿠버네티스 튜토리얼] 1. k3s로 배워보자. (0) | 2025.12.17 |