Windows에서의 네트워킹
Windows에서의 네트워킹 (Networking on Windows)
Kubernetes는 노드 운영체제로 Linux 또는 Windows를 지원해요. 하나의 클러스터 안에 두 종류의 노드를 섞어서 운영하는 것도 가능합니다. 이 페이지에서는 Windows 운영체제에 특화된 네트워킹에 대한 개요를 설명드릴게요.
Windows에서의 컨테이너 네트워킹 (Container networking on Windows)
Windows 컨테이너의 네트워킹은 CNI 플러그인을 통해 노출돼요. 네트워킹 측면에서 Windows 컨테이너는 가상 머신과 비슷하게 동작합니다. 각 컨테이너에는 Hyper-V 가상 스위치(vSwitch)에 연결되는 가상 네트워크 어댑터(vNIC)가 있죠.
HNS(Host Networking Service)와 HCS(Host Compute Service)가 함께 협력하여 컨테이너를 만들고 컨테이너 vNIC를 네트워크에 연결합니다. HCS는 컨테이너의 관리를 담당하고, HNS는 다음과 같은 네트워킹 리소스 관리를 담당해요:
- 가상 네트워크 (vSwitch 생성 포함)
- 엔드포인트 / vNIC
- 네임스페이스
- 패킷 캡슐화, 로드 밸런싱 규칙, ACL, NAT 규칙을 포함한 정책
Windows의 HNS와 vSwitch는 네임스페이싱을 구현하며, pod 또는 컨테이너에 필요한 대로 가상 NIC를 만들 수 있어요. 하지만 DNS, 라우트, 메트릭 같은 많은 설정은 Linux처럼 /etc 안의 파일로 저장되는 게 아니라 Windows 레지스트리 데이터베이스에 저장됩니다. 컨테이너의 Windows 레지스트리는 호스트의 레지스트리와 분리되어 있어서, 호스트의 /etc/resolv.conf를 컨테이너에 매핑한다던지 하는 개념이 Linux에서와 같은 효과를 내지 못해요. 이런 값들은 해당 컨테이너의 컨텍스트에서 실행되는 Windows API를 통해 설정해야 합니다. 그래서 CNI 구현체는 파일 매핑에 의존하지 않고 HNS를 호출해서 네트워크 세부 정보를 pod나 컨테이너에 전달해야 해요.
네트워크 모드 (Network modes)
Windows는 다섯 가지 네트워킹 드라이버/모드를 지원합니다: L2bridge, L2tunnel, Overlay(베타), Transparent, NAT. Windows와 Linux 워커 노드가 섞인 이종(heterogeneous) 클러스터에서는 Windows와 Linux 양쪽에서 모두 호환되는 네트워킹 솔루션을 선택해야 해요. 아래 표는 Windows에서 지원되는 out-of-tree 플러그인과 각 CNI를 언제 사용하면 좋을지에 대한 권장 사항을 정리한 것입니다.
| 네트워크 드라이버 | 설명 | 컨테이너 패킷 수정 | 네트워크 플러그인 | 네트워크 플러그인 특성 |
|---|---|---|---|---|
| L2bridge | 컨테이너가 외부 vSwitch에 연결됩니다. 컨테이너는 언더레이 네트워크에 연결되지만, MAC이 ingress/egress 시 재작성되므로 물리 네트워크가 컨테이너 MAC을 학습할 필요는 없어요. | MAC이 호스트 MAC으로 재작성되고, HNS OutboundNAT 정책을 사용해 IP도 호스트 IP로 재작성될 수 있습니다. | win-bridge, Azure-CNI, Flannel host-gateway는 win-bridge를 사용 | win-bridge는 L2bridge 네트워크 모드를 사용해 컨테이너를 호스트의 언더레이에 연결하며 최고의 성능을 제공합니다. 노드 간 연결을 위해 사용자 정의 라우트(UDR)가 필요해요. |
| L2Tunnel | L2bridge의 특수한 경우로, Azure에서만 사용됩니다. 모든 패킷이 가상화 호스트로 전송되어 SDN 정책이 적용돼요. | MAC이 재작성되고 IP는 언더레이 네트워크에 보입니다. | Azure-CNI | Azure-CNI는 컨테이너를 Azure vNET과 통합하고 Azure Virtual Network가 제공하는 일련의 기능을 활용할 수 있게 해줍니다. 예를 들어 Azure 서비스에 안전하게 연결하거나 Azure NSG를 사용할 수 있어요. azure-cni의 예시를 참고하세요. |
| Overlay | 컨테이너에 외부 vSwitch에 연결된 vNIC가 주어집니다. 각 오버레이 네트워크는 사용자 정의 IP 프리픽스로 정의된 자체 IP 서브넷을 갖습니다. 오버레이 네트워크 드라이버는 VXLAN 캡슐화를 사용해요. | 외부 헤더로 캡슐화됩니다. | win-overlay, Flannel VXLAN(win-overlay 사용) | 가상 컨테이너 네트워크를 호스트의 언더레이로부터 격리하고 싶을 때(예: 보안상 이유로) win-overlay를 사용해야 해요. 데이터센터에서 IP가 제한되어 있다면, 서로 다른 오버레이 네트워크(서로 다른 VNID 태그를 가진)에 IP를 재사용할 수 있게 해줍니다. 이 옵션은 Windows Server 2019에 KB4489899가 필요합니다. |
| Transparent (ovn-kubernetes의 특수 사용 사례) | 외부 vSwitch가 필요합니다. 컨테이너는 외부 vSwitch에 연결되고, 논리적 네트워크(논리 스위치와 라우터)를 통해 pod 내 통신이 가능해져요. | 패킷은 같은 호스트에 없는 pod에 도달하기 위해 GENEVE 또는 STT 터널링으로 캡슐화됩니다. 패킷은 ovn 네트워크 컨트롤러가 제공하는 터널 메타데이터 정보를 통해 전달되거나 드랍돼요. north-south 통신은 NAT로 처리됩니다. | ovn-kubernetes | ansible로 배포할 수 있습니다. 분산 ACL을 Kubernetes 정책으로 적용할 수 있고, IPAM을 지원하며, kube-proxy 없이도 로드 밸런싱이 가능하고, iptables/netsh 없이 NAT를 처리해요. |
| NAT ( Kubernetes에서 사용되지 않음) | 컨테이너에 내부 vSwitch에 연결된 vNIC가 주어집니다. DNS/DHCP는 WinNAT이라는 내부 컴포넌트로 제공됩니다. | MAC과 IP가 호스트 MAC/IP로 재작성됩니다. | nat | 완전성을 위해 여기에 포함했어요. |
위에서 언급했듯이, Flannel CNI 플러그인도 VXLAN 네트워크 백엔드( 베타 지원 ; win-overlay로 위임)와 host-gateway 네트워크 백엔드(안정 지원; win-bridge로 위임)를 통해 Windows에서 지원됩니다.
이 플러그인은 참조 CNI 플러그인(win-overlay, win-bridge) 중 하나로 위임해 Windows의 Flannel 데몬(Flanneld)과 함께 동작하며, 노드 서브넷 임대 자동 할당과 HNS 네트워크 생성을 처리해요. 플러그인은 자체 설정 파일(cni.conf)을 읽고, FlannelD가 생성한 subnet.env 파일의 환경 변수와 합칩니다. 그런 다음 네트워크 플러밍을 위해 참조 CNI 플러그인 중 하나로 위임하고, 노드에 할당된 서브넷이 포함된 올바른 설정을 IPAM 플러그인(예: host-local)에 전달합니다.
Node, Pod, Service 객체에 대해 다음 네트워크 흐름이 TCP/UDP 트래픽으로 지원됩니다:
- Pod → Pod (IP)
- Pod → Pod (이름)
- Pod → Service (Cluster IP)
- Pod → Service (PQDN, 단 "."이 없는 경우에만)
- Pod → Service (FQDN)
- Pod → 외부 (IP)
- Pod → 외부 (DNS)
- Node → Pod
- Pod → Node
IP 주소 관리 (IPAM)
Windows에서 지원되는 IPAM 옵션은 다음과 같습니다:
- host-local
- azure-vnet-ipam (azure-cni 전용)
- Windows Server IPAM (IPAM이 설정되지 않은 경우의 대체 옵션)
Direct Server Return (DSR)
기능 상태: Kubernetes v1.34부터 Stable
이 기능은 Kubernetes에서 안정(stable) 기능이며 v1.34부터 그랬어요. 처음에는 v1.14 릴리스에서 등장했습니다. 이제는 이 기능이나 동작을 비활성화하거나 옵트아웃할 수 없습니다(잠겨 있음). 관련 기능 게이트 WinDSR에 명시적으로 값을 설정해도 Kubernetes는 이를 무시하되 오류는 보고하지 않아요.
IP 주소 픽스업과 LBNAT이 컨테이너 vSwitch 포트에서 직접 발생하는 로드 밸런싱 모드로, 서비스 트래픽이 출발지 pod IP를 소스 IP로 설정한 채 도착합니다. 이는 반환 트래픽이 로드 밸런서를 경유하지 않고 클라이언트에 직접 응답할 수 있게 해 성능을 최적화하며, 로드 밸런서의 부하와 전체 지연시간을 줄여줍니다. 자세한 내용은 Direct Server Return (DSR) in a nutshell을 읽어보세요.
로드 밸런싱과 Service (Load balancing and Services)
Kubernetes Service는 논리적인 Pod 집합과 그것에 네트워크로 접근하는 방법을 정의하는 추상화입니다. Windows 노드가 포함된 클러스터에서는 다음 유형의 Service를 사용할 수 있어요:
NodePortClusterIPLoadBalancerExternalName
Windows 컨테이너 네트워킹은 Linux 네트워킹과 몇 가지 중요한 면에서 다릅니다. Windows Container Networking에 대한 Microsoft 문서에서 추가 세부 정보와 배경을 확인할 수 있어요.
Windows에서는 Service와 로드 밸런싱 동작을 구성하기 위해 다음 설정을 사용할 수 있습니다:
| 기능 | 설명 | 지원되는 최소 Windows OS 빌드 | 활성화 방법 |
|---|---|---|---|
| 세션 어피니티 (Session affinity) | 특정 클라이언트의 연결이 매번 같은 Pod로 전달되도록 보장합니다. | Windows Server 2022 | service.spec.sessionAffinity를 "ClientIP"로 설정 |
| Direct Server Return (DSR) | 위 DSR 설명 참고. | Windows Server 2019 | 다음 명령줄 인자 설정 (1.37 버전 기준): --enable-dsr=true |
| Preserve-Destination | 서비스 트래픽의 DNAT를 건너뛰어 백엔드 Pod에 도달하는 패킷에서 대상 서비스의 가상 IP를 보존합니다. 노드-노드 포워딩도 비활성화해요. | Windows Server, 버전 1903 | 서비스 어노테이션에 "preserve-destination": "true"를 설정하고 kube-proxy에서 DSR 활성화 |
| IPv4/IPv6 듀얼 스택 네트워킹 | 클러스터로/에서/내부에서 IPv4-to-IPv4와 IPv6-to-IPv6 통신을 병렬로 지원 | Windows Server 2019 | IPv4/IPv6 dual-stack 참고 |
| 클라이언트 IP 보존 (Client IP preservation) | 들어오는 인그레스 트래픽의 소스 IP가 보존되도록 보장합니다. 노드-노드 포워딩도 비활성화돼요. | Windows Server 2019 | service.spec.externalTrafficPolicy를 "Local"로 설정하고 kube-proxy에서 DSR 활성화 |
Windows Service 설정
제한 사항 (Limitations)
Windows 노드에서는 다음 네트워킹 기능이 지원되지 않습니다:
- 호스트 네트워킹 모드 (Host networking mode)
- 노드 자체에서의 로컬 NodePort 접근 (다른 노드나 외부 클라이언트에서는 동작)
- 단일 Service에 대해 64개 이상의 백엔드 pod (또는 고유 대상 주소)
- 오버레이 네트워크에 연결된 Windows pod 간 IPv6 통신
- 비-DSR 모드에서의 Local Traffic Policy
win-overlay,win-bridge, 또는 Azure-CNI 플러그인을 통한 ICMP 프로토콜 아웃바운드 통신. 구체적으로, Windows 데이터 플레인( VFP)은 ICMP 패킷 변환(transposition)을 지원하지 않습니다. 즉:- 같은 네트워크 내 대상으로 향하는 ICMP 패킷(예: ping을 통한 pod 간 통신)은 정상 동작합니다.
- TCP/UDP 패킷은 정상 동작합니다.
- 원격 네트워크를 통과하도록 향하는 ICMP 패킷(예: 외부 인터넷과의 ping 통신)은 변환될 수 없어 소스로 다시 라우팅되지 않아요.
- TCP/UDP 패킷은 여전히 변환될 수 있으므로, 외부 세계와의 연결성 디버깅 시
ping <destination>대신curl <destination>을 사용할 수 있습니다.
기타 제한 사항:
- Windows 참조 네트워크 플러그인인 win-bridge와 win-overlay는
CHECK구현이 없어 CNI spec v0.4.0을 구현하지 않습니다. - Windows에서 Flannel VXLAN CNI 플러그인의 제한 사항:
- Flannel v0.12.0(또는 그 이상)에서만 로컬 pod에 대한 node-pod 연결이 가능합니다.
- Flannel은 VNI 4096과 UDP 포트 4789 사용으로 제한됩니다. 이 파라미터에 대한 자세한 내용은 공식 Flannel VXLAN 백엔드 문서를 참고하세요.