Slide 1

Slide 1 text

Ephemeral Containers という docker にもない謎の機能を k8s はどうやって実現しているのか koba1t Kubernetes Meetup Tokyo #45 LT

Slide 2

Slide 2 text

自己紹介 name: 小林優吾 github: koba1t twitter: 0x6b6f62 所属: ヤフー株式会社 2

Slide 3

Slide 3 text

Ephemeral Containersとは エフェメラルコンテナは、トラブルシューティングなどのユーザーが開始するアクションを実行 するために、すでに存在するPod内で一時的に実行するコンテナです。エフェメラルコンテナ は、アプリケーションの構築ではなく、serviceの調査のために利用します。 -- https://kubernetes.io/ja/docs/concepts/workloads/pods/ephemeral-containers/ --

Slide 4

Slide 4 text

[Demo] Ephemeral Containers

Slide 5

Slide 5 text

[Demo] Ephemeral Containers 参考: https://kubernetes.io/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container-example

Slide 6

Slide 6 text

Ephemeral Containersとは エフェメラルコンテナは、トラブルシューティングなどのユーザーが開始するアクションを実行 するために、すでに存在するPod内で一時的に実行するコンテナです。エフェメラルコンテナ は、アプリケーションの構築ではなく、serviceの調査のために利用します。 -- https://kubernetes.io/ja/docs/concepts/workloads/pods/ephemeral-containers/ -- - どうやって隔離されるはずのコンテナの越えてプロセスに触っているのか?

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

結局の所kubeletは何をしているか CRIへtargetとなるコンテナのPIDを追加して渡している

Slide 10

Slide 10 text

結局の所kubeletは何をしているか デバッグするターゲットコンテナと同じ PID Namespace にdebug 用コンテナを起動するというリクエストが CRI(Container Runtime Interface) のAPIに送られる CRIへtargetとなるコンテナのPIDを追加して渡している

Slide 11

Slide 11 text

結局の所kubeletは何をしているか デバッグするターゲットコンテナと同じ PID Namespace にdebug 用コンテナを起動するというリクエストが CRI(Container Runtime Interface) のAPIに送られる CRIへtargetとなるコンテナのPIDを追加して渡している 同じ PID Namespace で起動したら他のコンテナのプロセスに触れる?

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Ephemeral Containersとは エフェメラルコンテナは、トラブルシューティングなどのユーザーが開始するアクションを実行 するために、すでに存在するPod内で一時的に実行するコンテナです。エフェメラルコンテナ は、アプリケーションの構築ではなく、serviceの調査のために利用します。 -- https://kubernetes.io/ja/docs/concepts/workloads/pods/ephemeral-containers/ -- - pod内に起動したとしてどうやってコンテナを越えてプロセスに触るの? > 共通のPID Namespaceにプロセスを起動することで隔離されなくなる

Slide 17

Slide 17 text

余談 - ところで “PID Namespace” の設定は通常のPod定義で仕様できるのだろうか?

Slide 18

Slide 18 text

余談 - ところで “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定義には利用できそうにない

Slide 19

Slide 19 text

追記

Slide 20

Slide 20 text

dockerでも “pid” を指定するオプションがある Ephemeral Container と原理上は同じことができそう... https://docs.docker.com/engine/reference/commandline/container_run/

Slide 21

Slide 21 text

dockerでも似たようなことはできた...