Slide 1

Slide 1 text

CiliumにおけるGeneveプロトコルを⽤いた DSRの実装と導⼊ サイボウズ株式会社 Tomoki Sugiura Tomoya Terashima 1

Slide 2

Slide 2 text

NecoとCilium 2

Slide 3

Slide 3 text

CybozuのKubernetes Cluster(Neco) ▌オンプレ環境でKubernetesクラスタを構築・運⽤ l 数百台規模のクラスタ ▌サーバーからミドルウェアまで全て管理している 3 サーバー・クラスタの⾃動管理 ミドルウェアの提供・運⽤ デプロイ 利⽤

Slide 4

Slide 4 text

Ciliumとは ▌CNIプラグイン l コンテナのネットワーク疎通 ▌豊富な機能 l NetworkPolicy l L4/L7 LB l kube-proxy置換(脱iptables) l etc… ▌eBPFをデータプレーンに活⽤ ▌CNCF Graduated Project 4

Slide 5

Slide 5 text

eBPFとは ▌カーネル空間内のランタイムでコードを実⾏ l カーネルに⾃作のプログラムを注⼊ ▌イベント駆動 l 例)パケットの受信 ▌メリット・ユースケース l 変更が⼿軽 l 柔軟な通信処理の導⼊ l 例)IPアドレスではなくIDベースの通信処理 l サイドカーレス 5

Slide 6

Slide 6 text

NecoとCilium ▌⾃社開発のCNIプラグインCoilと併⽤して使っている ▌Coil︓IPAM・Egress NAT ▌Cilium︓kube-proxy置換・NetworkPolicy・L4LB 6

Slide 7

Slide 7 text

DSRとKubernetesのネットワーク 7

Slide 8

Slide 8 text

DSRとは ▌Direct Server Return l ロードバランサ経由のリクエストを、ロードバランサを介さず返す l ⭕ ロードバランサの負荷減 l ⭕ レスポンスタイム向上 8

Slide 9

Slide 9 text

KubernetesのServiceとExternal Traffic Policy ▌Service(NodePort・LoadBalancer)経由の通信の転送ポリシー l Cluster︓任意のノードを経由してPodに転送 l Local︓直接、対象Podがいるノードに転送 9 Local Cluster

Slide 10

Slide 10 text

KubernetesのServiceとExternal Traffic Policy ▌Clusterの利点 l Cluster︓Pod単位で負荷分散(クラスタ内でも負荷分散) l Local︓Node単位で負荷分散(Podが⾒えないルータが負荷分散) 10 Local Cluster Node単位で均等 →Pod間の負荷は不均等 Pod単位で均等

Slide 11

Slide 11 text

Clusterのときのパケットの流れ(DSRがないとき) ▌1. ルータによって選択された 中間ノードに到達 ▌2. 対象Podが存在するノードに転送 ▌3. 中間ノードを経由してクライアント に戻る 11 中間ノードに戻る

Slide 12

Slide 12 text

Clusterのときのパケットの流れ(DSRがあるとき) ▌1. ルータによって選択された 中間ノードに到達 ▌2. 対象Podが存在するNodeに転送 ▌3. 直接クライアントに戻る 12 直接戻る

Slide 13

Slide 13 text

DSRの実現⽅法 ▌クライアントのIPアドレス・ポートをPodまで保持 ▌レスポンスの送信元IPアドレス・ポートが ロードバランサのものになっている l リクエストの送信先と⼀致させる 13

Slide 14

Slide 14 text

CiliumにおけるDSRの実現① IP Option 14

Slide 15

Slide 15 text

CiliumにおけるDSRの実現① IP Option ▌CiliumのデフォルトのDSRの⽅式 ▌IP OptionにロードバランサのIPアドレスとポートの情報を埋めて 中間ノードから対象Podが存在するノードに転送する 15

Slide 16

Slide 16 text

DSRの実現⽅法(再掲) ▌クライアントのIPアドレス・ポートをPodまで保持 ▌レスポンスの送信元IPアドレス・ポートが ロードバランサのものになっている l リクエストの送信先と⼀致させる 16 IP Optionを使って情報を受け渡している!!

Slide 17

Slide 17 text

CiliumにおけるDSRの実現① IP Option 17 IP Optionを使ったDSRの流れ ▌1. ルータが中間ノードを選択 ▌2. 中間ノードがIP Optionを付ける ▌3. Podが存在するノードに転送 ▌4. 送信元をロードバランサの IPアドレス・ポートに変換 ▌5. 直接クライアントに返答

Slide 18

Slide 18 text

