$30 off During Our Annual Pro Sale. View Details »

Kubernetes の Runtime Class について知ろう

makocchi
March 11, 2021

Kubernetes の Runtime Class について知ろう

CloudNative Days Spring 2021 ONLINE の発表資料です
「Kubernetes の Runtime Class について知ろう」

makocchi

March 11, 2021
Tweet

More Decks by makocchi

Other Decks in Technology

Transcript

  1. Presented by @makocchi
    Kubernetes の Runtime Class について知ろう

    View Slide

  2. 2
    Makoto Hasegawa
    Working at // CIU, CyberAgent, Inc
    Currently //
    Develop and maintain private OpenStack cloud.
    Develop and maintain Kubernetes as a Service platform.
    CKA / CKAD / CKS
    Job Title // Technical Lead Infrastructure Engineer
    WHO am I
    Twitter // @makocchi
    Facebook // makocchi0923
    Hobby // Playing bass

    View Slide

  3. Let’s learn about Kubernetes Runtime Class | @makocchi 3
    💪 本日のゴール💪
    Runtime Class について知ろう!
    Kubernetes には Runtime Class という概念があります
    便利な機能ですので是非覚えましょう💪

    View Slide

  4. Let’s learn about Kubernetes Runtime Class | @makocchi 4
    Runtime Class とは
    Runtime Class って?

    View Slide

  5. @makocchi
    CloudNative Days 2021 Spring 5
    Runtime Classとは?
    Kubernetes では様々なコンテナのランタイムを利用することが可能です
    ここで言う「コンテナのランタイム」とは 2 つのランタイムが含まれており、「CRIランタイム」と「OCIランタイム」
    のことを指しています (別名「高レベルランタイム」「低レベルランタイム」とも言われます)
    Runtime Class はその内の「OCIランタイム」をコンテナ利用者側が自由に選択できるようにするための概念です
    CRI OCI ってなんだろう?という方はこちらの資料を合わせて御覧ください 📝
    👉「CRIについておさらいしよう」
    👉「runc だけじゃないコンテナ low level runtime 徹底比較」
    👉「Docker だけじゃないコンテナ runtime 徹底比較」

    View Slide

  6. @makocchi
    CloudNative Days 2021 Spring 6
    kubelet CRI CRI Container Runtime
    OCI Container Runtime A
    ※Runtime Class のイメージ図
    Runtime Classとは?
    OCI Container Runtime B
    OCI Container Runtime C
    Pod 起動時に Runtime Class を指定することで
    OCI ランタイムを切り替えることができる

    View Slide

  7. @makocchi
    CloudNative Days 2021 Spring 7
    kubelet CRI CRI Container Runtime
    OCI Container Runtime A
    ※Runtime Class のイメージ図
    Runtime Classとは?
    OCI Container Runtime B
    OCI Container Runtime C

    View Slide

  8. @makocchi
    CloudNative Days 2021 Spring 8
    kubelet CRI CRI Container Runtime
    OCI Container Runtime A
    ※Runtime Class のイメージ図
    Runtime Classとは?
    OCI Container Runtime B
    OCI Container Runtime C
    Runtime Class で設定された “myclass” の定義に従って
    Runtime handler が CRI 経由で設定される

    View Slide

  9. @makocchi
    CloudNative Days 2021 Spring 9
    kubelet CRI CRI Container Runtime
    OCI Container Runtime A
    ※Runtime Class のイメージ図
    Runtime Classとは?
    OCI Container Runtime B
    OCI Container Runtime C
    Runtime Class で設定された “myclass” の定義に従って
    Runtime handler が CRI 経由で設定される
    Runtime handler の設定に従い
    OCI ランタイムでコンテナを起動する

    View Slide

  10. @makocchi
    CloudNative Days 2021 Spring 10
    kubelet CRI CRI Container Runtime
    OCI Container Runtime A
    ※Runtime Class のイメージ図
    Runtime Classとは?
    OCI Container Runtime B
    OCI Container Runtime C
    Runtime Class で設定された “myclass” の定義に従って
    Runtime handler が CRI 経由で設定される
    Runtime handler の設定に従い
    OCI ランタイムでコンテナを起動する
    myclass_handler

    View Slide

  11. Let’s learn about Kubernetes Runtime Class | @makocchi 11
    ここでちょっと
    コンテナランタイムについておさらい
    OCI?
    CRI?

    View Slide

  12. Let’s learn about Kubernetes Runtime Class | @makocchi 12
    まずは CRI ランタイム
    (上位ランタイム)
    OCI?
    CRI?

    View Slide

  13. @makocchi
    CloudNative Days 2021 Spring 13
    CRI ランタイム

    View Slide

  14. @makocchi
    CloudNative Days 2021 Spring 14
    CRI ランタイム
    もともとは Docker の内部のランタイムとして動いていたものが OSS と
    して切り出されました
    様々な処理がプラグイン化されており、拡張性が非常に高い
    CNCF プロジェクトであり、2019 年に ”Guraduated” になっています
    https://github.com/containerd/containerd

    View Slide

  15. @makocchi
    CloudNative Days 2021 Spring 15
    CRI ランタイム
    Red Hat社が中心となって開発している OSS のコンテナランタイム
    CRI を処理することに特化されているため、より軽量に動作します
    言ってしまえば Kubernetes に特化されたコンテナランタイムと言える
    でしょう
    こちらも CNCF プロジェクトで “incubating” です
    cri-o
    https://github.com/cri-o/cri-o

    View Slide

  16. @makocchi
    CloudNative Days 2021 Spring 16
    CRI ランタイム
    あれ? Docker は・・・?

    View Slide

  17. @makocchi
    CloudNative Days 2021 Spring 17
    CRI ランタイム?
    実は Docker は CRI に対応していないので CRI ランタイムではない
    そのため、実は Kubernetes + Docker の環境では Runtime Class を使うこと
    はできません
    しかし,最近では cri-dockerd というプロジェクトも始まったので Docker で
    も Runtime Class を使うことができるようになるでしょう
    (でも裏技で Runtime Class に “docker” と書くと Docker を動かすことが可能)

    View Slide

  18. @makocchi
    CloudNative Days 2021 Spring 18
    CRI ランタイム
    (´ʀωʀʆ)

    View Slide

  19. Let’s learn about Kubernetes Runtime Class | @makocchi 19
    次は OCI ランタイム
    (下位ランタイム)
    OCI?
    CRI?

    View Slide

  20. @makocchi
    CloudNative Days 2021 Spring 20
    OCI ランタイム
    ※ 実は他にもたくさんあるのですが代表的なものだけ・・

    View Slide

  21. @makocchi
    CloudNative Days 2021 Spring 21
    OCI ランタイム
    コンテナを使ったことがある人はほぼ 100% 使ったことがあるデファク
    トの OCI ランタイム
    runc とは違い、コンテナ専用のマイクロ vm を起動し内部でアプリケー
    ションを実行する
    go で作られた sentry というプログラムが kernel となりアプリケーショ
    ンからのシステムコールを処理する

    View Slide

  22. @makocchi
    CloudNative Days 2021 Spring 22
    OCI ランタイムと Runtime Class
    つまり
    先程の様々な OCI ランタイム(runc や kata や gvisor 等)を Pod 起動時に自由に選択できるようにするもの
    それが
    Runtime Class
    というわけです

    View Slide

  23. Let’s learn about Kubernetes Runtime Class | @makocchi 23
    Runtime Class の設定の仕方

    View Slide

  24. @makocchi
    CloudNative Days 2021 Spring 24
    Runtime Classを設定する
    Kubernetes の Admission Controller で RuntimeClass を有効にする
    Kubernetes で Runtime Class を定義する
    CRI ランタイム側で OCI ランタイムの設定をする
    Runtime Class を使えるようにするためには以下の設定が必要になります
    それぞれ見ていきましょう

    View Slide

  25. @makocchi
    CloudNative Days 2021 Spring 25
    Admission Controller で RuntimeClass を有効にする
    最近の Kubernetes であればデフォルトで有効になっています
    明示的に有効/無効する際には kube-apiserver で下記のオプションを渡します
    kube-apiserver --enable-admission-plugins=RuntimeClass …
    kube-apiserver --disable-admission-plugins=RuntimeClass …

    View Slide

  26. @makocchi
    CloudNative Days 2021 Spring 26
    Kubernetes で Runtime Class を定義する
    Runtime Class を設定するには下記のように “kind: RuntimeClass” を定義します
    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
    name: myruntime
    handler: myhandler
    overhead:
    podFixed:
    memory: "100Mi"
    cpu: "200m"

    View Slide

  27. @makocchi
    CloudNative Days 2021 Spring 27
    Kubernetes で Runtime Class を定義する
    Runtime Class を設定するには下記のように “kind: RuntimeClass” を定義します
    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
    name: myruntime
    handler: myhandler
    overhead:
    podFixed:
    memory: "100Mi"
    cpu: "200m"
    metadata.name は RuntimeClass 自体の定義の識別子です
    Pod の定義の spec.runtimeClassName で指定する際に使われます

    View Slide

  28. @makocchi
    CloudNative Days 2021 Spring 28
    Kubernetes で Runtime Class を定義する
    Runtime Class を設定するには下記のように “kind: RuntimeClass” を定義します
    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
    name: myruntime
    handler: myhandler
    overhead:
    podFixed:
    memory: "100Mi"
    cpu: "200m"
    hadler は CRI ランタイムで Pod を起動する時に渡される文字列になります
    つまり CRI ランタイム側の設定を合わせておかないといけません
    https://github.com/kubernetes/cri-api/blob/master/pkg/apis/runtime/v1alpha2/api.proto

    View Slide

  29. @makocchi
    CloudNative Days 2021 Spring 29
    Kubernetes で Runtime Class を定義する
    Runtime Class を設定するには下記のように “kind: RuntimeClass” を定義します
    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
    name: myruntime
    handler: docker
    overhead:
    podFixed:
    memory: "100Mi"
    cpu: "200m"
    ちなみに handler に docker と書くと docker で Pod を作成しようとしてく
    れます
    厳密には RuntimeClass の機能とは言えないんですが、Docker を使っている
    環境が混ざっている場合とかのためにこの特別な処理を実装しているのかも
    しれません

    View Slide

  30. @makocchi
    CloudNative Days 2021 Spring 30
    Kubernetes で Runtime Class を定義する
    Runtime Class を設定するには下記のように “kind: RuntimeClass” を定義します
    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
    name: myruntime
    handler: myhandler
    overhead:
    podFixed:
    memory: "100Mi"
    cpu: "200m"
    overhead は Pod を起動する際に OCI ランタイム側のリソース分もリクエスト
    できるようにするためのものです(optional)
    最近では kata のようにマイクロ vm を起動するような OCI ランタイムも出て
    きたため、それまであまり気にすることが無かった OCI ランタイム自体の
    オーバーヘッドも考慮しなければならなくなったことから生まれたようです
    ※ PodOverhead の Feature Gates を有効にする必要があります

    View Slide

  31. @makocchi
    CloudNative Days 2021 Spring 31
    Kubernetes で Runtime Class を定義する
    Runtime Class を設定するには下記のように “kind: RuntimeClass” を定義します
    kind: RuntimeClass
    apiVersion: node.k8s.io/v1
    metadata:
    name: myruntime
    handler: myhandler
    scheduling:
    nodeSelector:
    key: value
    tolerations:
    - effect: Noschedule

    もう一つ optional で scheduling を記述することが可能です
    この Runtime Class が使用された場合にどこのノードで起動するべきなのか、
    nodeSelector で指定しておく事が可能です (tolerations も書ける)
    Pod の Spec にも nodeSelector が書かれていた場合はマージされて処理され
    ます

    View Slide

  32. @makocchi
    CloudNative Days 2021 Spring 32
    CRI ランタイム側の設定
    containerd の設定ファイル config.toml に下記のように設定します(例)
    [plugins]
    [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".containerd]
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.${handler}]
    runtime_type = "io.containerd.${handler}.${shim_version}"
    ${handler} には実際に動かす OCI ランタイムを記述します
    (gVisor なら runsc、kata なら kata)
    ${shim_version} は v1 か v2 が入ります
    ※ 実際には別途 shim の install が必要になる場合もあります

    View Slide

  33. @makocchi
    CloudNative Days 2021 Spring 33
    CRI ランタイム側の設定
    cri-o の設定ファイル crio.conf に下記のように設定します(例)
    [crio]
    [crio.runtime]
    [crio.runtime.runtimes.${handler}]
    runtime_path = “${path_to_handler}”
    ${handler} には名前の識別子を入れます
    ${path_to_handler} は OCI ランタイムの PATH を指定します

    View Slide

  34. @makocchi
    CloudNative Days 2021 Spring 34
    Runtime Classを設定する
    Kubernetes の Admission Controller で RuntimeClass を有効にする
    Kubernetes で Runtime Class を定義する
    CRI ランタイム側で OCI ランタイムの設定をする
    さぁこれで Runtime Class が使えるようになりました!👏👏👏

    View Slide

  35. Let’s learn about Kubernetes Runtime Class | @makocchi 35
    Docker でも OCI ランタイムを
    切り替えられるようにしたい!

    View Slide

  36. @makocchi
    CloudNative Days 2021 Spring 36
    Docker でも OCI ランタイムを切り替える
    もちろん Docker にも OCI ランタイムを切り替える機能があります
    daemon.json で runtimes を設定すれば OK です
    {
    "runtimes": {
    "runc": {
    "path": "/usr/bin/runc"
    },
    "myhandler":{
    "path": "/usr/local/bin/myhandler"
    }
    }
    }
    あとは docker run する時に 「--runtime=myhandler」と渡せば OK です
    でも Runtime Class からは使えない 😨

    View Slide

  37. Let’s learn about Kubernetes Runtime Class | @makocchi 37
    本日のまとめ

    View Slide

  38. Let’s learn about Kubernetes Runtime Class | @makocchi 38
    Runtime Class とは CRI ランタイムが Pod を起動する際に OCI ランタイムを自
    由に選択できるようにするもの
    Runtime Class を使うためには Kubernetes 側の設定と CRI ランタイム側の設定
    両方必要になる
    残念ながら Kubernetes と Docker の組み合わせでは Runtime Class を使うこと
    ができないが Docker 単体であれば OCI ランタイムを自由に選択してコンテナを
    起動することが可能
    Runtime Class を使う際には Pod のオーバーヘッドも考慮した設計を
    Kubernetes v1.20 で RuntimeClass は GA になってますので積極的に使ってい
    きましょう!
    まとめだよ

    View Slide

  39. Let’s learn about Kubernetes Runtime Class | @makocchi 39
    達成できましたでしょうか?
    おぼえてね
    💪 本日のゴール💪
    Runtime Class について知ろう!

    View Slide

  40. Presented by @makocchi
    Kubernetes の Runtime Classについて知ろう
    FINISH
    ご清聴ありがとうございました!!
    Kubernetes の Runtime Class について知ろう
    All images in this presentation are picked from pixabay.com

    View Slide