作って学ぶContainer Network
~ipコマンドで作るCNI Plugin~
Kubernetes Novice Tokyo #4 by satoken
# kubectl get person
このLTについて
Container Network、flannel、CNIについて
Container Network何もわからん
kubeadm initしたらとりあえずflannel入れてる
CNI Pluginの特徴や比較
皆さん説明できますか?
皆さんが説明できるようになるのが今日のゴールです!
まずdockerのnetworkからおさらいしましょう
dockerのnetwork
docker → kubernetes
同一ホスト上でのコンテナ間通信
外部向け通信
別ホスト上でのコンテナ間通信(←New!)
kubernetesのネットワークモデル
例え
flannel
flannel(1Node)
flannel(multi Node)
Container Networkを作ってみよう
せやかて駆動
Q. kubernetesはどうやってPodにIPアドレス割り当てるの?
A. kubeletが設定ファイルに従いファイルを実行する
※たぶんこのへん?
https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/dockershim/network/cni/cni.go#L354
Container Network Interface
→各Pluginで仕様がバラバラだとkubeletが困る
試してみた
動いた
構成①
構成②
自作の欠点
iptables, bridge, ip rotueなど
このへんflannelとかはDeamonSetがdeployされていい感じにやってくれる
→ CNI満たしたシェル書いただけやん?
そうです...
まとめ
※実際にはetcdとflanneldが裏で動いていて各Nodeのfdbに~時間上割愛
変数と標準入出力によるIn/Outの仕様
できるかも!?
おしまいDEATH
参考資料
https://www.youtube.com/watch?v=zmYxdtFzK6s
Kubernetes Networking: How to Write a CNI Plugin From Scratch - Eran Yanay, Twistlock
https://enakai00.hatenablog.com/entry/2015/04/02/173739
FlannelのVXLANバックエンドの仕組み
https://qiita.com/yuanying/items/ceeeb7329a4fdc566546
転職したらkubernetesだった件
https://github.com/sat0ken/mycni
作ったシェル
役に立つかもしれない? ipコマンドまとめ
・bridge作成
# ip link add br0 type bridge (brctl addbr br0 でも可)
・veth作成
# ip link add veth0_host type veth peer name veth0_container
・vethをbridgeデバイスに接続する
# ip link set dev veth0_host master br0 (brctl addif br0 veth0_hostでも可)
・vethをnamespaceにセットする
# ip link set veth0_container netns hoge
→PodのNetwork namespaceを調べるには以下Blogを参考に
https://enakai00.hatenablog.com/entry/20140424/1398321672
・vxlanデバイスをmulticastで作成する
# ip link add vxlan0 type vxlan id 42 group 239.1.1.1 dev eth0 local <hostのIPアドレス> dstport 4789
・共通
# ip link set br0 up
# ip addr add 10.244.0.1/24 dev br0