제한 사항 및 알려진 문제
제한 사항 및 알려진 문제 (Limitations and known issues)
Windows용 Calico Open Source에는 설치를 계획하기 전에 반드시 확인해야 할 알려진 제한 사항들이 있습니다. 이 문서는 배포 가능한 플랫폼, 네트워킹 기능 제약, 알려진 이슈까지 한눈에 짚어 줍니다. Windows 노드를 클러스터에 넣기 전에 이 목록을 먼저 훑어보세요.
출처: 문서
본문
Windows용 Calico 기능 제한
| 기능 | |
|---|---|
| 배포판(Distributions) | 지원됨: - EKS - AKS - AWS - GCE - Azure - 온프레미스 Kubernetes - DigitalOcean의 Kubernetes - OpenShift - Rancher RKE 지원 안 됨: - GKE - IKS - OpenStack - K3s 클러스터 |
| 설치 및 업그레이드 | 지원됨: - 오퍼레이터 설치 지원 안 됨: - 비(非)클러스터 호스트 - 확장용 Typha 컴포넌트 (Linux 기반 기능) |
| 네트워킹 | 지원됨: - Calico VXLAN, 크로스 서브넷 또는 VXLAN MTU 설정 없음, 제한 사항 있음 - BGP 피어링을 사용하는 Calico 논오버레이(non-overlay) 모드, 제한 사항 있음 - IPv4 지원 안 됨: - BGP 피어링을 사용하는 오버레이 모드 - BGP 라우팅을 사용하는 IP in IP 오버레이 - VXLAN의 크로스 서브넷 지원 및 MTU 설정 - IPv6 및 듀얼 스택 - 서비스 광고 |
| 보안 | 지원 안 됨: - Istio용 애플리케이션 계층 정책(ALP) - 호스트를 위한 정책 (자동 호스트 엔드포인트를 포함한 호스트 엔드포인트) - WireGuard를 사용한 암호화 |
| 가시성 및 문제 해결 | 가시성 및 문제 해결 |
| 운영(Operations) | 지원됨: - Calico 노드 상태 |
| 메트릭 | 지원됨: Prometheus 모니터링 |
| eBPF | 지원 안 됨: (Linux 기반 기능) |
Calico BGP 네트워킹 제한
Calico를 BGP와 함께 사용한다면 Windows 관련 현재 제한 사항에 유의하세요.
| 기능 | 제한 |
|---|---|
| IP 이동성/빌리기(borrowing) | Calico IPAM은 집계를 위해 호스트에 IP를 블록 단위로 할당합니다. IP 풀이 가득 차면 노드는 다른 노드의 블록에서 IP를 "빌릴" 수도 있습니다. BGP 관점에서 보면 IP를 빌려간 쪽은 빌린 IP에 대해 더 구체적인 "/32" 경로를 광고하고, 그 IP로 향하는 트래픽만 빌려간 호스트로 라우팅됩니다. Windows 노드는 이 빌리기 메커니즘을 지원하지 않습니다. IP 풀이 가득 찼더라도 IP를 빌리지 않으며, 자신의 블록에 Linux 노드가 빌려가지 못하도록 표시를 남깁니다. |
| Windows용으로 예약된 IP | Calico IPAM은 CIDR 블록 단위로 IP를 할당합니다. Windows의 네트워킹 요구 사항 때문에 Windows 노드가 소유한 블록마다 네 개의 IP를 내부 용도로 예약해야 합니다. 예를 들어 기본 블록 크기가 /26이면 각 블록은 64개의 IP 주소를 담고, 4개는 Windows용으로 예약되어 파드 네트워킹에 60개가 남습니다. 이 예약의 영향을 줄이려면 (파드를 만들기 전에) IP 풀 범위에서 더 큰 블록 크기를 설정할 수 있습니다. |
| 호스트당 단일 IP 블록 | Calico IPAM은 요청 시 호스트에 (기본 크기 /26의) IP 블록을 할당하도록 설계되었습니다. Calico CNI 플러그인도 같은 방식으로 작성되었지만, kube-proxy는 현재 호스트당 단일 IP 블록만 지원합니다. 호스트당 /26 하나라는 기본 제한을 우회하는 몇 가지 옵션이 있습니다. - 블록을 만들기 전에 Calico BGP 네트워킹과 etcd 데이터스토어를 사용한다면, IP 풀에서 사용하는 블록 크기를 단일 Windows 호스트에서 사용할 파드 수의 최댓값을 감당할 수 있도록 바꾸세요. - 쿠버네티스 데이터스토어와 함께 Calico BGP 네트워킹을 사용하세요. 이 모드에서는 Calico IPAM을 사용하지 않고, 노드의 Pod CIDR로 CNI host-local IPAM 플러그인을 사용합니다. 호스트당 여러 IPAM 블록을 허용하려면(kube-proxy 호환성을 희생하면서) Calico 설치 전에 cni.conf.template에서 windows_use_single_network 플래그를 false로 설정하세요. 파드가 이미 네트워킹된 뒤에 이 설정을 바꾸는 것은 HNS 엔드포인트가 누출될 수 있어 권장하지 않습니다. |
| IP-in-IP 오버레이 | Calico의 IPIP 오버레이 모드는 Windows가 IP-in-IP를 지원하지 않기 때문에 Windows 노드가 포함된 클러스터에서는 사용할 수 없습니다. |
| NATOutgoing | Calico IP 풀은 다음 동작을 가진 "NAT outgoing" 설정을 지원합니다. - (어떤 IP 풀에 있든) Calico 워크로드 간 트래픽은 NAT되지 않습니다. - 설정된 IP 풀 밖으로 나가는 트래픽은 워크로드가 NAT outgoing이 활성화된 IP 풀 안의 IP를 가질 때 NAT됩니다. Windows용 Calico도 위 설정을 존중하지만 파드 생성 시점에만 적용됩니다. 파드가 생성된 뒤 IP 풀 설정이 업데이트되면 그 파드의 트래픽은 이전과 같이 (NAT되거나 그렇지 않은 채로) 계속됩니다. 새로 네트워킹되는 파드의 NAT 정책은 새 설정을 따릅니다. Windows용 Calico는 호스트 자신과 그 서브넷을 NAT 제외 목록에 자동으로 추가합니다. 이 동작은 설치 스크립트를 실행하기 전에 cni.conf.template에서 windows_disable_host_subnet_nat_exclusion 플래그를 true로 설정해 비활성화할 수 있습니다. |
| 서비스 IP 광고 | 이 Calico 기능은 Windows에서 지원되지 않습니다. |
네트워크 구성 확인하기
레이어 2 도달 가능성이 필요한 네트워킹 타입(예: 패브릭 피어링 없이 BGP 메시를 사용하는 Calico)을 사용 중이라면, 다음 방법으로 네트워크에 레이어 2 도달 가능성이 있는지 확인할 수 있습니다.
각 노드에서 파드 네트워킹에 사용할 네트워크 어댑터의 IP 네트워크를 확인합니다. 예를 들어 Linux에서 네트워크 어댑터가 eth0이라고 가정하면 다음을 실행할 수 있습니다.
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:cb:c8:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.171.136/24 brd 192.168.171.255 scope
global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fecb:c819/64 scope
link
valid_lft forever preferred_lft
forever
이 경우 IPv4는 192.168.171.136/24이고, /24 마스크를 적용하면 IP 네트워크는 192.168.171.0/24가 됩니다.
마찬가지로 Windows에서는 다음을 실행할 수 있습니다.
PS C:\> ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Ethernet 2):
Connection-specific DNS Suffix . :
us-west-2.compute.internal Link-local IPv6 Address . . . . . : fe80::6d10:ccdd:bfbe:bce2%15 IPv4 Address. . . . . . . . . . . : 172.20.41.103 Subnet Mask . . . . . . . . . . . . : 255.255.224.0 Default Gateway . . . . . . . . . : 172.20.32.1
이 경우 IPv4 주소는 172.20.41.103이고 마스크는 CIDR 표기법이 아닌 255.255.224.0이라는 바이트로 표현됩니다. 마스크를 적용하면 네트워크 주소 172.20.32.0/19를 얻습니다.
Linux 노드는 네트워크 192.168.171.136/24를 가지고 Windows 노드는 다른 네트워크인 172.20.32.0/19를 가지므로, 두 노드가 같은 레이어 2 네트워크에 있을 가능성은 낮습니다.
Calico VXLAN 네트워킹 제한
Linux와 Windows 데이터 플레인 기능 집합의 차이 때문에 다음 Calico 기능들은 Windows에서 지원되지 않습니다.
| 기능 | 제한 |
|---|---|
| Windows용으로 예약된 IP | Calico IPAM은 CIDR 블록 단위로 IP를 할당합니다. Windows의 네트워킹 요구 사항 때문에 Windows 노드가 소유한 블록마다 네 개의 IP를 내부 용도로 예약해야 합니다. 예를 들어 기본 블록 크기가 /26이면 각 블록은 64개의 IP 주소를 담고, 4개는 Windows용으로 예약되어 파드 네트워킹에 60개가 남습니다. 이 예약의 영향을 줄이려면 (파드를 만들기 전에) IP 풀 범위에서 더 큰 블록 크기를 설정할 수 있습니다. |
| 호스트당 단일 IP 블록 | Calico IPAM은 요청 시 호스트에 (기본 크기 /26의) IP 블록을 할당하도록 설계되었습니다. Calico CNI 플러그인도 같은 방식으로 작성되었지만, kube-proxy는 현재 호스트당 단일 IP 블록만 지원합니다. 호스트당 여러 IPAM 블록을 허용하려면(kube-proxy 호환성을 희생하면서) Calico 설치 전에 cni.conf.template에서 windows_use_single_network 플래그를 false로 설정하세요. 파드가 이미 네트워킹된 뒤에 이 설정을 바꾸는 것은 HNS 엔드포인트가 누출될 수 있어 권장하지 않습니다. |
클라우드 프로바이더에서 경로가 사라지는 문제
클라우드 프로바이더(예: AWS)로 Windows 호스트를 만들면 Calico 설치 시점에 vSwitch 생성 과정이 클라우드 프로바이더의 메타데이터 경로를 제거할 수 있습니다. 애플리케이션이 메타데이터 서비스에 의존한다면, 사라진 경로를 복구하기 위해 Calico 설치 전후로 라우팅 테이블을 확인해야 할 수 있습니다.
VXLAN 제한
VXLAN 지원
- Windows 1903 빌드 18317 이상
- Windows 1809 빌드 17763 이상
설정 업데이트
첫 파드가 네트워킹된 이후에는 특정 설정 변경이 반영되지 않습니다. Windows는 현재 네트워크가 생성된 뒤 VXLAN 서브넷 파라미터 업데이트를 지원하지 않아서, 그 파라미터를 바꾸려면 노드를 드레인해야 합니다.
한 예가 VXLAN VNI 설정입니다. 이런 파라미터를 바꾸려면:
-
모든 파드를 노드에서 드레인합니다.
-
Calico HNS 네트워크를 삭제합니다.
Import-Module -DisableNameChecking C:\CalicoWindows\libs\hns\hns.psm1 Get-HNSNetwork | ? Name -EQ "Calico" | Remove-HNSNetwork -
config.ps1의 설정을 업데이트하고,uninstall-calico.ps1을 실행한 다음install-calico.ps1을 실행해 CNI 설정을 다시 생성합니다.
파드 간 연결이 TCP 리셋 패킷으로 끊기는 문제
Felix를 재시작하거나 정책 변경(정책에서 참조하는 엔드포인트의 변경 포함)이 일어나면, 파드 간 연결이 TCP 리셋 패킷으로 끊길 수 있습니다. 다음 중 하나가 일어나면:
- 파드에 적용되는 정책이 업데이트됨
- 파드에 적용되는 ingress 또는 egress 정책이 셀렉터를 포함하고, 그 셀렉터가 매치하는 엔드포인트 집합이 바뀜
Felix는 파드에 붙은 HNS ACL 정책을 다시 프로그래밍해야 합니다. 이 재프로그래밍이 TCP 리셋을 일으킬 수 있습니다. Microsoft는 이것이 HNS 문제임을 확인했고 조사 중입니다.
네트워크 정책에서 셀렉터/파드 IP와 호환되지 않는 서비스 ClusterIP
Windows 1809 빌드 17763.1432 이전
Windows 노드에서 kube-proxy는 로컬 파드에서 서비스 ClusterIP로 가는 트래픽에 무조건 소스 NAT를 적용합니다. 즉, 정책이 적용되는 목적지 파드에서 보면 트래픽이 소스 파드가 아니라 소스 호스트에서 온 것처럼 보입니다. 그 결과, 소스 파드에 매치하는 소스 셀렉터를 가진 네트워크 정책은 기대한 트래픽에 매치하지 않습니다.
네트워크 정책과 셀렉터 사용
특정 조건에서는 비교적 단순한 Calico 정책이라도 상당한 Windows 데이터 플레인 자원을 요구할 수 있고, 이는 큰 CPU와 메모리 사용량, 그리고 큰 정책 프로그래밍 지연으로 이어질 수 있습니다.
소스와 목적지 셀렉터를 모두 가진 규칙이 포함된 정책은 피하는 것을 권장합니다. 다음은 비효율적일 수 있는 정책의 예입니다. 이 정책은 모든 워크로드에 적용되며, client로 레이블된 워크로드에서 server로 레이블된 워크로드로 가는 트래픽만 허용합니다.
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: calico-dest-selector
spec:
selector: all()
order: 500
ingress:
- action: Allow
destination:
selector: role == "webserver"
source:
selector: role == "client"
이 정책은 모든 워크로드에 적용되기 때문에 워크로드마다 한 번씩 렌더링되고(워크로드가 server로 레이블되지 않았더라도), 그다음 셀렉터가 허용된 연결을 잡아내기 위해 수많은 개별 데이터 플레인 규칙으로 확장됩니다.
다음은 같은 트래픽을 여전히 허용하면서 훨씬 더 효율적인 정책입니다.
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: calico-dest-selector
spec:
selector: role == "webserver"
order: 500
ingress:
- action: Allow
source:
selector: role == "client"
목적지 셀렉터를 정책 셀렉터로 옮겼기 때문에 이 정책은 role: webserver 레이블을 가진 워크로드에만 렌더링됩니다. 추가로 규칙이 단순화되어 트래픽의 소스에만 매치합니다. webserver 파드 수에 따라 이 변경은 데이터 플레인 자원 사용량을 몇 자릿수 줄일 수 있습니다.
다음 단계(Next steps)
더 알아보기 (Learn more)
Windows용 Calico는 Linux와 데이터 플레인 구조가 달라서 지원되지 않는 기능이 상당히 많습니다. 설치 전에 기능 제한 표를 꼼꼼히 확인하고, BGP/VXLAN 제약은 IPAM 블록 설계에 직접 영향을 준다는 점을 기억하세요. 셀렉터를 정책 셀렉터로 올리는 최적화 기법은 Windows에서 특히 효과가 큽니다.