CiliumにおけるDSRの実現① IP Option ▌IP OptionはTCP SynとUDPのパケットのみに付与される 18 最初のTCP Syn以降は Optionはつけなくて良い 宛先(Podがいる)ノード にロードバランサの情報 を保存する

Slide 19

Slide 19 text

CiliumにおけるDSRの実現① IP Option ▌ここまでのまとめ l DSRをするとき、ロードバランサのIPアドレスとポート を中間ノードからPodがいるノードに渡す必要がある l IP Optionを使って実現している l TCP SynとUDPにのみ情報をつければ良い 19

Slide 20

Slide 20 text

CiliumにおけるDSRの実現① IP Option ▌NecoはIP Optionモードで運⽤していたが… 20 トラブル発⽣!! ロードバランサ宛の通信が遅延 するようになった!!

Slide 21

Slide 21 text

Necoで発⽣した問題 ▌ロードバランサ宛の通信が遅延するようになった ▌ロードバランサ宛のTCP Synパケットの約20%がドロップされて 再送が発⽣していた ▌トラフィック量に⽐例して遅延するパケットの量も増加していた 21

Slide 22

Slide 22 text

Necoで発⽣した問題 ▌ロードバランサ宛の通信が遅延するようになった ▌中間ノードは正常にパケットを転送していたがPodがいるノードには うまく届いていなかった 22

Slide 23

Slide 23 text

Necoで発⽣した問題 23 Necoのネットワークの概略図

Slide 24

Slide 24 text

Necoで発⽣した問題 24 Necoのネットワークでの中間ノード の選択パターン 1. Podがいるラックと別ラックのノード 2. Podがいるラックと同じラックの別のノード 3. Podがいるノード

Slide 25

Slide 25 text

Necoで発⽣した問題 25 中間ノード→Podがいるノードのどこかで TCP Synがドロップされてしまっている TCP Synがドロップされるケース

Slide 26

Slide 26 text

Necoで発⽣した問題 26 問題ないケース① Podがいるノードに直接届く場合 この通信ではIP Optionは 付与されない

Slide 27

Slide 27 text

Necoで発⽣した問題 27 問題ないケース② Podがいるノードと同じラックの別の ノードが中間ノードの場合 この通信にIP Option が付与される

Slide 28

Slide 28 text

Necoで発⽣した問題の原因 ▌ルータ(Spine)でIP Option付きの パケットがドロップされていた 28

Slide 29

Slide 29 text

Necoで発⽣した問題の原因 ▌Layer2 slow path l 未知のIP Optionが付与されたパケット はソフトウェアで処理される ▌ソフトウェア処理の流量制限の閾値を超え てしまいIP Option付きのパケットがドロップ されていた 29 However, some data center routers pass packets with unknown IP op7ons to so8ware processing called “Layer 2 slow path”. Those routers drop the packets if the amount of packets with IP op7ons exceeds a given threshold, which may significantly affect network performance. Ciliumのドキュメントにも記載されている

Slide 30

Slide 30 text

対策 ▌短期的な対策 l ルータ側の閾値を上げてドロップされないようにする Ø ルータの負荷次第で再度問題になる可能性が⾼い ▌根本的な対策 l ルータのソフトウェア処理を通らない(IP Optionに依存しない) DSRモードを導⼊する 30

Slide 31

Slide 31 text

CiliumにおけるDSRの実現② IPIP 31

Slide 32

Slide 32 text

CiliumにおけるDSRの実現② IPIP ▌IPIPでカプセル化してルータからIP Optionを⾒えなくする 32 ルータはOuterヘッダだけ をみてソフトウェア処理が 必要か判断するはず

Slide 33

Slide 33 text

CiliumにおけるDSRの実現② IPIP ▌IPIPでカプセル化してルータからIP Optionを⾒えなくする 33

Slide 34

Slide 34 text

CiliumにおけるDSRの実現② IPIP ▌IPIPを使ったDSRのPull Requestは存在していたがcilium/cilium にはマージされなかった(cilium/cilium/pull/18449) 34 IPIPでは結局Innerヘッダに IP Optionを付加する必要あり ルータによってはInnerヘッダの Optionまで解釈する可能性がある cilium/cilium#21876

Slide 35

Slide 35 text

CiliumにおけるDSRの実現② IPIP ▌IPIPを使ったDSRのPull Requestは存在していたがcilium/cilium にはマージされなかった(cilium/cilium/pull/18449) ▌未知のIP Optionを使うとサーバのレイヤでも オフロード機能が使えない ▌IP Optionを使わないIPIPによる DSRが実装されなかった 35

Slide 36

Slide 36 text

