Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

928b1395afedebb5ee48d44ab917c5f1?s=47 RyuSA
February 09, 2021

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

kubernetes/kubernetesのリポジトリを元に、Serviceリソースがどのようにネットワークへ反映されるのかを追ってみました

928b1395afedebb5ee48d44ab917c5f1?s=128

RyuSA

February 09, 2021
Tweet

Transcript

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

  2. Who Am I

  3. AGENDA • Serviceリソースがネットワークに反映されるまで • EndpointSlice Controller / kube-proxy • (下記⾚枠部分)

    出典 : https://kubernetes.io/ja/docs/concepts/overview/components/
  4. なぜService︖😕

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

  6. Curl to Service curl 10.100.233.191 (=svc) Reply from 10.1.0.100 (=pod)

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

    Abracadabra……
  8. NOTATION • 環境 • Kubernetes v1.20をベースに動作確認、コードリーディングをしています • IPv6を利⽤したデュアルスタック環境については触れません • つまりデフォルト

    • kube-proxyのproxy-modeはiptablesです • つまりデフォ(ry • featureGateのEndpointSliceとEndpointSliceProxyingは有効です • つまりデ(ry • 話さない内容 • LoadBalancer TypeのServiceについて • Golangガチ初⼼者が読んでます • 読み間違い、勘違い等あるかもしれません……
  9. Serviceの反映にはControllerが関わってます • KubernetesにおけるControllerとは • Controllerは1種類以上のKubernetesリソースを監視し、特定のミッションを達成するためのコンポーネント • 監視しているリソースのspecに合わせて「現在の状態」を「⽬的の状態」に変更・制御していくことが⼀般的なコント ローラのミッションです • その多くはapiserverへフィードバック/副作⽤を送ります

    • Serviceリソースのルーティングに関連するController • EndpointSlice Controller • EndpointSliceリソースを監視しているControllerです • kube-proxyが監視しているEndpointSliceリソースに対し副作⽤を及ぼします • kube-proxy • Serviceリソースを監視しているコンポーネント(兼Controller)です
  10. EndpointSlice Controller の話

  11. PodとServiceを紐つけておく • EndpointSlice とは • ServiceリソースのセレクタとPodへの紐付けを管理するリソースです • ⼀緒にPodのTopology(=“kubernetes.io/hostname” など)も保存されてます •

    kube-proxyに監視されてます • EndpointSlice Controllerの役割 • 主にPodをServiceを監視し、EndpointSliceを常に最新の状態に変更します • EndpointSlice⾃体も監視しています
  12. EndpointSlice Controller 全体像 EPSlice informer Main loop Queue Cache; selector

    and Service Sync Service with svc name And update the cache Svc Pod API Resources
  13. 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
  14. Kube-proxyの話(ほんぺ)

  15. 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 のいずれか
  16. 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を実装できます
  17. kube-proxy初期化 ProxyServer proxy.Provider SyncLoop iptables.Proxier Injected on boot Sync ipvs.Proxier

    userspace.Proxier
  18. 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
  19. iptablesに反映されるルール例

  20. 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するルールです
  21. 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