이번에는 도커 컨테이너 네트워킹과 kube-proxy에 대해 알아보자
ip addr을 통해 실제 노드의 ip와 docker0 인터페이스의 ip주소를 볼 수 있다.
docker0 인터페이스는 L2기반의 통신을 한다.
docker0는 컨테이너가 늘어날때 마다 172.17.0.2, 172.17.0.3, 172.17.0.4 ... 처럼 순차적으로 ip주소가 늘어난다.
워드프레스라는 컨테이너는 외부로 통신하기 위해서 docker0 브릿지를 게이트웨이로 사용하고
docker0가 컨테이너의 ip를 노드의 ip인 172.27.20.50로 network interface translation(NAT) 해준다.
단일 호스트(노드) 환경에서는 네트워크에 전혀 문제 될것이 없다.
노드가 여러 개인 멀티 호스트 환경에서는 어떤 노드가 문제가 생기면 다른 노드에서 서비스가 연속적으로 진행될 수 있도록 클러스터 서비스가 지원되어야 한다.
만약 블루 컨테이너와 그레이 컨테이너간에 통신하려면 그레이 컨테이너의 ip인 172.17.0.3로 접속을 시도하면 오렌지 컨테이너로 접속이 되어버리게 된다. 이는 서로 다른 노드간에 통신이 안되는 상황이다.
이를 해결하기 위해서 CNI이 사용된다.
ip netns add v-net-0 로 먼저 v-net-0 라는 네트워크 인터페이스를 생성하고
ip link add v-net-0 type bridge 로 v-net-0를 브릿지 타입으로 설정하고
ip link set dev v-net-0 up 으로 활성화 시킨다.
ip link add veth0 type veth peer name veth1
ip link set veth1 netns v-net-0
ip link set veth0 up
ip addr add 10.244.1.1/24 dev veth0 로 v-net-0의 브릿지 네트워크에서 veth1으로 피어를 가지는 네트워크를 만든다.
이렇게 되면 블루와 그린의 ip 대역대가 달라진다.
ip netns exec v-net-0 ip link set veth1up
ip netns exec v-net-0 ip addr add 10.244.1.2/24 dev veth1
으로 블루 컨테이너가 v-net-0의 NAT 서비스를 통해 eth0를 게이트웨이로 이용하여 외부로 통신할 수 있게 만든다.
ip netns exec v-net-0 ip route add 10.244.1.0/24 via 17027.20.50
iptables -t nat -A POSTROUTING -s 10.244.0.0/24 -j MASQUERADE 로 NAT를 하기위해 라우트테이블에 ip주소를 추가한다.
ip route add 10.244.1.0 via 172.27.20.50
ip route add 10.244.2.0 via 172.27.20.51 로 브릿지 네트워크가 게이트웨이를 통과할 수 있도록 한다.
이를 CNI라고 한다.
CNI의 종류는 다양하다.
kubectl get pod -A 로 모든 네임스페이스의 컨테이너 파드를 확인해보면 calico 라는 CNI가 설치된걸 볼 수 있다.
kubectl get daemonsets.apps -A 으로 보면 kube-proxy가 데몬셋 형태로 실행된다. 따라서 노드에 cni가 각각 1개씩 생성된다.
이제 kube-proxy에 대해 알아보자
여러 노드의 파드들의 단일 진입점에 접속이 오면 노드들중 하나에 연결해주는 작업을 kube-proxy가 해준다.
Deployment 파일로 컨테이너를 3개 실행시키고 Service 파일에서 cluster ip로 단일 진입점을 만들어준다.
deployment.yaml 파일의 내용은 아래와 같다.
nginx 파드를 3개 만들어준다.
kubectl apply -f deployment.yaml 로 실행시키면 노드1에 1개 노드2에 2개 실행되고 있다.
svc.yaml 파일의 내용은 아래와 같다.
클러스터 ip로 10.96.100.100으로 단일 진입점을 만든다.
kubectl apply -f svc.yaml로 실행하고 curl 10.96.100.100 으로 접속하면 nginx가 잘 실행된다.
kubectl describe svc webui-svc 로 확인해보면 3개의 엔드포인트가 있다.
노드1이나 노드2에 접속해서 iptables -t nat -S | grep 10.96.100.100 로 ip table을 확인할 수 있다.
10.96.100.100으로 접속하면 KUBE-SVC-7SIYQBMMK7OI4QAT 으로 포워딩된다.
다시 iptables -t nat -S | grep 1KUBE-SVC-7SIYQBMMK7OI4QAT 으로 확인하면 3개의 규칙이 있다.
첫 번째 규칙은 랜덤하게 1/3 확률로 KUBE-SEP-SB7SD4BDX62ESJYM 로 보내고
두 번째 규칙은 랜덤하게 2/3의 1/2인 확률. 즉, 1/3 확률로 KUBE-SEP-44XBRQIGJ6DXGGRL 로 보낸다.
세 번째 규칙은 나머지 1/3 확률로 KUBE-SEP-GOEEHC223OHGXL3D로 보낸다.
이렇게 kube-proxy가 로드밸런서 역할을 하는 것이다.
kube-proxy는 기본적으로 iptables mode로 동작한다.
'따배쿠' 카테고리의 다른 글
[따배쿠] 18-1 Kubernetes AutoScaling - 이론편 (0) | 2022.11.21 |
---|---|
[따배쿠/멤버십] 16. Kubernetes DNS (0) | 2022.11.20 |
[따배쿠/멤버십] 14-2. Persistent Volume & Persistent Volume Claim (0) | 2022.11.20 |
[따배쿠/멤버십] 14-1. Kubernetes Storage (0) | 2022.11.20 |
[따배쿠/멤버십] 13-2. 인증과 권한 관리 - 권한관리편 (0) | 2022.11.19 |