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

KEP-3063: Dynamic resource allocation

bells17
November 27, 2023

KEP-3063: Dynamic resource allocation

KEP持ち寄り会で発表した資料です。
KubernetesのKEP "Dynamic resource allocation" に関する情報をまとめた内容になります。

イベントURL: https://kep.connpass.com/event/299651/
参考資料:

https://zenn.dev/toversus/articles/fe2aa06f133b49
https://kubernetes.io/blog/2022/12/15/dynamic-resource-allocation/
https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/3063-dynamic-resource-allocation/README.md
https://github.com/kubernetes-sigs/dra-example-driver/blob/main/demo/demo-apps.png
https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/3063-dynamic-resource-allocation/components.png
https://github.com/cncf-tags/container-device-interface
https://github.com/containerd/containerd/blob/v1.7.9/pkg/cri/server/container_create_linux.go#L417-L419
https://github.com/cncf-tags/container-device-interface/blob/main/pkg/cdi/container-edits.go#L70-L148
https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/3063-dynamic-resource-allocation/README.md
https://github.com/kubernetes/kubernetes/pull/111023
https://github.com/orgs/kubernetes/projects/95/views/1
https://github.com/kubernetes/dynamic-resource-allocation
https://www.cncf.io/projects/akri/
https://github.com/kubernetes-sigs/dra-example-driver
https://github.com/NVIDIA/k8s-dra-driver
https://github.com/intel/intel-resource-drivers-for-kubernetes
https://github.com/intel/intel-device-plugins-for-kubernetes
https://docs.google.com/document/d/1BNWqgx_SmZDi-va_V31v3DnuVwYnF2EmN7D-O_fB6Oo/edit#heading=h.bxuci8gx6hna
https://drive.google.com/file/d/1iLg2FEAEilb1dcI27TnB19VYtbcvgKhS/view
https://developer.nvidia.com/blog/nvidia-gpu-operator-simplifying-gpu-management-in-kubernetes/
https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/overview.html
https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/cdi.html
https://intel.github.io/intel-device-plugins-for-kubernetes/README.html
https://github.com/NVIDIA/k8s-device-plugin
https://blogs.nvidia.com/blog/multi-instance-gpus/
https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/
https://groups.google.com/a/kubernetes.io/g/dev/c/BDtCFfXQbw0?pli=1
https://kubernetes.slack.com/archives/C032ZE66A2X/p1700215190429689
https://kubernetes.slack.com/archives/C032ZE66A2X/p1700215190429689

bells17

