203. Prerequisite - Docker Networking
도커를 사용하면 여러가지 네트워킹 옵션이 존재한다.
None
도커를 none 네트워크 옵션으로 실행하면 그 어떤 네트워크랑 연결되지 않는다.
외부로 접근 불가
멀티 컨테이너로 만들어도 서로 통신 못한다.
host
호스트 네트워킹을 하면 컨테이너가 호스트의 네트워크에 연결되어 사용가능하다.
80번포트를 사용하는 앱을 배포하면 이용 가능할 것이다. 특별한 포트 포워딩 없이 사용가능
똑같이 컨테이너를 생성해도 같은 호스트 ,포트 네트워크를 동시에 공유할 수 없다.
Bridge
bridge 모드로 생성하는 경우 사설네트워크가 생성된다.
172.17.0.0 을 기본으로 갖고 컨테이너가 추가될때 마다 ip를 부여받는다.
도커가 설체되면 bridge라는 사설 네트워크를 설치한다.
docker 에서 볼 때는 bridge 이지만 호스트에서는 docker0라는 이름으로 생성된다.
호스트가 ip link add docker0 type bridge 한 것처럼 docker가 사설 네트워크를 만든다.
브릿지 네트워크는 인터페이스와 같으면서도 컨테이너,네임스페이스 안에서는 스위치 역할을 한다.
docker 0 는 down 상태이며 172.17.0.1/24 ip 를 갖는다.
docker run nginx 로 컨테이너를 실행 후
ip netns 검색
docker inspect로 확인하면 netns 가 생긴 것을 알 수 있다.
컨테이너와 브릿지 네트워크 docker0를 어떻게 연결 시킬까?
docker0 인터페이스 vethbblc343@if7
vethbb~의 위치는 당연히 docker0에 있다
컨테이너 netns 에서 link 명령을 하면 인터페이스를 확인할 수 있다.
컨테이너의 네트워크 인터페이스는 eth0@if8 이다.
컨테이너의 addr 을 확인해보면 ip 를 배정 받았다고 뜬다.
172.17.0.3/16
컨테이너가 추가될때마다 가상 인터페이스도 추가된다.
도커 내부에서 컨테이너에 접속하면 가능하지만 외부에서는 접속불가능하다.
그래서 도커 컨테이너를 실행할때 포트포워딩 옵션을 넣어줘야한다.
8080으로 들어오면 80 포트로 이동
192.168.1.0:8080 으로 접속 가능해진다.
도컨도 iptables 명령과 같은 효과
똑같이 iptables 가 생성된 것을 확인할 수 있다.
204. Prerequisite - CNI
이전에 배운 것
도커도 사실 비슷한 원리다.
rkt, mesos, k8s 다 비슷한 방식을 따른다.
어차피 중복되는 내용인데 통합시키면 어떨까?
bridge 로 묶었다.
bridge 명령어로 netns 에 있는 컨테이너를 연결시킬 수 있다.
bridge add <cid> <namespace>
이다.
cni 로 쉽게 구성할 수 있다.
cni 규칙들
플러그인 (프로그램들) 의 규칙
cni 규칙과 플러그인 규칙을 지켜야한다.
cni는 여러 플러그인을 지원한다.
도커는 cni를 갖지 않고 독립적으로 cnm 을 갖는다.
도커도 네트워크를 생성하고 브릿지로 연겨하면 된다.
205. Cluster networking
IP & FQDN
마스터 노드와 워커 노드 각각의 ip, 인터페이스,호스트네임, 맥어드레스를 갖는다.
마스터노드의 kube-api 와 통신한다.
kubelet은 10250 포트를 듣는다.
컴포넌트들의 포트번호
마스터 노드끼리 소통시에도 사용
Ports and Protocols | Kubernetes
포트 번호가 있다.
기본적인 네트워크 명령들
207. Practice Test - Explore Kubernetes Environment
1. How many nodes are part of this cluster?
Including the controlplane and worker nodes.
2개
2. What is the Internal IP address of the controlplane node in this cluster?
192.6.192.12
3. What is the network interface configured for cluster connectivity on the controlplane node?
node-to-node communication
ip a 명령어
eth0 이다.
4. What is the MAC address of the interface on the controlplane node?
02:42:c0:06:c0:0c
5. What is the IP address assigned to node01?
192.6.192.3
6. What is the MAC address assigned to node01?
ip a 로 하면 확인 불가능하다.
워커 노드는 마스터 노드와 같은 인터페이스를 사용한다.
eth0 를 통해서 mac addr 를 찾자.
7. We use Containerd as our container runtime. What is the interface/bridge created by Containerd on this host?
cni0
8. What is the state of the interface cni0?
up
9. If you were to ping google from the controlplane node, which route does it take?
default 가 172.25.0.1 게이트웨이를 사용
10. What is the port the kube-scheduler is listening on in the controlplane node?
10259 를 쓴다.
netstat -nplt
11. Notice that ETCD is listening on two ports. Which of these have more client connections established?
2379
12. Correct! That's because 2379 is the port of ETCD to which all control plane components connect to. 2380 is only for etcd peer-to-peer connectivity. When you have multiple controlplane nodes. In this case we don't.
209. Pod networking
쿠버네티스 파드들은 어떻게 통신할까?
Networking Model
모든 파드들은 ip를 가지고 파드들은 다른 파드와 통신가능하다.
nat 없이
지난 시간에 했던거 복습해보자
마스터, 워커 상관없이 노드들이 연결되어있다.
노드들에 각자 netns 가 있다.
브릿지 네트워크를 생성한다.
ip link add v-net-0 type bridge
브릿지 네트워크 켜기
ip link set dev v-net-0 up
브릿지 네트워크에 ip 부여하기
ip addr add 10.244.1.1/24 dev v-net-0
net-script.sh 파일을 만들어서 스크립트화 할 수 있다.
컨테이너 (netns 안의) 와 브릿지 네트워크 연결되었다.
파란 파드에서 보라색 파드에 접속하고 싶다면?
ping 은 안간다.
라우터 추가해야 하나?
먼저 노드 단에서 라우터를 추가한다.
ip route add 10.244.2.2 via 192.168.1.12
이제 ping 응답이 가능해진다.
노드단에서 브릿지 네트워크 ip 의 라우터를 다 추가한다.
모든 노드에서 라우터를 일일히 추가하는 것보다 라우터에서 정의하는것이 좋다.
하나의 가상 네트워크 10.244.0.0/16
cni가 쉽게 해준다.
노드에 컨테이너가 생기면 kubelet이 확인하고 명령을 실행한다.
210. CNI in kubernetes
선수 지식
cni 규칙
Configuring CNI
CNI 구성하기
View kubelet options
kubelet에서 cni 옵션을 볼 수 있다.
opt/cni/bin 폴더에서 여러 플러그인을 확인 가능
/etc/cni/net.d 에서 어느 플러그인이 사용될지 보여준다.
플러그인 구성파일이다.
211. CNI weave
weaveworks는 cni 플러그인 중 하나이다.
다른 컨테이너로 패킷 보내기
라우팅 테이블을 사용하는데 더 좋은 방법이 없을까?
사무실이라고 가정하고
office 1에서 office 3 로 보낼때
알아서 잘 가겠지?
노드가 많아진다면?
운송회사에 위임하자
weaverworks 직원을 각 나라에 상주 시킨다.
각각의 직원들 통신망을 갖고 있다.
컨테이너에서 패킷을 보내려고하면
에이전트가 패킷을 가로채고
패킹하고
weaverworks 가 대신 보내준다.
마찬가지로 weaveworks가 서비스, 에이전트를 노드에 심는다.
에이전트끼리 각자 네트워크를 형성한다.
컨테이너에서 패킷을 보낼려고 하면 에이전트가 가로채서 보낸다.
Deploy Weave
kubectl apply 를 통해서 weave 데몬을 생성할 수 있다.
log 를 통해 트러블 슈팅
212. Practice Test - Explore CNI
1. Inspect the kubelet service and identify the container runtime endpoint value is set for Kubernetes.
ps aux | grep kubelets
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock
2. What is the path configured with all binaries of CNI supported plugins?
ls /opt/cni/bin
이 경로에 모든 플러그인이 있다.
3. Identify which of the below plugins is not available in the list of available CNI plugins on this host?
cisco
4. What is the CNI plugin configured to be used on this kubernetes cluster?
/etc/cni/net.d
현재 사용중인 플러그인이 뜬다.
5. What binary executable file will be run by kubelet after a container and its associated namespace are created?
flannel 이 실행된다.
214. Practice Test - Deploy Network Solution
1. In this practice test we will install weave-net POD networking solution to the cluster. Let us first inspect the setup.
We have deployed an application called app in the default namespace. What is the state of the pod?
not running
2. Inspect why the POD is not running.
ip 할당 문제
3. Deploy weave-net networking solution to the cluster.
NOTE: - We already have provided a weave manifest file under the /root/weave directory.
원래는 weavenet github에서 가져와야한다.