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

lets_learn_about_kubernetes_runtime_class

D1b28ca276bee52e56ba11785f70d2d6?s=47 makocchi
March 11, 2021

 lets_learn_about_kubernetes_runtime_class

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

D1b28ca276bee52e56ba11785f70d2d6?s=128

makocchi

March 11, 2021
Tweet

Transcript

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

  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
  3. Let’s learn about Kubernetes Runtime Class | @makocchi 3 💪

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

    Class とは Runtime Class って?
  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 徹底比較」
  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 ランタイムを切り替えることができる
  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
  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 経由で設定される
  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 ランタイムでコンテナを起動する
  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
  11. Let’s learn about Kubernetes Runtime Class | @makocchi 11 ここでちょっと

    コンテナランタイムについておさらい OCI? CRI?
  12. Let’s learn about Kubernetes Runtime Class | @makocchi 12 まずは

    CRI ランタイム (上位ランタイム) OCI? CRI?
  13. @makocchi CloudNative Days 2021 Spring 13 CRI ランタイム

  14. @makocchi CloudNative Days 2021 Spring 14 CRI ランタイム もともとは Docker

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

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

    は・・・?
  17. @makocchi CloudNative Days 2021 Spring 17 CRI ランタイム? 実は Docker

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

  19. Let’s learn about Kubernetes Runtime Class | @makocchi 19 次は

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

  21. @makocchi CloudNative Days 2021 Spring 21 OCI ランタイム コンテナを使ったことがある人はほぼ 100%

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

    つまり 先程の様々な OCI ランタイム(runc や kata や gvisor 等)を Pod 起動時に自由に選択できるようにするもの それが Runtime Class というわけです
  23. Let’s learn about Kubernetes Runtime Class | @makocchi 23 Runtime

    Class の設定の仕方
  24. @makocchi CloudNative Days 2021 Spring 24 Runtime Classを設定する Kubernetes の

    Admission Controller で RuntimeClass を有効にする Kubernetes で Runtime Class を定義する CRI ランタイム側で OCI ランタイムの設定をする Runtime Class を使えるようにするためには以下の設定が必要になります それぞれ見ていきましょう
  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 …
  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"
  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 で指定する際に使われます
  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
  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 を使っている 環境が混ざっている場合とかのためにこの特別な処理を実装しているのかも しれません
  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 を有効にする必要があります
  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 が書かれていた場合はマージされて処理され ます
  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 が必要になる場合もあります
  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 を指定します
  34. @makocchi CloudNative Days 2021 Spring 34 Runtime Classを設定する Kubernetes の

    Admission Controller で RuntimeClass を有効にする Kubernetes で Runtime Class を定義する CRI ランタイム側で OCI ランタイムの設定をする さぁこれで Runtime Class が使えるようになりました!👏👏👏
  35. Let’s learn about Kubernetes Runtime Class | @makocchi 35 Docker

    でも OCI ランタイムを 切り替えられるようにしたい!
  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 からは使えない 😨
  37. Let’s learn about Kubernetes Runtime Class | @makocchi 37 本日のまとめ

  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 になってますので積極的に使ってい きましょう! まとめだよ
  39. Let’s learn about Kubernetes Runtime Class | @makocchi 39 達成できましたでしょうか?

    おぼえてね 💪 本日のゴール💪 Runtime Class について知ろう!
  40. Presented by @makocchi Kubernetes の Runtime Classについて知ろう FINISH ご清聴ありがとうございました!! Kubernetes

    の Runtime Class について知ろう All images in this presentation are picked from pixabay.com