Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Serviceをたずねて3000行 - Kubernetesコードリーディングの旅 -
Search
RyuSA
February 09, 2021
Technology
2
740
Serviceをたずねて3000行 - Kubernetesコードリーディングの旅 -
kubernetes/kubernetesのリポジトリを元に、Serviceリソースがどのようにネットワークへ反映されるのかを追ってみました
RyuSA
February 09, 2021
Tweet
Share
More Decks by RyuSA
See All by RyuSA
Java屋だってOperatorが作りたい!
ryusa
1
470
Visual Studio Codeとコンテナでいい感じのRe:View執筆環境
ryusa
1
1.4k
JavaScriptと歩くポリシーエンジン jsPolicy
ryusa
1
500
TextAlive App APIと夢見る新しいUX
ryusa
1
310
Gitlab Operatorと夢見るGitlab自動化の旅
ryusa
2
900
AccessPoint Operator on Raspberry Pi
ryusa
1
1k
そのAPIはセキュアですか?
ryusa
2
760
「L3以下は魔法で動いている!」と言いながらiptablesとkube-proxyを読んでみた話
ryusa
1
100
「〇〇完全に理解したったww」から始めるエンジニア生活
ryusa
2
4.1k
Other Decks in Technology
See All in Technology
運営11年目タイトルを守る最強の盾の有効性と活用法
mixi_engineers
PRO
2
120
太田博三(@usagisan2020)
otanet
0
140
Grafana エコシステムの活用事例 on ABEMA
tetsuya28
5
710
VueとViteで作るUIコンポーネントライブラリ ~デザインシステムとプロダクトの理想的な分離を目指して~ / 20241019_cloudsign_VueFesJapan2024_1
bengo4com
8
3k
プログラミング写経のすすめ
natsutan
0
150
Deep dive into Nuxt Server Components
wattanx
1
380
寒冷地稲作の歴史にみるコミュニティ
miu_crescent
2
130
さくっと実践!Postmanを活用した高品質で持続可能なAPI管理
yokawasa
5
350
Road to Single Activity Uncovered
yurihondo
0
110
LLMOps : ΔMLOps
shuntaito
5
770
AWS DDKを利用したDataOps事始め
beex
1
160
Rist_Meetup_Kaggleは業務の役にたつ - ビジネスコンテンツ情報を活用する BtoB 事業編 - / rist-meetup-20241012
taro_masuda
0
260
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
93
13k
Why Our Code Smells
bkeepers
PRO
334
57k
Optimizing for Happiness
mojombo
375
69k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
26
700
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
105
48k
Into the Great Unknown - MozCon
thekraken
31
1.4k
Producing Creativity
orderedlist
PRO
341
39k
Gamification - CAS2011
davidbonilla
80
5k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Designing for humans not robots
tammielis
249
25k
Optimising Largest Contentful Paint
csswizardry
31
2.9k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
Transcript
RyuSA Serviceをたずねて3000⾏ - Kubernetesコードリーディングの旅 -
Who Am I
AGENDA • Serviceリソースがネットワークに反映されるまで • EndpointSlice Controller / kube-proxy • (下記⾚枠部分)
出典 : https://kubernetes.io/ja/docs/concepts/overview/components/
なぜService︖😕
なぜServiceを読もうとしたのか
Curl to Service curl 10.100.233.191 (=svc) Reply from 10.1.0.100 (=pod)
Abracadabra……
Curl to Service curl 10.100.233.191 (=svc) Reply from 10.1.0.100 (=pod)
Abracadabra……
NOTATION • 環境 • Kubernetes v1.20をベースに動作確認、コードリーディングをしています • IPv6を利⽤したデュアルスタック環境については触れません • つまりデフォルト
• kube-proxyのproxy-modeはiptablesです • つまりデフォ(ry • featureGateのEndpointSliceとEndpointSliceProxyingは有効です • つまりデ(ry • 話さない内容 • LoadBalancer TypeのServiceについて • Golangガチ初⼼者が読んでます • 読み間違い、勘違い等あるかもしれません……
Serviceの反映にはControllerが関わってます • KubernetesにおけるControllerとは • Controllerは1種類以上のKubernetesリソースを監視し、特定のミッションを達成するためのコンポーネント • 監視しているリソースのspecに合わせて「現在の状態」を「⽬的の状態」に変更・制御していくことが⼀般的なコント ローラのミッションです • その多くはapiserverへフィードバック/副作⽤を送ります
• Serviceリソースのルーティングに関連するController • EndpointSlice Controller • EndpointSliceリソースを監視しているControllerです • kube-proxyが監視しているEndpointSliceリソースに対し副作⽤を及ぼします • kube-proxy • Serviceリソースを監視しているコンポーネント(兼Controller)です
EndpointSlice Controller の話
PodとServiceを紐つけておく • EndpointSlice とは • ServiceリソースのセレクタとPodへの紐付けを管理するリソースです • ⼀緒にPodのTopology(=“kubernetes.io/hostname” など)も保存されてます •
kube-proxyに監視されてます • EndpointSlice Controllerの役割 • 主にPodをServiceを監視し、EndpointSliceを常に最新の状態に変更します • EndpointSlice⾃体も監視しています
EndpointSlice Controller 全体像 EPSlice informer Main loop Queue Cache; selector
and Service Sync Service with svc name And update the cache Svc Pod API Resources
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
Kube-proxyの話(ほんぺ)
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 のいずれか
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を実装できます
kube-proxy初期化 ProxyServer proxy.Provider SyncLoop iptables.Proxier Injected on boot Sync ipvs.Proxier
userspace.Proxier
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
iptablesに反映されるルール例
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するルールです
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