들어가며
- 스파클링소다 4는 Container Network Interface로 Calico를 사용합니다.
- Calico는 다양한 네트워크 통신 방법을 제공하고 있습니다.
- 그 중, 기본값인 IPIP모드와 VXLAN 모드에 대해 알아봅니다.
본 설명에 사용된 클러스터 구성과 구동 중인 pod는 아래와 같습니다.
kubectl get node -owide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master1 Ready master 3h11m v1.18.19 192.168.50.161 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://20.10.7 master2 Ready master 3h6m v1.18.19 192.168.50.162 <none> CentOS Linux 7 (Core) 3.10.0-1160.el7.x86_64 docker://20.10.7 master3 Ready master 3h5m v1.18.19 192.168.50.163 <none> CentOS Linux 7 (Core) 3.10.0-1160.81.1.el7.x86_64 docker://20.10.7 kubectl get po -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ping-test-fljwb 1/1 Running 1 174m 6.2.180.2 master2 <none> <none> ping-test-mrrdv 1/1 Running 1 174m 6.2.136.4 master3 <none> <none> ping-test-rfwx9 1/1 Running 2 174m 6.2.137.67 master1 <none> <none>
IPIP 모드
- 파드 간 통신이 노드와 노드 구간에서는 IPIP 인캡슐레이션을 통해서 이루어 집니다.
- 다른 노드의 파드 대역은 BGP로 전달 받아 호스트 라우팅 테이블에 업데이트 됩니다.
- 각 노드에 파드 네트워크 대역은 Bird에 의해 BGP로 광고 전파/전달 되며,
- Felix에 의해 호스트의 라우팅 테이블에 자동으로 추가 및 삭제 됩니다.
- 다른 노드 간의 파드 통신은 tunl0 인터페이스를 통해 IP 헤더에 감싸져서 상대측 노드로 도달 후 tunl0 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신됩니다.
- mode 정보 확인
calicoctl get ippool -o wide NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR default-ipv4-ippool 6.2.0.0/16 true Always Never false all()
- 노드(BGP) Peer 정보 확인
calicoctl node status # from master1 Calico process is running. IPv4 BGP status +----------------+-------------------+-------+----------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +----------------+-------------------+-------+----------+-------------+ | 192.168.50.162 | node-to-node mesh | up | 02:07:01 | Established | | 192.168.50.163 | node-to-node mesh | up | 02:07:01 | Established | +----------------+-------------------+-------+----------+-------------+ # from master2 Calico process is running. IPv4 BGP status +----------------+-------------------+-------+----------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +----------------+-------------------+-------+----------+-------------+ | 192.168.50.161 | node-to-node mesh | up | 02:07:01 | Established | | 192.168.50.163 | node-to-node mesh | up | 02:07:01 | Established | +----------------+-------------------+-------+----------+-------------+ # from master3 Calico process is running. IPv4 BGP status +----------------+-------------------+-------+----------+-------------+ | PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO | +----------------+-------------------+-------+----------+-------------+ | 192.168.50.161 | node-to-node mesh | up | 02:07:01 | Established | | 192.168.50.162 | node-to-node mesh | up | 02:07:01 | Established | +----------------+-------------------+-------+----------+-------------+
- BGP로 전달받은 파드 네트워크 대역이, 호스트 라우팅 테이블에 적용되었는지 확인
route -n | egrep '(Destination|tunl0)' # from master1 Destination Gateway Genmask Flags Metric Ref Use Iface 6.2.136.0 192.168.50.163 255.255.255.192 UG 0 0 0 tunl0 6.2.180.0 192.168.50.162 255.255.255.192 UG 0 0 0 tunl0 # from master2 Destination Gateway Genmask Flags Metric Ref Use Iface 6.2.136.0 192.168.50.163 255.255.255.192 UG 0 0 0 tunl0 6.2.137.64 192.168.50.161 255.255.255.192 UG 0 0 0 tunl0 # from master3 Destination Gateway Genmask Flags Metric Ref Use Iface 6.2.137.64 192.168.50.161 255.255.255.192 UG 0 0 0 tunl0 6.2.180.0 192.168.50.162 255.255.255.192 UG 0 0 0 tunl0
- IPIP 인캡슐레이션 동작을 수행하는 터널 인터페이스 확인
ifconfig tunl0 # from master1 tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480 inet 6.2.137.65 netmask 255.255.255.255 tunnel txqueuelen 1000 (IPIP Tunnel) # from master2 tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480 inet 6.2.180.1 netmask 255.255.255.255 tunnel txqueuelen 1000 (IPIP Tunnel) # from master3 tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480 inet 6.2.136.2 netmask 255.255.255.255 tunnel txqueuelen 1000 (IPIP Tunnel)
- 패킷 캡쳐 확인
# master1 tcpdump -i ens192 proto 4 -w /tmp/calico-ipip.pcap tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes # other node kubectl exec -it ping-test-fljwb -- zsh ping 6.2.137.67
VXLAN
- 파드 간 통신이 노드와 노드 구간에서는 VXLAN 인캡슐레이션을 통해서 이루어 집니다.
- 다른 노드 간의 파드 통신은 vxlan 인터페이스를 통해 L2 프레임이 UDP - VXLAN에 감싸져서 상대측 노드로 도달 후, vxlan 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신됩니다.
- mode 정보 확인
calicoctl get ippool -o wide NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR default-ipv4-ippool 6.2.0.0/16 true Never Always false all()
- 노드(BGP) Peer 정보 확인
calicoctl node status Calico process is running. None of the BGP backend processes (BIRD or GoBGP) are running.
- 파드 네트워크 대역이, 호스트 라우팅 테이블에 적용되었는지 확인
route -n | egrep '(Destination|vxlan)' # from master1 Destination Gateway Genmask Flags Metric Ref Use Iface 6.2.136.0 6.2.136.3 255.255.255.192 UG 0 0 0 vxlan.calico 6.2.180.0 6.2.180.1 255.255.255.192 UG 0 0 0 vxlan.calico # from master2 Destination Gateway Genmask Flags Metric Ref Use Iface 6.2.136.0 6.2.136.3 255.255.255.192 UG 0 0 0 vxlan.calico 6.2.137.64 6.2.137.65 255.255.255.192 UG 0 0 0 vxlan.calico # from master3 Destination Gateway Genmask Flags Metric Ref Use Iface 6.2.137.64 6.2.137.65 255.255.255.192 UG 0 0 0 vxlan.calico 6.2.180.0 6.2.180.1 255.255.255.192 UG 0 0 0 vxlan.calico
- vxlan 인캡슐레이션 동작을 수행하는 터널 인터페이스 확인
ifconfig vxlan.calico # from mater1 vxlan.calico: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 6.2.173.65 netmask 255.255.255.255 broadcast 0.0.0.0 inet6 fe80::6431:3aff:fefa:5189 prefixlen 64 scopeid 0x20<link> ether 66:31:3a:fa:51:89 txqueuelen 0 (Ethernet)
- 패킷 캡쳐 확인
# master1 tcpdump -i ens192 udp port 4789 -w /tmp/calico-vxlan.pcap tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes # other node kubectl exec -it ping-test-fljwb -- zsh ping 6.2.137.67
마무리
- calico에서 제공하는 네트워크 통신 방법 중, IPIP 모드와 VXLAN 모드에 대해 알아보았습니다.
- 만일 다른 노드 간의 파드 통신이 이루어지지 않는다면, calico의 네트워크 통신 방법을 변경하여 재시도 해볼 수 있습니다.
- 본 문서에서 설명한 mode 외에 direct 모드와 cross subnet 모드도 있으니 참고하면 좋겠습니다.
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.