Slide 1

Slide 1 text

RyuSA Serviceをたずねて3000⾏ - Kubernetesコードリーディングの旅 -

Slide 2

Slide 2 text

Who Am I

Slide 3

Slide 3 text

AGENDA • Serviceリソースがネットワークに反映されるまで • EndpointSlice Controller / kube-proxy • (下記⾚枠部分) 出典 : https://kubernetes.io/ja/docs/concepts/overview/components/

Slide 4

Slide 4 text

なぜService︖😕

Slide 5

Slide 5 text

なぜServiceを読もうとしたのか

Slide 6

Slide 6 text

Curl to Service curl 10.100.233.191 (=svc) Reply from 10.1.0.100 (=pod) Abracadabra……

Slide 7

Slide 7 text

Curl to Service curl 10.100.233.191 (=svc) Reply from 10.1.0.100 (=pod) Abracadabra……

Slide 8

Slide 8 text

NOTATION • 環境 • Kubernetes v1.20をベースに動作確認、コードリーディングをしています • IPv6を利⽤したデュアルスタック環境については触れません • つまりデフォルト • kube-proxyのproxy-modeはiptablesです • つまりデフォ(ry • featureGateのEndpointSliceとEndpointSliceProxyingは有効です • つまりデ(ry • 話さない内容 • LoadBalancer TypeのServiceについて • Golangガチ初⼼者が読んでます • 読み間違い、勘違い等あるかもしれません……

Slide 9

Slide 9 text

Serviceの反映にはControllerが関わってます • KubernetesにおけるControllerとは • Controllerは1種類以上のKubernetesリソースを監視し、特定のミッションを達成するためのコンポーネント • 監視しているリソースのspecに合わせて「現在の状態」を「⽬的の状態」に変更・制御していくことが⼀般的なコント ローラのミッションです • その多くはapiserverへフィードバック/副作⽤を送ります • Serviceリソースのルーティングに関連するController • EndpointSlice Controller • EndpointSliceリソースを監視しているControllerです • kube-proxyが監視しているEndpointSliceリソースに対し副作⽤を及ぼします • kube-proxy • Serviceリソースを監視しているコンポーネント(兼Controller)です

Slide 10

Slide 10 text

EndpointSlice Controller の話

Slide 11

Slide 11 text

PodとServiceを紐つけておく • EndpointSlice とは • ServiceリソースのセレクタとPodへの紐付けを管理するリソースです • ⼀緒にPodのTopology(=“kubernetes.io/hostname” など)も保存されてます • kube-proxyに監視されてます • EndpointSlice Controllerの役割 • 主にPodをServiceを監視し、EndpointSliceを常に最新の状態に変更します • EndpointSlice⾃体も監視しています

Slide 12

Slide 12 text

EndpointSlice Controller 全体像 EPSlice informer Main loop Queue Cache; selector and Service Sync Service with svc name And update the cache Svc Pod API Resources

Slide 13

Slide 13 text

EndpointSlice Controller メインループ Heap Queue Selector Cache Wait 1 sec… pop the data Nothing… Creating EndpointSlice… Find pods by selector Svc informer Find svc by svc name EP Slice API Resources Update EndpointSlice Loop

Slide 14

Slide 14 text

Kube-proxyの話(ほんぺ)

Slide 15

Slide 15 text

kube-proxyは利⽤者の夢を叶えてくれます • kube-proxy とは • Kubernetesの基本コンポーネントの1つです • EKSではDaemonSetでデプロイされたりしています • ノードのネットワークプロキシに対して変更を加えることでServiceリソースの実現を⾏なっています • kube-proxyの役割 • ServiceとEndpointSliceを監視し、ノードのネットワーク設定を最新にします • kube-proxyの管理するネットワークはkube-proxyを起動する時にproxy-modeで設定できます • Kubernetes v1.20現在では iptables / ipvs / userspace のいずれか

Slide 16

Slide 16 text

Kube-proxyの登場⼈物紹介 • ProxyServer • kube-proxyの本体で、このインスタンスのRun関数が叩かれることでkube-proxyが起動します • 起動時に設定に則って⽣成されたproxy.Providorのインタフェースを叩く • メインループ(or goroutine)としてSyncLoop関数を起動して定期的に同期処理をする • proxy.Providor • ネットワーク設定の変更処理をコールするためのインタフェース • Sync関数とSyncLoop関数を提供している • Sync関数は同期的にネットワーク設定を最新に変更します • SyncLoop関数はgoroutineを起動し定期的にネットワーク設定を最新にします • xxx.Proxier • proxy.Providorを実装したオブジェクト • iptables / ipvs / userspace のそれぞれの実装が存在している • つまりこれを独⾃実装してビルドすれば、あなただけのkube-proxyを実装できます

Slide 17

Slide 17 text

kube-proxy初期化 ProxyServer proxy.Provider SyncLoop iptables.Proxier Injected on boot Sync ipvs.Proxier userspace.Proxier

Slide 18

Slide 18 text

Service/EndpointSlice 追加時の挙動 EPSlice Svc informer ProxyServer iptables.Proxier onXXXAdded SyncLoop syncProxyRules Sync up iptables at least once in 1h serviceMap endpointsMap Sync iptables on the node API Resources

Slide 19

Slide 19 text

iptablesに反映されるルール例

Slide 20

Slide 20 text

kube-proxyはどうやら3つのルールを作成するらしい • KUBE-SERVICES • Serviceすべてのレコードがルールとして記載されています • パケットの送信先IPアドレスがあるServiceと⼀致している場合、そのServiceのルール(後述)へジャンプします • KUBE-SVC-XXX • ある特定のService専⽤のルールです、このルールにはServiceがどこへルーティングされるかの情報が記載されていま す • iptablesのstatisticモジュールのrandomモードで同確率でServiceに紐つくEndpointSliceのルール(後述)宛にジャンプ するようになっています • KUBE-SEP-XXX • パケットをあるEndpointSliceのIPアドレスへDNATするルールです

Slide 21

Slide 21 text

kube-proxyはどうやら3つのルールを作成するらしい Packet to Service KUBE-SERVICES KUBE-SVC-XXX KUBE-SEP-XXX KUBE-SEP-XXX KUBE-SEP-XXX Packet to Pod DNAT DNAT DNAT iptables