$30 off During Our Annual Pro Sale. View Details »

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

RyuSA
February 09, 2021

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

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

RyuSA

February 09, 2021
Tweet

More Decks by RyuSA

Other Decks in Technology

Transcript

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

    View Slide

  2. Who Am I

    View Slide

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

    View Slide

  4. なぜService︖😕

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. EndpointSlice Controller の話

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  14. Kube-proxyの話(ほんぺ)

    View Slide

  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 のいずれか

    View Slide

  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を実装できます

    View Slide

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

    View Slide

  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

    View Slide

  19. iptablesに反映されるルール例

    View Slide

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

    View Slide

  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

    View Slide