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
820
Serviceをたずねて3000行 - Kubernetesコードリーディングの旅 -
kubernetes/kubernetesのリポジトリを元に、Serviceリソースがどのようにネットワークへ反映されるのかを追ってみました
RyuSA
February 09, 2021
Tweet
Share
More Decks by RyuSA
See All by RyuSA
Java屋だってOperatorが作りたい!
ryusa
1
540
Visual Studio Codeとコンテナでいい感じのRe:View執筆環境
ryusa
1
1.5k
JavaScriptと歩くポリシーエンジン jsPolicy
ryusa
1
540
TextAlive App APIと夢見る新しいUX
ryusa
1
370
Gitlab Operatorと夢見るGitlab自動化の旅
ryusa
2
1k
AccessPoint Operator on Raspberry Pi
ryusa
1
1.1k
そのAPIはセキュアですか?
ryusa
2
790
「L3以下は魔法で動いている!」と言いながらiptablesとkube-proxyを読んでみた話
ryusa
1
130
「〇〇完全に理解したったww」から始めるエンジニア生活
ryusa
2
4.3k
Other Decks in Technology
See All in Technology
Introduction to Bill One Development Engineer
sansan33
PRO
0
250
工具人的一生: 開發很多 AI 工具讓我 慵懶過一生
line_developers_tw
PRO
0
140
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
7.3k
Amplifyとゼロからはじめた AIコーディング 成果と展望
mkdev10
1
190
In Praise of "Normal" Engineers (LDX3)
charity
2
850
Snowflake Intelligenceで実現できるノーコードAI活用
takumimukaiyama
1
210
白金鉱業Meetup_Vol.19_PoCはデモで語れ!顧客の本音とインサイトを引き出すソリューション構築
brainpadpr
2
310
kubellが挑むBPaaSにおける、人とAIエージェントによるサービス開発の最前線と技術展望
kubell_hr
0
290
Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips
ykagano
1
880
Grafana MCP serverでなんかし隊 / Try Grafana MCP server
kohbis
0
340
“プロダクトを好きになれるか“も QAエンジニア転職の大事な判断基準だと思ったの
tomodakengo
0
130
SFTPコンテナからファイルをダウンロードする
dip
0
160
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
328
39k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Documentation Writing (for coders)
carmenintech
71
4.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Building Applications with DynamoDB
mza
95
6.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
GitHub's CSS Performance
jonrohan
1031
460k
The World Runs on Bad Software
bkeepers
PRO
68
11k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Speed Design
sergeychernyshev
30
990
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