Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ephemeral_Containers_という謎の機能をk8sはどうやって実現しているのか.pdf

yugo kobayashi
September 28, 2021
200

 Ephemeral_Containers_という謎の機能をk8sはどうやって実現しているのか.pdf

yugo kobayashi

September 28, 2021
Tweet

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. [Demo] Ephemeral Containers

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. 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

    View full-size slide

  8. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide