callico - NODE 통신
2022. 8. 1. 10:57ㆍkubernetes | 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 |