1 of 22

作って学ぶContainer Network

~ipコマンドで作るCNI Plugin~

Kubernetes Novice Tokyo #4 by satoken

2 of 22

# kubectl get person

spec:

person:

name: satoken

job: k8sトレを提供している某社(受講者募集中)

 twitter:

image: ↓

3 of 22

このLTについて

  • 話すこと

Container Network、flannel、CNIについて

  • 対象

Container Network何もわからん

kubeadm initしたらとりあえずflannel入れてる

  • 話さないこと

  CNI Pluginの特徴や比較

4 of 22

皆さん説明できますか?

  • 同じNodeでのPod間通信
  • 別のNodeでのPod間通信
  • 外部向け通信

皆さんが説明できるようになるのが今日のゴールです!

まずdockerのnetworkからおさらいしましょう

5 of 22

dockerのnetwork

6 of 22

docker → kubernetes

  • docker

同一ホスト上でのコンテナ間通信

外部向け通信

  • kubernetes

別ホスト上でのコンテナ間通信(←New!)

7 of 22

kubernetesのネットワークモデル

8 of 22

例え

  • 同じ会社だけと違うビルの人同士が市外局番で電話をしない=NATしない
  • 内線で呼び出す

9 of 22

flannel

  • coreosが作成
  • vxlan、host-gw、udpなどを選択してNetworkを構築
  • https://github.com/coreos/flannel

10 of 22

flannel(1Node)

11 of 22

flannel(multi Node)

  • vxlanを使用してkubernetesのネットワークモデルを実装
  • vxlan is 何?は参考資料を

12 of 22

Container Networkを作ってみよう

  • ここまで登場した人物、だいたいipコマンドで作れる

13 of 22

せやかて駆動

Q. kubernetesはどうやってPodにIPアドレス割り当てるの?

A. kubeletが設定ファイルに従いファイルを実行する

※たぶんこのへん?

https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/dockershim/network/cni/cni.go#L354

14 of 22

Container Network Interface

  • コンテナにIPアドレスを設定するためのIn/Outの仕様

→各Pluginで仕様がバラバラだとkubeletが困る

  • CNI自体は環境変数と標準入出力

15 of 22

試してみた

  • CNI満たす実行ファイル作れば動くんじゃない?
  • シェルでよくね?

16 of 22

動いた

  • きたこれ

17 of 22

構成①

  • スタティックルートを使用

18 of 22

構成②

  • vxlanを使用
  • PodのIPは/16

19 of 22

自作の欠点

  • 事前に各Node上で設定が必要

iptables, bridge, ip rotueなど

  • 後でNode追加するとまた追加で設定が必要

このへんflannelとかはDeamonSetがdeployされていい感じにやってくれる

→ CNI満たしたシェル書いただけやん?

そうです...

20 of 22

まとめ

  • dockerのNetworkはbridgeとveth、iptables
  • 上記セットにvxlanを追加してk8sのネットワークモデルを実装しているのがflannel

※実際にはetcdとflanneldが裏で動いていて各Nodeのfdbに~時間上割愛

  • CNIはコンテナにIPアドレスをセットするための環境

変数と標準入出力によるIn/Outの仕様

  • CNIを満たす実行ファイルを作ればCNI Pluginを自作

できるかも!?

おしまいDEATH

21 of 22

参考資料

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

作ったシェル

22 of 22

役に立つかもしれない? 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