callico - NODE 통신

2022. 8. 1. 10:57kubernetes | docker

calico network requirements

calicoctl 설치

curl -o calicoctl -O -L  "https://github.com/projectcalico/calicoctl/releases/download/v3.19.1/calicoctl"
chmod +x calicoctl
mv calicoctl /usr/bin

 

calico 기본설덜 확인

# 모드 정보 확인
calicoctl get ippool -o wide

NAME                  CIDR            NAT    IPIPMODE   VXLANMODE   DISABLED   SELECTOR
default-ipv4-ippool   172.16.0.0/16   true   Always     Never       false      all()

# 노드(BGP) Peer 정보 확인
calicoctl node status

Calico process is running.

IPv4 BGP status
+-----------------+-------------------+-------+----------+-------------+
|  PEER ADDRESS   |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+-----------------+-------------------+-------+----------+-------------+
| 192.168.100.101 | node-to-node mesh | up    | 04:01:40 | Established |
| 192.168.100.102 | node-to-node mesh | up    | 04:01:46 | Established |
| 192.168.100.103 | node-to-node mesh | up    | 04:02:03 | Established |
+-----------------+-------------------+-------+----------+-------------+

# BGP 로 전달 받은 파드 네트워크 대역이 호스트 라우팅 테이블에 적용되었는지 확인 
route -n | egrep '(Destination|tunl0)'

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.46.0     192.168.100.102 255.255.255.192 UG    0      0        0 tunl0
172.16.197.0    192.168.100.103 255.255.255.192 UG    0      0        0 tunl0
172.16.228.64   192.168.100.101 255.255.255.192 UG    0      0        0 tunl0

# IPIP 인캡슐레이션 동작을 수행하는 터널 인터페이스 확인
ifconfig tunl0

tunl0: flags=193<UP,RUNNING,NOARP>  mtu 1480
        inet 172.16.29.0  netmask 255.255.255.255
        tunnel   txqueuelen 1000  (IPIP Tunnel)

 

IPIP 모드

  • 다른 노드 간의 파드 통신은 tunl0 인터페이스를 통해 IP 헤더에 감싸져서 상대측 노드로 도달 후 tunl0 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신
  • 다른 노드의 파드 대역은 BGP로 전달 받아 호스트 라우팅 테이블에 업데이트됨

동작확인용 Pod YAML

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: pod1
    image: nicolaka/netshoot
    command: ["tail"]
    args: ["-f", "/dev/null"]
  nodeSelector: {"kubernetes.io/hostname": "k8s-worker"}

 

Pod 생성 및 패킷 캡쳐하기

# master, worker에 각각 파드 생성
kubectl apply -f pod.yaml

# 파드 IP 정보 확인
kubectl get pod -o wide

# master 파드 shell 접속(zsh)
kubectl exec -it pod -- zsh
## 파드 Shell 에서 아래 입력
ping <worker의 pod IP>

# master 파드가 동작하는 노드의 eth0(예시)에서 IPIP 패킷(proto 4) 덤프
tcpdump -i <eth0> -nn proto 4

# 혹은 아래 처럼 파일로 저장 후 해당 파일을 다운받아서 확인(wireshark 등 사용)
tcpdump -i <eth0> proto 4 -w /tmp/calico-ipip.pcap

 

VxLAN 모드

  • 다른 노드 간의 파드 통신은 vxlan 인터페이스를 통해 L2 프레임이 UDP - VXLAN에 감싸져서 상대측 노드로 도달 후 vxlan 인터페이스에서 Outer 헤더를 제거하고 내부의 파드와 통신
  • BGP 미사용, VXLAN L3 라우팅을 통해서 동작

 

VxLAN 모드 설정

# IPIP 모드에서 변경할 경우 kubeadm으로 reset후 다시 설정해야함
sudo kubeadm reset
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/cni
sudo rm -rf /var/lib/calico
sudo rm -rf /etc/cni/*

sudo systemctl stop docker
sudo iptables -F

# 재부팅후 ifconfig으로 calico interface가 제거된 것을 확인

# k8s cluster 다시 설정한 후(init) calico yaml 적용
kubectl apply -f calico-v3.19-vxlan-spsd.yaml

# 모드 설정 변경
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/ipipMode: Always/ipipMode: Never/" | calicoctl apply -f -
calicoctl get ippool default-ipv4-ippool -o yaml | sed -e "s/vxlanMode: Never/vxlanMode: Always/" | calicoctl apply -f -

# 변경 설정 적용을 위해서 calico 파드 삭제 후 재생성
kubectl delethdevkim@agilesoda.come pod -n kube-system -l k8s-app=calico-node

 

VxLAN 모드 확인

# 모드 정보 확인
calicoctl get ippool -o wide

NAME                  CIDR            NAT    IPIPMODE   VXLANMODE   DISABLED   SELECTOR
default-ipv4-ippool   172.16.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.

# 파드 네트워크 대역이 호스트 라우팅 테이블에 적용되었는지 확인 >> BGP 미사용으로 다른 방식으로 파드 대역 전달 받음
route -n | egrep '(Destination|vxlan)'

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.46.0     172.16.46.2     255.255.255.192 UG    0      0        0 vxlan.calico
172.16.197.0    172.16.197.2    255.255.255.192 UG    0      0        0 vxlan.calico
172.16.228.64   172.16.228.66   255.255.255.192 UG    0      0        0 vxlan.calico

# VXLAN 인캡슐레이션 동작을 수행하는 인터페이스 확인 (참고로 tunl0 의 IP는 삭제됨)
ifconfig vxlan.calico

vxlan.calico: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 172.16.29.6  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::6404:3ff:fe49:b11e  prefixlen 64  scopeid 0x20<link>
        ether 66:04:03:49:b1:1e  txqueuelen 0  (Ethernet)
...

# VXLAN Peer 정보 확인
bridge fdb show | grep vxlan

66:74:91:32:7c:04 dev vxlan.calico dst 192.168.100.101 self permanent
66:55:c4:6b:81:ed dev vxlan.calico dst 192.168.100.102 self permanent
66:c2:2a:b3:d4:5a dev vxlan.calico dst 192.168.100.103 self permanent

ip neighbor show | grep vxlan

172.16.46.2 dev vxlan.calico lladdr 66:55:c4:6b:81:ed PERMANENT
172.16.197.2 dev vxlan.calico lladdr 66:c2:2a:b3:d4:5a PERMANENT
172.16.228.66 dev vxlan.calico lladdr 66:74:91:32:7c:04 PERMANENT

VxLAN 동작 확인

# 파드 Shell 접속(zsh)
kubectl exec -it pod1 -- zsh
## 파드 Shell 에서 아래 입력
ping <pod2 혹은 pod3 IP>

# 파드가 동작하는 노드의 eth0(예시)에서 패킷 덤프
tcpdump -i <eth0> -nn udp port 4789
혹은 아래 처럼 파일로 저장 후 해당 파일을 다운받아서 확인(wireshark 등 사용)
tcpdump -i <eth0> udp port 4789 -w /tmp/calico-vxlan.pcap

'kubernetes | docker' 카테고리의 다른 글

docker와 CRI-O 같이 운영 방법  (0) 2022.08.01
K8S Cluster IP Change Procedure  (0) 2022.08.01
UTS namespace  (0) 2022.08.01
linux hostname  (0) 2022.08.01
kubernetes dir analysis  (0) 2022.08.01