Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

@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 ランタイムを切り替えることができる

Slide 7

Slide 7 text

@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

Slide 8

Slide 8 text

@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 経由で設定される

Slide 9

Slide 9 text

@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 ランタイムでコンテナを起動する

Slide 10

Slide 10 text

@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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

@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"

Slide 27

Slide 27 text

@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 で指定する際に使われます

Slide 28

Slide 28 text

@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

Slide 29

Slide 29 text

@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 を使っている 環境が混ざっている場合とかのためにこの特別な処理を実装しているのかも しれません

Slide 30

Slide 30 text

@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 を有効にする必要があります

Slide 31

Slide 31 text

@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 が書かれていた場合はマージされて処理され ます

Slide 32

Slide 32 text

@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 が必要になる場合もあります

Slide 33

Slide 33 text

@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 を指定します

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

@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 からは使えない 😨

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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 になってますので積極的に使ってい きましょう! まとめだよ

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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