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 관계를 갖는다.

What goes in one end will come out the other.

Calico and Kubernetes Series 1 to 4

kubernetes를 설치하는 방법부터 Calico 설치 그리고 sample application을 이용해서 calico를 이용한 전반적인 네트워킹을 친절하고 상세하게 설명.

  • k8s 설치 방법 : kubeadm을 이용해서 설치할 수 있다.
  • 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 명령으로 적용한다.
    • 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가 위치할 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될 수도 있음. 확인 필요