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
Ephemeral_Containers_という謎の機能をk8sはどうやって実現しているのか.pdf
Search
yugo kobayashi
September 28, 2021
1
300
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
12k
kustomizeのあまり知られていないが 便利な機能 (kustomize edit,create) の紹介
koba1t
0
3.5k
Recap: Customizing Kustomize with Client-Side Custom Resources
koba1t
0
290
CLE33
koba1t
0
65
カスタムコントローラは万能なのでアプリケーションを作るためにも使える
koba1t
1
640
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
140
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
Optimizing for Happiness
mojombo
379
70k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
2
3.9k
How to train your dragon (web standard)
notwaldorf
97
6.5k
The untapped power of vector embeddings
frankvandijk
1
1.5k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
220
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
82
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でも似たようなことはできた...