참고
CNI(Container Networking Interface)
NOTE
CNI는 CNCF프로젝트 중 하나인 CNI(Container Network Interface)는 컨테이너 간 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준이다!
여러 플러그인이 준비되어 있고, 써드파티의 플러그인도 사용가능!
1.
네트워크 네임스페이스 생성
2.
브리지 네트워크 인터페이스 생성
3.
vEth 쌍 생성 (파이프, 가상 케이블)
4.
vEth를 이용해서 네임스페이스 - 브리지 연결
5.
IP 주소를 등록하고 인터페이스 활성화
•
할당된 IP 주소를 가진 인터페이스들을 활성화하여 네트워크 통신이 가능하도록 합니다.
6.
NAT 활성화(아이피 마스커레이드)
•
네임스페이스 내부에서 사용하는 사설 IP 주소가 외부 네트워크와 통신할 때 사용하는 공인 IP 주소로 변환될 수 있도록 NAT(Network Address Translation)을 설정
•
위와 같은 절차로 컨테이너들은 연결되며, 도커 뿐만 아니라 rkt, Mesos등의 다른 솔루션도 사용하는 방식이다.
•
모두가 사용하는 방식인 만큼, 일종의 표준을 만들어 사용하는 것이 편리하므로, 이과정을 하나의 프로그램으로 만든다!
쿠버네티스와 CNI
NOTE
/etc/cni/net.d # 설치된 CNI 확인
/opt/cni/bin # 디렉토리에서 지원하는 플러그인 확인
Bash
복사
CNI가 지원하는 명령어
어떤 CNI인지 등록
쿠버네티스 네트워킹
NOTE
쿠버네티스에서 파드들 끼리 직접적으로 연결되도록 설정하는 일은 거의하지 않는다. ⇒ 대부분 서비스를 사용!
각 컴포넌트의 포트
Kubelet(파드), Kube-proxy(서비스)
NOTE
쿠버네티스의 모든 노드에는 kubelet, kube-proxy이 하나씩 존재한다!
kubelet : kube-apiserver와 통신하며 파드를 노드에 생성한다!
kube-proxy : 쿠버네티스에서 서비스를 만들었을 때 Cluster IP와 Nodeport로 접근할 수 있게 하는 실제 조작을 수행한다.
# 클러스터 내 노드 IP범위
kubectl get nodes -o wide # 내부 IP검색
ip add # 내부 IP를 가신 nic검색
# pod의 IP범위
kubectl get all -A # weave사용 확인
kubectl logs [weave pod] # ipalloc 찾기
# 서비스의 ip범위찾기
cat /etc/kubernetes/manifests/kube-apiserver.yaml
# ip 범위 확인하기
kube-api-server --service-cluster-ip-range ipNet
ps aux | grep kube-api-server
Bash
복사
•
서비스는 단순히 가장 객체인데 어떻게 접근이 가능한가?
◦
각 노드의 kube-proxy는 IP:Port 정보가 들어오면, 사전에 정의되어 있는 서비스의 IP:Port 범위에 따라 클러스터 내 특정 노드로 전달한다.
◦
IP:port 트래픽을 특정 노드의 파드로 전달하기 위해서는 iptables, userspace, IPVS가 있다.
•
Service를 생성했을 때 할당되는 Ip주소는 kube-api-server의 --service-cluster-ip-range 값에 따라 결정된다.
◦
디폴트 범위는 10.96.0.0 ~ 10.111.255.255
◦
cf. pod의 범위는 10.244.0.0 ~ 10.244.255.255
◦
범위가 어떻게 설정되건, 절대 겹치지 않는다는 게 핵심.