Calico나 Cillium 에서는 파드 혹은 namespace 레벨에서 IN/OUT 트래픽 통제할 수 있다.
1. Calico Mode 요약
Calico는 4가지의 네트워크 모드가 있습니다.
2. IPIP 모드
IPIP 모드
파드간 통신이 IPIP encapsulation을 이용해서 이루어집니다.
ip 헤더에 감싸져서 tunl 인터페이스에서 outer 헤더를 제거하고 내부의 파드와 통신하게 됩니다.
Azure에서는 지원하지 않음
오버헤드가 생겨서 성능이 비교적낮음
3. Direct 모드
Direct 모드는 NIC에 매칭되지 않는 패킷이 차단될 수 있기 때문에, AWS에서는 따로 설정을 꺼줘야합니다. (Sour/Destination Check)
파드 통신 패킷이 노드의 라우팅 정보를 보고 목적지 노드로 패킷 그대로 전달합니다.
실제로 설정하기 쉽지 않습니다. VPC 라우팅 테이블을 변경해줘야합니다.
크로스 서브넷
크로스 서브넷으로, 노드간 같은 네트워크 대역은 Direct, 다른 네트워크 대역은 IPIP로도 동작을 만들 수 있습니다.
3.1 Direct 모드 설정
# AWS CLI 로 특정 인스턴스의 Source/Destination Check 기능을 Disable 하기
aws ec2 modify-instance-attribute --instance-id <*INSTANCE_ID*> --source-dest-check "{\"Value\": false}"
# Calico 모드 정보 확인
calicoctl get ippool -o wide
# (옵션) 모니터링
watch -d "route -n | egrep '(Destination|UG)'"
# ipip 모드설정 끄기
calicoctl get ippool default-ipv4-ippool -o yaml
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/ipipMode: Always/ipipMode: Never/" | calicoctl apply -f -
# 모드 정보 확인 : IPIPMODE 가 Never 로 변경!
calicoctl get ippool -o wide
# BGP 로 전달 받은 파드 네트워크 대역이 호스트 라우팅 테이블에 적용되었는지 확인 : Iface 가 tunl0 에서 ens5 혹은 enp0s8 로 변경!
route -n | egrep '(Destination|UG)'
-> 변경 이후 값들
-> IPIPMODE 가 NEVER로 변경되고 Iface 가 ens5 로 변경된것을 확인할 수 있습니다.
curl -s -O https://raw.githubusercontent.com/gasida/NDKS/main/5/node3-pod3.yaml
kubectl apply -f node3-pod3.yaml
# 파드 IP 정보 확인
kubectl get pod -o wide
calicoctl get wep
# pod 1 접속해서 ping 날리기
kubectl exec -it pod1 -- zsh
## 파드 Shell 에서 아래 입력
ping 172.16.184.1
# 파드가 동작하는 노드의 eth0(예시)에서 패킷 덤프
tcpdump -i ens5 -nn icmp
3.3 크로스 서브넷 모드
# CrossSubnet 모드 설정
calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"CrossSubnet"}}'
# 모드 확인
calicoctl get ippool -o wide
(⎈|HomeLab:default) root@k8s-m:~# calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"CrossSubnet"}}'
Successfully patched 1 'IPPool' resource
(⎈|HomeLab:default) root@k8s-m:~# calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-ipv4-ippool 172.16.0.0/16 true CrossSubnet Never false false all()
//
route -n | grep UG
(⎈|HomeLab:default) root@k8s-m:~# route -n | grep UG
0.0.0.0 192.168.10.1 0.0.0.0 UG 100 0 0 ens5
172.16.34.0 192.168.20.100 255.255.255.0 UG 0 0 0 tunl0 ## 다른 네트워크 대역은IP 모드 확인
172.16.158.0 192.168.10.101 255.255.255.0 UG 0 0 0 ens5
172.16.184.0 192.168.10.102 255.255.255.0 UG 0 0 0 ens5
192.168.0.2 192.168.10.1 255.255.255.255 UGH 100 0 0 ens5
4. VXLAN 모드
Pod 간 통신이 노드간 일때, vxlan encapsulation을 사용합니다.
다른 노드간 파드 통신은 vxlan 인터페이스를 통해서 L2 프레임을 UDP로 상대측 노드로 전달
OUTER 헤더를 제거하고 내부의 파드와 통신합니다.
6. POD 패킷 암호화(네트워크 레벨)
Calico 네트워크 모드 환경 위에서 wireguard 터널을 만들어서 파드 트래픽을 암호화하여 노드간 전달 합니다.
7. 운영
패킷 덤프를 통해서 장애구간을 알기 위한 노력이 필요하다.
카카오나 kt 인프라 장애일때도, 자동화 구성하면서 에러가 많이 나고 해당 사항을 알고 있어야 트러블 슈팅이 가능하다.