November 27, 2023
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

  1. KEP-
    3
    0
    6
    3
    :


    Dynamic resource allocation
    KEP持ち寄り会(
    2 0 2 3
    /
    1 1
    /
    2 7
    ) #kepjp


    @bells
    1 7

    View full-size slide

  2. ▶ @bells
    1
    7


    ▶ Software Engineer@
    3
    -shake inc.


    ▶ kubernetes & kubernetes-csi member


    ▶ Kubernetes Internal Organizer


    ▶ #kubenews


    ▶ X(Twitter): @bells
    1
    7
    _


    ▶ GitHub: @bells
    1
    7

    View full-size slide

  3. KEP-
    3
    0
    6
    3
    :


    Dynamic resource allocation

    View full-size slide

  4. この発表より内容が


    ちゃんとまとまってます


    @toVersus さん最⾼です
    https://zenn.dev/toversus/articles/fe
    2
    aa
    0 6
    f
    1 3 3
    b
    4 9
    答え: この記事を読みましょう

    View full-size slide

  5. Dynamic resource allocation(DRA) とは?
    ▶ Kubernetes v
    1
    .
    2 6
    で追加された alpha API の1つ


    ▶ ワークロード向けに様々なデバイス(リソース)を設定~割り当てるための機能


    ▶ 例えばGPUやFPGAといった様々なデバイスをより柔軟にPodに割り当てるために使ったり


    ▶ 次のようなことが可能になる


    + 異なるポッドおよびコンテナ内から同じリソースへのアクセス


    + リソース要求に応じた最適なリソースを割り当て


    + ユーザーが指定したパラメータに従ってリソースの初期化を実⾏
    https://kubernetes.io/blog/
    2 0 2 2
    /
    1 2
    /
    1 5
    /dynamic-resource-allocation/

    View full-size slide

  6. Device Pluginを使えば


    GPUとかって普通に使えるじゃん?

    View full-size slide

  7. DRAを使うとDevice Pluginではできなかったこんなことができる
    ▶ 異なるポッドおよびコンテナ内から同じリソースへのアクセス


    ▶ FPGA などをワークロード⽤に再構成/再プログラミングする


    ▶ ワークロード終了時にワークロード向けのデバイス設定をクリーンアップ


    ▶ リソースの部分割り当て(e.g. 要求に応じたNVIDIA GPUのMIGデバイスの動的割り当て)


    ▶ デバイスへのオプションの割り当て


    ▶ ネットワーク‧ファブリック経由のデバイスのサポート


    ▶ デバイス単位の初期化の実⾏
    https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/
    3 0 6 3
    -dynamic-resource-allocation/README.md

    View full-size slide

  8. DRA Driver(Plugin)の実装例

    View full-size slide

  9. 調べて出てきたDRA Pluginは下記の3つ
    ▶ kubernetes-sigs/dra-example-driver: サンプル実装


    + コンテナにGPUを割り当てる⾵のサンプルとなっているけど、実際にはGPUが無くても
    kindさえあれば動かすことができるのでDRA Pluginについて学びたい場合は最適


    ▶ NVIDIA/k
    8
    s-dra-driver: NVIDIA製GPU向けプラグイン


    + リポジトリのリンク先にあるGoogle Docsでどのように動作するのかの資料があったり
    デモ動画があったりとわかりやすい


    + ちなみに NVIDIA/gpu-operator はノード上のGPUをプロビジョニングするためのものな
    ので別物らしい


    ▶ intel/intel-resource-drivers-for-kubernetes: Intel製GPU向けプラグイン


    + intel/intel-device-plugins-for-kubernetes を⾒るとFPGA/QAT/SGX/SGX/DLB/IAAなど
    様々なデバイスプラグインが存在するので、そのうちこいつらもサポートされるのかも

    View full-size slide

  10. dra-example-driver
    ▶ https://github.com/kubernetes-sigs/dra-example-driver にResource Driverの

    サンプルがある


    ▶ コンテナにGPUを割り当てる⾵のサンプルとなっている


    ▶ サンプル実装なので、実際にGPUを割り当てているわけではない


    ▶ 主に「複数Pod/コンテナに対して1つのGPUを共有する」といった例を⾒せてくれる

    サンプルとなっている


    ▶ kindがあれば試すことができるのでまずはさわってみるのがオススメです

    View full-size slide

  11. dra-example-driverで検証できること
    https://github.com/kubernetes-sigs/dra-example-driver/blob/main/demo/demo-apps.png

    View full-size slide

  12. DRA Driver(Plugin)のアーキテクチャ

    View full-size slide

  13. コンポーネント図
    https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/
    3 0 6 3
    -dynamic-resource-allocation/components.png

    View full-size slide

  14. Podを起動開始するまでの流れ
    AllocationMode=WaitForFirstConsumerのケースの流れです(Immediateの場合は先にAllocateしてからschedulerというフロー)

    View full-size slide

  15. ボリュームの場合kubeletのVolume Managerでボリュームセットアップを待機してる

    View full-size slide

  16. kubeletがPodを実際に起動するまでの流れ
    ちなみに登場してないresource claim controllerくんはResourceClaimTemplateからResourceClaimの⽣成などを担当してくれています

    View full-size slide

  17. Kubelet Plugin Watcher

    View full-size slide

  18. Kubelet ~ CSI Drier間の通信

    View full-size slide

  19. Container Device Interface(CDI)
    ▶ サードパーティのデバイスをサポートするためのコンテナ ランタイムの仕様


    ▶ containerdの場合は”enable_cdi”を有効にすると利⽤することができる


    ▶ デフォルトだと/etc/cdi or /var/run/cdi配下にこのCDIの仕様に沿った設定ファイルを

    設置するよう


    ▶ 設定ファイルの内容に沿ってコンテナの起動設定をアップデートできるよう


    ▶ アップデートできるフィールドについてはSPECのOCI Editsに詳しく書いてある
    https://github.com/cncf-tags/container-device-interface

    View full-size slide

  20. $ kubectl exec -it -n gpu-test4 pod0 -- env | grep GPU


    GPU_NODE_NAME=dra-example-driver-cluster-worker


    GPU_DEVICE_0=GPU-f11773a1-5bfb-e48b-3d98-1beb5baaf08e


    GPU_DEVICE_1=GPU-93d37703-997c-c46f-a531-755e3e0dc2ac


    GPU_DEVICE_2=GPU-e7b42cb1-4fd8-91b2-bc77-352a0c1f5747


    GPU_DEVICE_3=GPU-ee3e4b55-fcda-44b8-0605-64b7a9967744
    dra-example-driverのコンテナ内部を⾒てみると

    環境変数が設定されているのが確認できる

    → これがこのデモにおけるデバイスの割り当てを表しているよう
    “GPU_DEVICE_x”という環境変数にはそれぞれドライバーが適当に⽣成したUUIDがセットされている

    View full-size slide

  21. $ docker exec -it d67f749149f5 /bin/bash


    root@dra-example-driver-cluster-worker:/# cat /var/run/cdi/k8s.gpu.resource.example.com-
    gpu_4cae1474-ed97-4edf-876e-fa73c3af279b.yaml


    cdiVersion: 0.3.0


    containerEdits: {}


    devices:


    - containerEdits:


    env:


    - GPU_DEVICE_0=GPU-f11773a1-5bfb-e48b-3d98-1beb5baaf08e


    name: GPU-f11773a1-5bfb-e48b-3d98-1beb5baaf08e


    - containerEdits:


    env:


    - GPU_DEVICE_1=GPU-93d37703-997c-c46f-a531-755e3e0dc2ac


    name: GPU-93d37703-997c-c46f-a531-755e3e0dc2ac


    - containerEdits:


    env:


    - GPU_DEVICE_2=GPU-e7b42cb1-4fd8-91b2-bc77-352a0c1f5747


    name: GPU-e7b42cb1-4fd8-91b2-bc77-352a0c1f5747


    - containerEdits:


    env:


    - GPU_DEVICE_3=GPU-ee3e4b55-fcda-44b8-0605-64b7a9967744


    name: GPU-ee3e4b55-fcda-44b8-0605-64b7a9967744


    kind: k8s.gpu.resource.example.com/gpu
    この環境変数はどうやら/var/run/cdi配下にあるファイルで設定されているらしい

    View full-size slide

  22. func (c *criService) containerSpecOpts(config *runtime.ContainerConfig, imageConfig
    *imagespec.ImageConfig) ([]oci.SpecOpts, error) {


    var specOpts []oci.SpecOpts


    ...


    if c.config.EnableCDI {


    specOpts = append(specOpts, customopts.WithCDI(config.Annotations,
    config.CDIDevices))


    }


    return specOpts, nil


    }
    containerdのコードを⾒てみるとenable_cdiを有効にすることで

    OCIコンテナのSpecにデバイス設定を追加してくれるのがわかる
    https://github.com/containerd/containerd/blob/v
    1
    .
    7
    .
    9
    /pkg/cri/server/container_create_linux.go#L
    4 1 7
    -L
    4 1 9

    View full-size slide

  23. // Apply edits to the given OCI Spec. Updates the OCI Spec in place.


    // Returns an error if the update fails.


    func (e *ContainerEdits) Apply(spec *oci.Spec) error {


    if spec == nil {


    return errors.New("can't edit nil OCI Spec")


    }


    if e == nil || e.ContainerEdits == nil {


    return nil


    }


    specgen := ocigen.NewFromSpec(spec)


    if len(e.Env) > 0 {


    specgen.AddMultipleProcessEnv(e.Env)


    }


    ...


    return nil


    }
    最終的にこのあたりでenvを追加してる
    https://github.com/cncf-tags/container-device-interface/blob/main/pkg/cdi/container-edits.go#L
    7 0
    -L
    1 4 8

    View full-size slide

  24. 仕様については⾊々書いてあってちゃんと理解するのはめんどいけど、
    containerdのコードを読む限りOCI Runtime Specファイルにちょいと⼿
    を加えてるだけなのがわかるので、コードベースで⾒ると理解がしやすい

    View full-size slide

  25. ---


    apiVersion: resource.k8s.io/v1alpha2


    kind: ResourceClaim


    metadata:


    namespace: gpu-test4


    name: multiple-gpus


    spec:


    spec:


    resourceClassName: gpu.example.com


    parametersRef:


    apiGroup: gpu.resource.example.com


    kind: GpuClaimParameters


    name: multiple-gpus


    ---


    apiVersion: gpu.resource.example.com/v1alpha1


    kind: GpuClaimParameters


    metadata:


    namespace: gpu-test4


    name: multiple-gpus


    spec:


    count: 4
    ResourceClaimやResourceClassのparametersRefとCRDなどの任意のリソースを利⽤して

    リソース(デバイス)の設定のためのパラメータを渡すことが可能になっている

    View full-size slide

  26. DRA Driver(Plugin)のアーキテクチャまとめ
    ▶ DRA Driverは下記の2つで構成


    + controller: ResourceClaimに対して選ばれたNodeとリソース(デバイス)要求に対する

    ”(De)Allocate”を通してデバイスのセットアップ/クリーンアップを⾏うことができる


    + kubeplugin: Pod起動/停⽌時に“Node(Un)PrepareResources”を通してCDI Spec

    ファイルを通してコンテナ(ランタイム)にデバイスの情報を共有することができる


    ▶ DRAに伴って追加‧拡張されたリソースは以下


    + Pod(resourceClaim/resourcesフィールドなど)


    + ResourceClass: ResourceClaimで使⽤するDRA Driverの設定やパラメータ設定で使⽤


    + ResourceClaim: PVCのリソース(デバイス)版


    + ResourceClaimTemplate: ResourceClaimのテンプレートリソース


    + PodSchedulingContext: WaitForFirstConsumer時のスケジュール処理⽤リソース

    View full-size slide

  27. つまりDRAの仕組みはだいたいボリュームプラグイン+CSI Driver

    View full-size slide

  28. 実装の中⾝については初期実装のPRを追うと理解しやすいです
    https://github.com/kubernetes/kubernetes/pull/
    1 1 1 0 2 3

    View full-size slide

  29. DRAの今後

    View full-size slide

  30. https://groups.google.com/a/kubernetes.io/g/dev/c/BDtCFfXQbw
    0
    ?pli=
    1

    View full-size slide

  31. DRAの今後
    ▶ DRAはCluster Auotscalerとも連携できるようになる予定らしい


    ▶ その上でアーキテクチャの再整理が⼊るかも


    ▶ 今後いろんなsigの⼈が⼊って積極的に開発が⾏われていきそう

    View full-size slide

  32. 開発タスクも⽬⽩押しな状況のよう
    https://github.com/orgs/kubernetes/projects/
    9 5
    /views/
    1

    View full-size slide

  33. まとめ
    ▶ Dynamic Resource Allocation(DRA)はリソース(デバイス)を動的に設定してコンテナに

    割り当てることができる機能でDevice Pluginよりも柔軟な設定が可能な機能です


    ▶ DRAの登場でDevice Pluginが無くなるわけではなく、必要性に応じてDevice Pluginと

    共存していく流れらしいです


    ▶ 実装‧設計ともに⼤きすぎず⼩さすぎずで適度な読み応えの内容だったので読んでて

    ⾯⽩かったしGPU周りの勉強にもなりました


    ▶ 今後もしかしたらDRA v
    2
    くらい実装が変わるかもしれないので楽しみです


    ▶ コントリビューションチャンスも多そうなので注⽬ですね


    View full-size slide

  34. 参考資料
    ▶ https://zenn.dev/toversus/articles/fe
    2
    aa
    0 6
    f
    1 3 3
    b
    4 9

    ▶ https://kubernetes.io/blog/
    2 0 2 2
    /
    1 2
    /
    1 5
    /dynamic-resource-allocation/


    ▶ https://github.com/kubernetes/enhancements/blob/master/keps/
    sig-node/
    3 0 6 3
    -dynamic-resource-allocation/README.md


    ▶ https://github.com/kubernetes-sigs/dra-example-driver/blob/main/
    demo/demo-apps.png


    ▶ https://github.com/kubernetes/enhancements/blob/master/keps/
    sig-node/
    3 0 6 3
    -dynamic-resource-allocation/components.png


    ▶ https://github.com/cncf-tags/container-device-interface


    ▶ https://github.com/containerd/containerd/blob/v
    1
    .
    7
    .
    9
    /pkg/cri/
    server/container_create_linux.go#L
    4 1 7
    -L
    4 1 9

    ▶ https://github.com/cncf-tags/container-device-interface/blob/main/
    pkg/cdi/container-edits.go#L
    7 0
    -L
    1 4 8

    ▶ https://github.com/kubernetes/enhancements/blob/master/keps/
    sig-node/
    3 0 6 3
    -dynamic-resource-allocation/README.md


    ▶ https://github.com/kubernetes/kubernetes/pull/
    1 1 1 0 2 3

    ▶ https://github.com/orgs/kubernetes/projects/
    9 5
    /views/
    1

    ▶ https://github.com/kubernetes/dynamic-resource-allocation


    ▶ https://www.cncf.io/projects/akri/
    ▶ https://github.com/kubernetes-sigs/dra-example-driver


    ▶ https://github.com/NVIDIA/k
    8
    s-dra-driver


    ▶ https://github.com/intel/intel-resource-drivers-for-kubernetes


    ▶ https://github.com/intel/intel-device-plugins-for-kubernetes


    ▶ https://docs.google.com/document/d/
    1
    BNWqgx_SmZDi-
    va_V
    3 1
    v
    3
    DnuVwYnF
    2
    EmN
    7
    D-O_fB
    6
    Oo/edit#heading=h.bxuci
    8
    gx
    6
    hna


    ▶ https://drive.google.com/
    fi
    le/d/
    1
    iLg
    2
    FEAEilb
    1
    dcI
    2 7
    TnB
    1 9
    VYtbcvgKhS/view


    ▶ https://developer.nvidia.com/blog/nvidia-gpu-operator-simplifying-gpu-
    management-in-kubernetes/


    ▶ https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/
    overview.html


    ▶ https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/
    cdi.html


    ▶ https://intel.github.io/intel-device-plugins-for-kubernetes/README.html


    ▶ https://github.com/NVIDIA/k
    8
    s-device-plugin


    ▶ https://blogs.nvidia.com/blog/multi-instance-gpus/


    ▶ https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/


    ▶ https://groups.google.com/a/kubernetes.io/g/dev/c/BDtCFfXQbw
    0
    ?pli=
    1

    ▶ https://kubernetes.slack.com/archives/C
    0 3 2
    ZE
    6 6
    A
    2
    X/p
    1 7 0 0 2 1 5 1 9 0 4 2 9 6 8 9

    ▶ https://kubernetes.slack.com/archives/C
    0 3 2
    ZE
    6 6
    A
    2
    X/p
    1 7 0 0 2 1 5 1 9 0 4 2 9 6 8 9

    View full-size slide

  35. 画像引⽤元
    ▶ https://github.com/kubernetes/community/tree/master/icons


    ▶ https://github.com/kubernetes/kubernetes/tree/master/logo


    ▶ https://github.com/cncf/artwork/tree/master/projects/kubernetes


    ▶ https://github.com/kubernetes/kubeadm/tree/main/logos

    View full-size slide

  36. Thanks / Question?
    ▶ @bells
    1 7

    ▶ Slide: https://speakerdeck.com/bells
    1 7

    ▶ @bells
    1 7
    _

    View full-size slide