2023년 3월 6일부터 @cloudnet study를 시작 하였다.
[24단계 실습으로 정복하는 쿠버네티스][이정훈 지음]의 책을 기본으로 학습을 한다.
운영을 하면서도 부족한 부분을 배울 수 있을 것이란 기대감과 함께 시작한 수업이나 숙제를 하지 못해서 발생하는 불상사를 경험하지 않고 5주간의 스터디를 잘 마무리 했으면 좋겠다.
2주차 스터디 내용을 정리해 본다.
2주차에는 네트워크와 스토리지 관련 내용을 스터디 하고 실습 진행하였다.
네트워크 통신의 최적화(성능, 지연)을 위해서 노드와 파드의 네트워크 대역을 동일하게 설정 함
파드간 통신 시 일반적으로 K8S
CNI는 오버레이(VXLAN, IP-IP) 통신을 하고 AWS VPC CNI
는 동일 대역으로 직접 통신을 한다
- 파드간의 통신을 위해서는 Pod에서 사용하는 IP 대역에서 노드 IP 대역으로 변경해서 전달 하고 다른 노드 IP 와 통신을 통해서 다시 Pod IP 대역으로 변경해서 통신되는게 일반적이였다.
- 파드간 통신 작업을 하면서 패킷을 감싸서 다른 데이터(IP)를 추가해서 전달 하고 수신쪽에선 전달 된 패킷에서 특정 패킷(IP)을 분석하고 다시 그 Pod에 전달해서 Pod IP를 분석해서 통신을 해야 하는 일련의 과정을 거치게 되면서 리소스 사용 및 추가적인 타임이 발생하게 되는 것이다.
- 허나 AWS VPC CNI는 IP 변경 작업이 없이 Pod IP 대역과 노드 IP대역이 동일 하기 때문에 직접 통신이 가능하게 된것이다(정말 신세계였다.. 전혀 알지 못하던 세상….)
- 리소스 낭비(?) 및 타임을 줄일 수 있는 장점이 있다.
- 물론 Pod IP관리와 노드 IP 관리를 하면서 중복 점검 등의 추가 리소스가 발생은 하지만 그것을 감안 하더라도 네트워킹 속도에는 더 많은 장점이 있는 것으로 생각 된다.
- 실습을 통해서 AWS VPC CNI 를 사용하는 클러스터 POD1 과 POD2에서 ping을 통해서 전달 되는 과정을 패킷 dump를 수행한 결과 예상대로 pod간 직접 통신 되는 것을 확인 할 수 있었다
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: netshoot-pod
spec:
replicas: 2
selector:
matchLabels:
app: netshoot-pod
template:
metadata:
labels:
app: netshoot-pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
$ k get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
netshoot-pod-5759484c55-2ql7w 1/1 Running 0 44s 10.36.0.4 dnc-workstation-01 <none> <none>
netshoot-pod-5759484c55-595x9 1/1 Running 0 44s 10.44.0.23 dnc-workstation-02 <none> <none>
$ k get nodes -owide
NAME INTERNAL-IP
dnc-workstation-01 192.168.253.11
dnc-workstation-02 192.168.253.12
# hanjoo.moon @ Moonui-MacBookPro in ~ [22:27:09]
$ PODIP1=10.36.0.4
$ PODIP2=10.44.0.23
$ PODNAME1=netshoot-pod-5759484c55-2ql7w
$ PODNAME2=netshoot-pod-5759484c55-595x9
$ kubectl exec -it $PODNAME1 -- zsh
/root/.zshrc:source:76: no such file or directory: /root/.oh-my-zsh/oh-my-zsh.sh
dP dP dP
88 88 88
88d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P
88' `88 88ooood8 88 Y8ooooo. 88' `88 88' `88 88' `88 88
88 88 88. ... 88 88 88 88 88. .88 88. .88 88
dP dP `88888P' dP `88888P' dP dP `88888P' `88888P' dP
Welcome to Netshoot! (github.com/nicolaka/netshoot)
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
13:39:29.885366 eth0 In IP 10.36.0.4 > 10.44.0.23: ICMP echo request, id 42703, seq 1, length 64
13:39:29.885384 eth0 Out IP 10.44.0.23 > 10.36.0.4: ICMP echo reply, id 42703, seq 1, length 64
13:39:30.892160 eth0 In IP 10.36.0.4 > 10.44.0.23: ICMP echo request, id 42703, seq 2, length 64
13:39:30.892176 eth0 Out IP 10.44.0.23 > 10.36.0.4: ICMP echo reply, id 42703, seq 2, length 64
$ cat /etc/cni/net.d/10-weave.conflist
{
"cniVersion": "0.3.0",
"name": "weave",
"plugins": [
{
"name": "weave",
"type": "weave-net",
"hairpinMode": true
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"snat": true
}
]
}
K8S Pod Networking과 Weave CNI 정리
```jsx
netshoot-pod-7757d5dd99-dprrv# tcpdump -i any -nn icmp
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
15:15:10.721815 eth0 Out IP 172.30.92.211 > 172.30.60.115: ICMP echo request, id 17307, seq 1, length 64
15:15:10.722754 eth0 In IP 172.30.60.115 > 172.30.92.211: ICMP echo reply, id 17307, seq 1, length 64
15:15:11.722256 eth0 Out IP 172.30.92.211 > 172.30.60.115: ICMP echo request, id 17307, seq 2, length 64
15:15:11.723143 eth0 In IP 172.30.60.115 > 172.30.92.211: ICMP echo reply, id 17307, seq 2, length 64
15:15:20.885695 eth0 In IP 172.30.60.115 > 172.30.92.211: ICMP echo request, id 3013, seq 1, length 64
15:15:20.885709 eth0 Out IP 172.30.92.211 > 172.30.60.115: ICMP echo reply, id 3013, seq 1, length 64
15:15:21.897525 eth0 In IP 172.30.60.115 > 172.30.92.211: ICMP echo request, id 3013, seq 2, length 64
15:15:21.897541 eth0 Out IP 172.30.92.211 > 172.30.60.115: ICMP echo reply, id 3013, seq 2, length 64
```
- Calico나 weave-net과 같은 오버레이 통신이 아닌 VPC native 방식의 파드간 통신이 된 것을 확인 할 수 있다.
- 더 빠른 네트워크 속도와 별도의 리소스 사용(CPU를 통 캡슐/복호화 하는 액션)없이 통신 할 수 있는 건 엄청 간단하고 대단한 장점 인듯 하다.