Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Serviceをたずねて3000行 - Kubernetesコードリーディングの旅 -
Search
RyuSA
February 09, 2021
Technology
960
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Serviceをたずねて3000行 - Kubernetesコードリーディングの旅 -
kubernetes/kubernetesのリポジトリを元に、Serviceリソースがどのようにネットワークへ反映されるのかを追ってみました
RyuSA
February 09, 2021
More Decks by RyuSA
See All by RyuSA
Java屋だってOperatorが作りたい!
ryusa
1
620
Visual Studio Codeとコンテナでいい感じのRe:View執筆環境
ryusa
1
1.6k
JavaScriptと歩くポリシーエンジン jsPolicy
ryusa
1
610
TextAlive App APIと夢見る新しいUX
ryusa
1
480
Gitlab Operatorと夢見るGitlab自動化の旅
ryusa
2
1.1k
AccessPoint Operator on Raspberry Pi
ryusa
1
1.3k
そのAPIはセキュアですか?
ryusa
2
870
「L3以下は魔法で動いている!」と言いながらiptablesとkube-proxyを読んでみた話
ryusa
1
180
「〇〇完全に理解したったww」から始めるエンジニア生活
ryusa
2
4.6k
Other Decks in Technology
See All in Technology
Technical Project Manager の役割とやりがい、少しだけ AI
yoshiiryo1
0
280
"AWSはちょっと苦手"でも大丈夫。AWS Blocks で手軽に作る Flutter のバックエンド #FlutterKaigi
tacck
PRO
0
110
cdk deployとcdkd deploy、実際にデプロイして5倍速近くの差を実測した
yama3133
1
120
Draft AIエージェントの トークン消費を最小化する 8つの原則
kinopeee
6
1.9k
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
200
なぜ東京にいる私が、新潟の技術コミュニティを運営するのか by 八雲慎之助
yakumo
0
130
AIエージェント時代、Kaggleにどう取り組むか
takanao
2
410
仕様駆動開発の、その先へ。決める力と確かめる仕組み
inariku
1
140
視野はAIに、視座は人に / ai-for-breadth-humans-for-perspective
nkzn
5
2.5k
Adversary Infrastructure Hunting101
disconinja
0
180
[re:Invent2026事前勉強会(有志開催)]続きは、ラスベガスの廊下で / continue-in-the-vegas-hallway
sh_fk2
0
430
バイブコーディングの特徴と「コケて直す」ループ
happysamurai294
0
130
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
440
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
Writing Fast Ruby
sferik
630
63k
Deep Space Network (abreviated)
tonyrice
0
390
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.4k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
870
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
WENDY [Excerpt]
tessaabrams
14
40k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
430
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