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
240
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
70
[k8sjp #56] Kustomize v5 を含む最新機能とテクニックの紹介
koba1t
2
9.5k
kustomizeのあまり知られていないが 便利な機能 (kustomize edit,create) の紹介
koba1t
0
3.1k
Recap: Customizing Kustomize with Client-Side Custom Resources
koba1t
0
240
CLE33
koba1t
0
48
カスタムコントローラは万能なのでアプリケーションを作るためにも使える
koba1t
1
520
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
900
Code Reviewing Like a Champion
maltzj
520
39k
Producing Creativity
orderedlist
PRO
341
39k
Gamification - CAS2011
davidbonilla
80
5k
Practical Orchestrator
shlominoach
186
10k
GraphQLとの向き合い方2022年版
quramy
43
13k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Documentation Writing (for coders)
carmenintech
65
4.4k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Ruby is Unlike a Banana
tanoku
97
11k
Being A Developer After 40
akosma
87
590k
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でも似たようなことはできた...