$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ephemeral_Containers_という謎の機能をk8sはどうやって実現しているのか.pdf
Search
yugo kobayashi
September 28, 2021
1
290
Ephemeral_Containers_という謎の機能をk8sはどうやって実現しているのか.pdf
yugo kobayashi
September 28, 2021
Tweet
Share
More Decks by yugo kobayashi
See All by yugo kobayashi
[k8sjp]KubeCon_NA_2023_Recap.pdf
koba1t
0
84
[k8sjp #56] Kustomize v5 を含む最新機能とテクニックの紹介
koba1t
2
11k
kustomizeのあまり知られていないが 便利な機能 (kustomize edit,create) の紹介
koba1t
0
3.5k
Recap: Customizing Kustomize with Client-Side Custom Resources
koba1t
0
280
CLE33
koba1t
0
64
カスタムコントローラは万能なのでアプリケーションを作るためにも使える
koba1t
1
600
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
700
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
960
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Designing for humans not robots
tammielis
254
26k
Context Engineering - Making Every Token Count
addyosmani
9
460
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Unsuck your backbone
ammeep
671
58k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Transcript
Ephemeral Containers という docker にもない謎の機能を k8s はどうやって実現しているのか koba1t Kubernetes Meetup
Tokyo #45 LT
自己紹介 name: 小林優吾 github: koba1t twitter: 0x6b6f62 所属: ヤフー株式会社 2
Ephemeral Containersとは エフェメラルコンテナは、トラブルシューティングなどのユーザーが開始するアクションを実行 するために、すでに存在するPod内で一時的に実行するコンテナです。エフェメラルコンテナ は、アプリケーションの構築ではなく、serviceの調査のために利用します。 -- https://kubernetes.io/ja/docs/concepts/workloads/pods/ephemeral-containers/ --
[Demo] Ephemeral Containers
[Demo] Ephemeral Containers 参考: https://kubernetes.io/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container-example
Ephemeral Containersとは エフェメラルコンテナは、トラブルシューティングなどのユーザーが開始するアクションを実行 するために、すでに存在するPod内で一時的に実行するコンテナです。エフェメラルコンテナ は、アプリケーションの構築ではなく、serviceの調査のために利用します。 -- https://kubernetes.io/ja/docs/concepts/workloads/pods/ephemeral-containers/ -- - どうやって隔離されるはずのコンテナの越えてプロセスに触っているのか?
kubeletのコードを読みに行く 起点はkubelet内(kubelet/kuberuntime/kuberuntime_container.go)のコンテナ起動に利用される startContainer() https://github.com/kubernetes/kubernetes/blob/v1.23.0-alpha.2/pkg/kubelet/kuberuntime/kuberuntime_container.go#L173 https://github.com/kubernetes/kubernetes/blob/v1.23.0-alpha.2/pkg/kubelet/kuberuntime/kuberuntime_container.go#L208 この関数内でgetTargetID() が 有効な値を返すかでEphemeral Containerかそうでな いか区別している
https://github.com/kubernetes/kubernetes/blob/v1.23.0-alpha.2/pkg/kubelet/kuberuntime/kuberuntime_container.go#L120 このgetTargetID() の戻り値 `target` が generateContainerConfig() の引数の一つに なる https://github.com/kubernetes/kubernetes/blob/v1.23.0-alpha.2/pkg/kubelet/kuberuntime/kuberuntime_container.go#L215
kubeletのコードを読みに行く2 generateContainerConfig() で呼び出す applyPlatformSpecificContainerConfig()の 引数nsTargetになる https://github.com/kubernetes/kubernetes/blob/v1.23.0-alpha.2/pkg/kubelet/kuberuntime/kuberuntime_container.go#L215 applyPlatformSpecificContainerConfig()は各プラットフォーム固有の処理をやってて、 linuxではgenerateLinuxContainerConfig()をそのまま実行してる https://github.com/kubernetes/kubernetes/blob/v1.23.0-alpha.2/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go#L59-L62 generateLinuxContainerConfig()内で
という感じにSecurityContext.NamespaceOptions でtargetのPIDを設定してる https://github.com/kubernetes/kubernetes/blob/v1.23.0-alpha.2/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go#L59-L62
結局の所kubeletは何をしているか CRIへtargetとなるコンテナのPIDを追加して渡している
結局の所kubeletは何をしているか デバッグするターゲットコンテナと同じ PID Namespace にdebug 用コンテナを起動するというリクエストが CRI(Container Runtime Interface) のAPIに送られる
CRIへtargetとなるコンテナのPIDを追加して渡している
結局の所kubeletは何をしているか デバッグするターゲットコンテナと同じ PID Namespace にdebug 用コンテナを起動するというリクエストが CRI(Container Runtime Interface) のAPIに送られる
CRIへtargetとなるコンテナのPIDを追加して渡している 同じ PID Namespace で起動したら他のコンテナのプロセスに触れる?
None
None
None
None
Ephemeral Containersとは エフェメラルコンテナは、トラブルシューティングなどのユーザーが開始するアクションを実行 するために、すでに存在するPod内で一時的に実行するコンテナです。エフェメラルコンテナ は、アプリケーションの構築ではなく、serviceの調査のために利用します。 -- https://kubernetes.io/ja/docs/concepts/workloads/pods/ephemeral-containers/ -- - pod内に起動したとしてどうやってコンテナを越えてプロセスに触るの?
> 共通のPID Namespaceにプロセスを起動することで隔離されなくなる
余談 - ところで “PID Namespace” の設定は通常のPod定義で仕様できるのだろうか?
余談 - ところで “PID Namespace” の設定は通常のPod定義で利用できるのだろうか? CRIのAPI定義(LinuxContainerSecurityContext構造体内のNamespaceOptions)ではPID Namespaceを指定できるが、k8sのpod等で利用している core/v1 のContainer構造体定
義内の SecurityContext では指定できない。 https://pkg.go.dev/k8s.io/cri-api/pkg/apis/runtime/v1alpha2#LinuxContainerSecurityContext https://pkg.go.dev/k8s.io/api/core/v1#SecurityContext 内部的に使用する値のようで通常のPod定義には利用できそうにない
追記
dockerでも “pid” を指定するオプションがある Ephemeral Container と原理上は同じことができそう... https://docs.docker.com/engine/reference/commandline/container_run/
dockerでも似たようなことはできた...