DSR with IPIPモードとNeco 36 ▌Necoでは暫定的な対策としてIPIPモードを⾃前でパッチを当てて 運⽤することに l Necoの環境ではIPIPモードでIP Option問題を回避できた 元気に動いてます!!

Slide 37

Slide 37 text

CiliumにおけるDSRの実現③ Geneve 37

Slide 38

Slide 38 text

CiliumにおけるDSRの実現③ Geneve ▌IPIPモードを独⾃パッチとして運⽤しつつcilium/ciliumに Geneveプロトコルを⽤いた実装を提案して進めることに 38 cilium/cilium/issue#22955 IPIPモードはcilium/ciliumには取り込まれないの でそれに変わるモードを提案する必要があった (独⾃パッチを管理するのは⼤変…) GeneveプロトコルはすでにCilium で利⽤されている実績があった

Slide 39

Slide 39 text

CiliumにおけるDSRの実現③ Geneve ▌IPIPの代わりにGeneveプロトコルを使う ▌UDPベースのトンネリングプロトコル ▌可変⻑のOptionフィールドがある l Optionフィールドにロードバランサの IPアドレス・ポートを格納する 39

Slide 40

Slide 40 text

CiliumにおけるDSRの実現③ Geneve ▌IPIPの代わりにGeneveプロトコルを使う ▌IP Optionから完全に脱却できる l ルータから⾒るとただのUDPパケット 40

Slide 41

Slide 41 text

CiliumにおけるDSRの実現③ Geneve ▌Geneveプロトコルを⽤いた実装を提案してマージされた ▌1.14から使える!! 41 cilium/cilium/pull/23890 cilium/cilium/issue/22955

Slide 42

Slide 42 text

Neco環境におけるGeneveモードの導⼊ 42

Slide 43

Slide 43 text

Neco環境におけるGeneveモードの導⼊ ▌準備完了︕Neco環境に反映するぞ︕ 43

Slide 44

Slide 44 text

Neco環境におけるGeneveモードの導⼊ ▌準備完了︕Neco環境に反映するぞ︕ 44 トラブル発⽣!! ⼀部の通信が来なくなった!!

Slide 45

Slide 45 text

Neco環境におけるGeneveモードの導⼊ ▌準備完了︕Neco環境に反映するぞ︕ 45 Geneveパケットへの エンキャップはうまくできている

Slide 46

Slide 46 text

Neco環境におけるGeneveモードの導⼊ ▌準備完了︕Neco環境に反映するぞ︕ 46 Geneveパケットへの エンキャップはうまくできている けどNetworkPolicyを適⽤すると 許可してるクラスタ外部からの通信も 来なくなった

Slide 47

Slide 47 text

Neco環境におけるGeneveモードの導⼊ – 障害 ▌意図せず通信がNetworkPolicyによってドロップ ▌送信元Identityが失われている l CiliumはIdentityでPodやクライアントを識別(Not IPアドレス) l 例)Identityがn番のingressは許可 47 🤔 送信元IP 172.20.0.1は16777217のIdentityになるはずが、 ポリシー判定時にworld-ipv4になっている

Slide 48

Slide 48 text

Neco環境におけるGeneveモードの導⼊ – 障害 ▌コードを⾒に⾏く ▌→ IdentityがTunnel IDから参照(受信側) ▌→ Tunnel IDには固定値`WORLD_IPV4_ID`(送信側) cilium/bpf/lib/nodeport.h cilium/bpf/bpf_overlay.c Tunnel IDを代⼊ Identityに 固定値 48

Slide 49

Slide 49 text

Neco環境におけるGeneveモードの導⼊ – 障害 ▌⭕ DSR対象の通信パケットは 送信元IPでIdentity解決 l ipcacheを参照 ▌cilium/ciliumにPRを提出 l “Fix source identity determination for DSR with Geneve-dispatch” cilium/cilium #29155 49 cilium/bpf/bpf_overlay.c DSR対象か判定 ipcacheを⾒る Identityに代⼊ ipcache(BPFマップ) IPアドレスとIdentityが紐付け

Slide 50

Slide 50 text

まとめ・これから ▌CiliumにおけるDSRの実装 l 1. IP Option l Layer2 slow path l 2. IPIP l cilium/ciliumに取り込まれず l 3. Geneve l 万事解決︕ ▌NecoではGeneveモードの検証を完了 ▌順次、開発・検証・本番環境に導⼊する予定 50

Slide 51

Slide 51 text

参考資料 ▌cilium/cilium ▌cybozu-go/coil ▌External Traffic Policy ▌Cilium Document – DSR with IPv4 Option and IPv6 Extension Header ▌What is eBPF? An Introduction and Deep Dive into the eBPF Technology 51