콤퓨우터/필기: KodeKloud CKA 강의

215. CNI Weave

파란화면 2024. 5. 17. 00:46
반응형

Container Runtime은 컨테이너의 추가/삭제마다 Network plugin을 불러야 한다.

Kubelet 서비스를 보면,

ExecStart=/user/local/bin/kubelet \\
...
  --network-plugin=cni \\
  --cni-bin-dir=/opt/cni/bin \\
  --cni-conf-dir=/etc/cni/net.d \\
...

처럼 되어 있다.

주의

쿠버 1.24 이전까지는 kubelet에서 cni-bin-dirnetwork-plugin 파라미터를 통해 CNI 플러그인을 관리하는 것이 가능했으나, 이는 쿠버 1.24에서 삭제되었다!

/opt/cni/bin에는 bridge, dhcp, flannel, host-local 등 CNI Network Plugin의 executables이 들어 있다.

/etc/cni/net.d에는 어떤 플러그인을 사용할지에 대한 설정값이 들어 있다. (여러 파일이 있을 경우 알파벳 순으로 선택)

conf 파일은 다음처럼 생겼다.

{
    "cniVersion": "0.2.0",
    "name": "mynet",
    "type": "bridge",
    "bridge": "cni10",
    "isGateway": true,
    "isMasq": true,
    "ipam": {
        "type": "host-local",
        "subnet": "10.22.0.0/16",
    }
}
  • isGateway: 생성되는 브리지 네트워크에 IP주소를 할당하여 게이트웨이 역할을 하게 할 것인가?
  • isMasq: NAT Masquerading을 할 것인가?
  • ipam: subnet, IP addr range, route 등을 선택
    • host-local: IP 주소가 호스트에서 로컬로 관리
      • (External DHCP server를 사용하여 remote에서 관리하는 옵션도 있음)

Weave

Weaveworks(R) Weave CNI 플러그인이 클러스터에 디플로이되면, 각 노드에 에이전트가 설치되어 다른 에이전트들과 정보를 주고받고, 전체 클러스터의 토폴로지를 파악한다.

이를 위해 weave 에이전트끼리 사용하기 위한 브리지와 노드를 생성하고 IP를 할당한다.

하나의 노드에 여러 브리지가 사용될 수 있음에 주의

다른 노드로 가는 패킷을 발견하면, Weave가 패킷을 가로채서 수신자가 다른 네트워크에 있다는 것을 확인하고, 패킷을 캡슐화하여 다른 노드로 보낸다. 그렇게 다른 노드로 보내진 패킷은 해당 노드의 Weave에이전트에 의해 캡슐해제되어 목적지 Pod로 라우팅되게 된다.

Weave의 설치

각 노드에 Service나 Daemon 형태로 수동 설치할 수도 있지만, 일단 쿠버 기본 시스템이 작동되고 있다면 다음 명령어로 간단하게 설치할 수 있다.
kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

이러면 Weave peer가 [[71. DaemonSet|DaemonSet]]으로 설치된다.

IP 주소 관리하기

콘테나에 IP를 할당하는 것은 CNI Plugin
하지만 어떻게 컨테이너의 IP들이 겹치지 않게 관리할 수 있는가?

간단한 어프로치는 IP 목록 파일을 만들어서 할당 여부를 체크하는 것
하지만 이걸 굳이 CNI 스크립트에 기능으로 만들어 넣지 않아도, host-local plugin을 이용하면 된다

  • 다만 스크립트 내에서 그러한 plugin을 부르기는 해야 한다
    • 이걸 하드코딩하지 않아도, CNI 설정파일의 ipam 부분에서 어떤 플러그인을 부를지, 어떤 서브넷과 라우트를 쓸지를 읽어올 수 있다

Weave에서

Weave는 기본값으로 전체 네트워크에 10.32.0.0/12 (10.32.0.1 ~ 10.47.255.254)를 할당한다
이 커다란 네트워크들은 노드에 짤짤이로 나눠진다

What is the range of IP addresses configured for PODs on this cluster?

# kubectl logs weave-net-f4xct -n kube-system
...
INFO: 2024/05/08 13:32:05.318172 Command line options: map[conn-limit:200 datapath:datapath db-prefix:/weavedb/weave-net docker-api: expect-npc:true http-addr:127.0.0.1:6784 ipalloc-init:consensus=0 ipalloc-range:10.244.0.0/16 metrics-addr:0.0.0.0:6782 name:52:79:16:46:d0:e0 nickname:controlplane no-dns:true no-masq-local:true port:6783]
...
INFO: 2024/05/08 13:32:07.349016 adding entry 10.244.0.0/16 to weaver-no-masq-local of 0
INFO: 2024/05/08 13:32:07.349048 added entry 10.244.0.0/16 to weaver-no-masq-local of 0

What is the IP Range configured for the services within the cluster?

ps -ef | grep ip
root        3746    3240  0 13:31 ?        00:02:36 kube-apiserver --advertise-address=192.27.58.9 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 ...

kube-proxy가 어떤 것을 사용하는가:

kubectl logs kube-proxy-r8pj7 -n kube-system
I0508 13:32:01.431839       1 server_others.go:72] "Using iptables proxy"
반응형