Slide 1

Slide 1 text

CNI Migration OTSUKA, Motohiro / Yuanying Kubernetes at home #2

Slide 2

Slide 2 text

お家クラスタのCNIを変更したい

Slide 3

Slide 3 text

クラウド環境のKubernetesは気軽 にクラスターを移行できるが、お 家だとそうはいかない。

Slide 4

Slide 4 text

🎉今年 10/10 自宅k8sクラスタ満5歳 🎉

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

愛着が湧いてしまい、 気軽に壊せない!

Slide 7

Slide 7 text

Flannel から Cilium へ移行どうする…?

Slide 8

Slide 8 text

検証した。

Slide 9

Slide 9 text

CNI 移行時の前提条件 1. 異なるIPAM方式を採用するCNI同士であること 2. 同時にVXLANを二つ以上設定しないこと この条件を満たせば、 意外と雑にイケる。

Slide 10

Slide 10 text

雑にやる場合

Slide 11

Slide 11 text

雑に`kubectl apply` 1. Pod をデプロイ (Flannel Network) 2. Cilium をデプロイ 3. Pod をロールアウト ○ 順に Cilium Network に切り替えていく 4. Flannelを削除 ○ 削除後にノードを再起動

Slide 12

Slide 12 text

どうなる?

Slide 13

Slide 13 text

雑に`kubectl apply` 1. Pod をデプロイ (Flannel Network) 2. Cilium をデプロイ 3. Pod をロールアウト ○ 順に Cilium Network に切り替えていく 4. Flannelを削除 ○ 削除後にノードを再起動

Slide 14

Slide 14 text

Node 0 testapp-0 eth0: 10.242.2.2 Bridge: cni0 10.242.2.1 veth cni0 flannel.1 iptables Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables flannel 10.242.0.0/16

Slide 15

Slide 15 text

Node 0 testapp-0 eth0: 10.242.2.2 Bridge: cni0 10.242.2.1 veth cni0 flannel.1 iptables Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables flannel 10.242.0.0/16 flannel ネットワーク外への通信は NATされる ルールが書かれている。 -s 10.242.0.0/16 -d 10.242.0.0/16 -j RETURN -s 10.242.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE ! -s 10.242.0.0/16 -d 10.242.0.0/16 -j MASQUERADE

Slide 16

Slide 16 text

雑に`kubectl apply` 1. Pod をデプロイ (Flannel Network) 2. Cilium をデプロイ 3. Pod をロールアウト ○ 順に Cilium Network に切り替えていく 4. Flannelを削除 ○ 削除後にノードを再起動

Slide 17

Slide 17 text

cilium 172.20.0.0/16 Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 eth0: 10.242.2.2 Bridge: cni0 10.242.2.1 veth cni0 flannel.1 iptables cilium_host eBPF

Slide 18

Slide 18 text

cilium 172.20.0.0/16 Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 eth0: 10.242.2.2 Bridge: cni0 10.242.2.1 veth cni0 flannel.1 iptables cilium_host eBPF cilium ネットワーク外への通信は NATされる ルールが書かれている。 ~~省略~~

Slide 19

Slide 19 text

雑に`kubectl apply` 1. Pod をデプロイ (Flannel Network) 2. Cilium をデプロイ 3. Pod をロールアウト ○ 順に Cilium Network に切り替えていく 4. Flannelを削除 ○ 削除後にノードを再起動

Slide 20

Slide 20 text

cilium 172.20.0.0/16 Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 Bridge: cni0 10.242.2.1 cni0 flannel.1 iptables cilium_host eBPF

Slide 21

Slide 21 text

cilium 172.20.0.0/16 Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 Bridge: cni0 10.242.2.1 cni0 flannel.1 iptables cilium_host eBPF eth0: 172.20.2.2

Slide 22

Slide 22 text

cilium 172.20.0.0/16 Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 Bridge: cni0 10.242.2.1 cni0 flannel.1 iptables cilium_host eBPF eth0: 172.20.2.2 もちろん、この状態で 双方向通信問題なし!

Slide 23

Slide 23 text

cilium 172.20.0.0/16 Node 1 Bridge: cni0 10.242.3.1 cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 Bridge: cni0 10.242.2.1 cni0 flannel.1 iptables cilium_host eBPF eth0: 172.20.2.2

Slide 24

Slide 24 text

cilium 172.20.0.0/16 Node 1 testapp-1 Bridge: cni0 10.242.3.1 cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 Bridge: cni0 10.242.2.1 cni0 flannel.1 iptables cilium_host eBPF eth0: 172.20.2.2 eth1: 172.20.3.3

Slide 25

Slide 25 text

雑に`kubectl apply` 1. Pod をデプロイ (Flannel Network) 2. Cilium をデプロイ 3. Pod をロールアウト ○ 順に Cilium Network に切り替えていく 4. Flannelを削除 ○ 削除後にノードを再起動

Slide 26

Slide 26 text

cilium 172.20.0.0/16 Node 1 testapp-1 iptables cilium_host eBPF Node 0 testapp-0 iptables cilium_host eBPF eth0: 172.20.2.2 eth1: 172.20.3.3

Slide 27

Slide 27 text

🤔 LGTM?

Slide 28

Slide 28 text

Kubernetes Network Model 1. Pods can communicate with all other pods on any other node without NAT 2. Agents on a node (e.g. system daemons, kubelet) can communicate with all pods on that node Note: For those platforms that support Pods running in the host network (e.g. Linux), when pods are attached to the host network of node they can still communicate with all pods on all nodes without NAT. https://kubernetes.io/docs/concepts/services-networking/

Slide 29

Slide 29 text

cilium 172.20.0.0/16 Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 Bridge: cni0 10.242.2.1 cni0 flannel.1 iptables cilium_host eBPF eth0: 172.20.2.2 flannel ネットワーク外への通信は NATされる ルールが書かれている。 cilium ネットワーク外への通信は NATされる ルールが書かれている。

Slide 30

Slide 30 text

cilium 172.20.0.0/16 Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eBPF flannel 10.242.0.0/16 Node 0 testapp-0 Bridge: cni0 10.242.2.1 cni0 flannel.1 iptables cilium_host eBPF eth0: 172.20.2.2 どうしても Flannel -> Cilium Cilium -> Flannel でNATが発生してしまう。

Slide 31

Slide 31 text

🤔 どうすれば?

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

cilium 172.20.0.0/16 Node 0 testapp-0 eth0: 10.242.2.2 Bridge: cni0 10.242.2.1 veth cni0 flannel.1 iptables cilium_host eth1: 172.20.2.2 eBPF Node 1 testapp-1 eth0: 10.242.3.3 Bridge: cni0 10.242.3.1 veth cni0 flannel.1 iptables cilium_host eth1: 172.20.3.3 eBPF flannel 10.242.0.0/16

Slide 34

Slide 34 text

1. コンテナ内のルーティングに気をつけよう 2. kube-proxy の設定にも気をつけてね!

Slide 35

Slide 35 text

雑な方法の詳細は、 Kubernetes Advent Calendar 21日目の記事で!

Slide 36

Slide 36 text

以上