Calico CNI (draft)
Page content
Getting started with Calico on Kubernetes
Calico를 사용하는 경우 kubelet의 실행 옵션 중
--network-plugin=cni
와 같이 변경된다.kube-controller-manager의 실행 옵션 중
--allocate-node-cidrs=false
로 역시 변경된다. 이는 CNI(여기서는 Calico의 IPAM)에서 IP 주소를 할당하기 때문Pod 내 route table에서는 host의 link local address를 default route로 사용한다.
Pod가 갖는 eth0 interface는 root(혹은 default) namespace에 존재하는 ‘cali’로 시작하는 interface와 veh pair 관계를 갖는다.
- veth pairs는 아래 설명과 같이 서로 연결된 두 개의 interface를 의미하는데 한쪽으로 들어가면 연결된 다른 인터페이스로 나온다. 즉 pod의 eth0 interface를 통해 패킷을 전송하면 host의 cali interface로 나와 커널의 라우팅 혹은 iptable 처리를 받는다.
- https://www.fir3net.com/Networking/Terms-and-Concepts/virtual-networking-devices-tun-tap-and-veth-pairs-explained.html
What goes in one end will come out the other.
Calico and Kubernetes Series 1 to 4
kubernetes를 설치하는 방법부터 Calico 설치 그리고 sample application을 이용해서 calico를 이용한 전반적인 네트워킹을 친절하고 상세하게 설명.
- k8s 설치 방법 : kubeadm을 이용해서 설치할 수 있다.
- https://kubenetes.io/docs/setup/independent/install-kubeadm
sudo systemctl start docker ; sudo systemctl enable docker
- Virtualbox 등을 사용해서 설치하는 경우 최소 core 2개 이상은 할당해야 함. 그렇지 않으면 kubeadm 실행할 때 core 부족을 이유로 에러 발생. 추가로 swap 도 꺼야 함
sudo swapoff -a
- Ubuntu 에 kubenetes 설치하는 것은 (https://www.linuxtechi.com/install-configure-kubernetes-ubuntu-18-04-ubuntu-18-10/ 참고.
- master node를 worker node로 사용하려면 ‘kubectl taint’ 명령을 사용하면 된다
kubectl taint nodes --all node-role,kubernetes.io/master-
- 일반 사용자도 kubectl 을 사용하게 하려면
/etc/kubenetes/admin.conf' 사용자 계정 아래
$HOME/.kube/config` 파일로 복사하고 권한을 사용자로 주면 된다.sudo cp -i /etc/kubenetes/admin.conf $HOME/.kube/config ; sudo chown $(id -u):$(id -g) $HOME/.kube/config
- Calico 관련 설정 내용을 확인하려면
kube-system
namespace에서 동작하고 있는calicoctl
pod의calicoctl
을 사용한다.kubectl exec -ti -n kube-system calicoctl -- /calicoctl get profiles -o wide
kubectl exec -ti -n kube-system calicoctl -- /calicoctl get -o yaml ippool
nat-outging: true
container에서 외부로 향하는 패킷 중 목적지가 calico CIDR에 속하지 않는 경우 NAT를 수행한다는 의미. 자세한 내용은iptables -L -t nat -n
명령에서 확인할 수 있음
- ippool을 추가하려면
kind: ipPool
을 갖는 yaml 파일을 만들어 calico 명령으로 적용한다.- calicoctl pod에서 실행해야 하는데 yaml 파일을 해당 pod 내에서 만들어서 적용해야 하므로 calicoctl pod에 ssh로 접속한 후 YAML 파일 만들어
calicoctl create -f XXX.yaml
명령으로 적용한다.
- calicoctl pod에서 실행해야 하는데 yaml 파일을 해당 pod 내에서 만들어서 적용해야 하므로 calicoctl pod에 ssh로 접속한 후 YAML 파일 만들어
- 2개 이상의 ippool을 만든 경우 특정 pod가 특정 subnet에서 ip를 할당받도록 하려면 annotation 을 이용해서 pod 생성시 calico subnet을 지정한다.
annotations: "cni.projectcalico.org/ipv4pools": "[\"10.91.1.0/24\"]"
- 다목적 시험용 sshd pod는 이걸 사용
kubectl run sushi-1 --image=rastasheep/ubuntu-sshd:16.04
- 단 2017년 글이라 그런지
kubectl run
대신kubectl create
를 사용하라고 경고가 나온다 - 추가로 패키지를 몇 개 설치할 섯.
apt-get update ; apt-get install iproute2 inetutils-ping traceroute
- container내 eth0 interface의 IP는 /32로 host의
cali
로 시작하는 veth pair 관계를 갖는다.- pod내에서
ip -d link
명령의 결과에 나오는 interface 이름 정보를 통해 Veth pair 인터페이스가 어떤 것인지 확인할 수 있다. 예를 들어 pod 내에서 확인한 정보가eth0@if5
면 이 pod의 eth0는 host에서 5번째 interface라는 것을 알 수 있다.
- pod내에서
- 특정 pod가 위치할 node를 지정하기 위해 node에 label을 지정하려면
kubectl label nodes NODE-NAME node_id=NODE-LABEL
- Calico의 bop 기능을 사용하려면 “kind: bgpPeer"인 YAML 파일을 만들어 적용한다. (calicoctl pod 내에서 작업)
calicoctl create -f bgp.yaml
calicoctl get -o yaml bgppeer
calicoctl node status
- 여러 노드들이 동일한 bgp 정보를 adversize하여 특정 pod의 subnet이 여러 node에서 수신하도록 외부에 adversize될 수도 있음. 확인 필요