Slide 1

Slide 1 text

∫∫∫∫∫∫∫ Presented by @makocchi Container Runtime Meetup #3 導入セッション : CRI についておさらいしよう

Slide 2

Slide 2 text

2 Makoto Hasegawa Working at // AI Division, 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

CNBF #3 | @makocchi 3 さて始まる前に・・ 本日のスライド内で出てくる “コンテナランタイム”は いわゆる⏫上位(ハイレベル/高レベル)のCRIランタイムを 指していると思ってください

Slide 4

Slide 4 text

CNBF #3 | @makocchi 4 本日のゴール CRI について知ろう! CRI って名前は聞いたことあるけど・・ 実はよくわかってない そんなアナタのお悩みを解決します(多分)

Slide 5

Slide 5 text

Container Runtime Meetup #3 | @makocchi 5 CRI とは

Slide 6

Slide 6 text

Container Runtime Meetup #3 | @makocchi 6 CRI = C?? R?? I?? CRI はある文字の頭文字を取ったもので表されています

Slide 7

Slide 7 text

Container Runtime Meetup #3 | @makocchi 7 CRI = C?? R?? I?? https://ja.wikipedia.org/wiki/CRI

Slide 8

Slide 8 text

Container Runtime Meetup #3 | @makocchi 8 CRI = C?? R?? I?? https://ja.wikipedia.org/wiki/CRI 残念ながら今日はこれらの話ではありません

Slide 9

Slide 9 text

Container Runtime Meetup #3 | @makocchi 9 CRI = Container Runtime Interface もちろん正解はこちら

Slide 10

Slide 10 text

Container Runtime Meetup #3 | @makocchi 10 CRI = C?? R?? I?? https://en.wikipedia.org/wiki/CRI ちなみに英語の Wikipedia にも載ってなかった

Slide 11

Slide 11 text

@makocchi Container Runtime Meetup #3 11 CRIとは? 本家の README から拝借するとこのように説明されています 「CRI is a plugin interface which enables kubelet to use a wide variety of container runtimes, without the need to recompile.」 要するに CRI とは、”kubelet が様々なコンテナランタイム達を(kubelet 自身を)再コンパイルすることなく使 えるようにする為のプラグインインターフェイス” ということになります。 プラグイン形式というのがここでは重要なポイントで、CRI という共通インターフェイスを使うことで kubelet は使用するコンテナランタイムを自由に入れ替えることができるというわけです。 https://github.com/kubernetes/cri-api

Slide 12

Slide 12 text

@makocchi Container Runtime Meetup #3 12 CRI が無い世界 CRI が有る世界 CRIとは?

Slide 13

Slide 13 text

@makocchi Container Runtime Meetup #3 13 kubelet CRI Container Runtime A Container Runtime B Container Runtime C Container Runtime A Container Runtime B Container Runtime C kubelet kubelet 側の仕様を 変更無しに 入れ替えが可能 kubelet 側でランタイム毎に 対応をしておかないと 入れ替えることができない (ランタイム側の仕様変更に追随しないとい けない) CRI が無い世界 CRI が有る世界 CRIとは? ※コンテナランタイム側は CRI に対応している必要がある

Slide 14

Slide 14 text

@makocchi Container Runtime Meetup #3 14 CRIとは? kubelet とコンテナランタイムの間でのやりとりに共通の仕様(CRI)があれば、kubelet 側もコンテナラン タイム側もその仕様を守るだけでよい = メンテナンスコストの低減に繋がる CRI を使わない場合は kubelet の内部でコンテナランタイム毎にそれ専用の処理を実装しなければならな くなります 例えば新しいコンテナランタイムが登場した場合、そのコンテナランタイムが CRI に準拠していれば kubelet 側に手を入れずに入れ替えることが可能になります。 もし CRI という概念が無かった場合は、kubelet が新しいコンテナランタイムに対応するためには kubelet 自身を変更(再コンパイル)して組み込む必要が出てくるでしょう。

Slide 15

Slide 15 text

Container Runtime Meetup #3 | @makocchi 15 CRI の歴史を振り返ってみよう

Slide 16

Slide 16 text

@makocchi Container Runtime Meetup #3 16 CRIの歴史 誕生 対応しているコンテナランタイムは Docker のみ

Slide 17

Slide 17 text

@makocchi Container Runtime Meetup #3 17 CRIの歴史 誕生 第2のコンテナランタイムとして rkt が実装される(rktnetes) v1.3

Slide 18

Slide 18 text

@makocchi Container Runtime Meetup #3 18 CRIの歴史 誕生 v1.3 Docker 対応と rkt 対応で kubelet の内部的には 非常に複雑な処理を実装せざるを得なくなっていた為、 Google / CoreOS / Hyper.sh の人たちで もっとシンプルに使えるようにする為の仕様を提案 ※ design-proposal はこちら

Slide 19

Slide 19 text

@makocchi Container Runtime Meetup #3 19 CRIの歴史 誕生 CRI の概念が導入される でも Docker 側は CRI に対応していないので dockershim を実装してやりとりするようになった v1.3 v1.5

Slide 20

Slide 20 text

@makocchi Container Runtime Meetup #3 20 CRIの歴史 - 余談1 - 誕生 CRI の概念が導入される でも Docker 側は CRI に対応していないので dockershim を実装してやりとりするようになった v1.3 v1.5 ちょっと話はそれますが、v1.5 の時に 「Supporting Production Workloads」として Kubernetes がリリースされました いわゆる Production Ready!!

Slide 21

Slide 21 text

@makocchi Container Runtime Meetup #3 21 CRIの歴史 誕生 その後 Frakti や cri-o 等の CRI 対応された コンテナランタイムが次々と誕生 v1.3 v1.5

Slide 22

Slide 22 text

@makocchi Container Runtime Meetup #3 22 CRIの歴史 - 余談2 - 誕生 その後 Frakti や cri-o 等の CRI 対応された コンテナランタイムが次々と誕生 v1.3 v1.5 またまた話はそれますが、 cri-o はもともとは OCID という名前でした CRI 対応をさせて後の cri-o になりました

Slide 23

Slide 23 text

@makocchi Container Runtime Meetup #3 23 CRIの歴史 - 余談3 - 誕生 その後 Frakti や cri-o 等の CRI 対応された コンテナランタイムが次々と誕生 v1.3 v1.5 またまたまた話はそれますが、 Frakti で使われる runV と Intel が開発していた Clear Containers の 技術が合わさって kata containers が生まれました

Slide 24

Slide 24 text

@makocchi Container Runtime Meetup #3 24 CRIの歴史 誕生 rktnetes が deprecated 代わりに CRI 対応された rktlet に移行しろとアナウンス でも rktlet 自体もうあまりメンテされてなかった v1.3 v1.5 v1.10

Slide 25

Slide 25 text

@makocchi Container Runtime Meetup #3 25 CRIの歴史 誕生 dockershim もとうとう deprecated と同時に cri-dockerd のプロジェクトも始まる v1.3 v1.5 v1.10 v1.20 いまココ!

Slide 26

Slide 26 text

@makocchi Container Runtime Meetup #3 26 CRIの歴史 誕生 dockershim がコードから 削除される(予定) ※ Dockershim Deprecation FAQ v1.3 v1.5 v1.10 v1.20 v1.23 いまココ!

Slide 27

Slide 27 text

27 CRI の Spec はどうなっているのか

Slide 28

Slide 28 text

@makocchi Container Runtime Meetup #3 28 CRI の Spec どんな rpc を実装すれば CRI になるのか?を知るにはどうしたらいいかというと・・ 実際の定義を見るのが一番分かり易いと思います 歴史的にいろいろコードの場所が変わっていますが、今は kubernets/cri-api を見るのがいいでしょう v1.4 時代 : https://github.com/kubernetes/kubernetes/tree/v1.4.0/pkg/kubelet/api/v1alpha1/runtime v1.7 時代 : https://github.com/kubernetes/kubernetes/tree/v1.7.0/pkg/kubelet/apis/cri/v1alpha1/runtime v1.10 時代 : https://github.com/kubernetes/kubernetes/tree/v1.10.0/pkg/kubelet/apis/cri/runtime/v1alpha2 v1.14 時代 : https://github.com/kubernetes/cri-api/tree/master/pkg/apis/runtime/v1alpha2 (v1もある) Design-proposal も補足として https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/container-runtime-interface-v1.md

Slide 29

Slide 29 text

@makocchi Container Runtime Meetup #3 29 api.proto の中身を見ることでどういう rpc 実装すればいいか分かります ImageService と RuntimeService の 2 つの grpc service が定義されています 例えば RuntimeService では “RunPodSandbox” や “CreateContainer” 等の rpc が、ImageService では “ListImages” や “PullImage” 等の rpc が定義されています ちなみに kubernets/cri-api 内の v1/api.proto と v1alpha2/api.proto の diff を見てみましたが、現時点で はコメントくらいしか差分がありませんでした・・ CRI の Spec

Slide 30

Slide 30 text

30 本日のまとめ

Slide 31

Slide 31 text

CNBF #3 | @makocchi 31 CRI とは kubelet とコンテナランタイムのやりとりを共通化したプラグインイン ターフェイス CRI の概念があるので kubelet 自体に手を入れずに自由にコンテナランタイムを 入れ替えることが可能になりました 正直言うと Kubernetes を利用するアプリケーション開発者の皆様は CRI につい て特に気にする必要はありません。実際にどのコンテナランタイムで動いてい るか意識する必要はあまりないと思いますので。(セキュリティ要件によっては 気にしないといけないケースもあるかもしれません) 一方で Kubernetes のクラスター管理者の皆様は CRI については多少知っておい たほうがいいかもしれません。クラスター管理者としてどのコンテナランタイ ムを利用者に提供すべきなのかを検討する際に、そのコンテナランタイムが CRI 対応されているか確認する必要があります。 CRI を理解すると独自コンテナランタイム作れるはず! まとめだよ

Slide 32

Slide 32 text

CNBF #3 | @makocchi 32 達成できましたでしょうか? おぼえてね 本日のゴール CRI について知ろう!

Slide 33

Slide 33 text

CNBF #3 | @makocchi 33 参考情報 過去に発表したランタイムまわりの発表資料です (ちょっと情報が古くなってしまいますが・・) 「Docker だけじゃないコンテナ runtime 徹底比較」 「runc だけじゃないコンテナ low level runtime 徹底比較」 ランタイムに興味が出てきた人!ぜひ Meetup で発表お願いします!

Slide 34

Slide 34 text

∫∫∫∫∫∫∫ Presented by @makocchi Container Runtime Meetup #3 導入セッション : CRI についておさらいしよう FINISH ご清聴ありがとうございました!! 導入セッション : CRI についておさらいしよう All images in this presentation are picked from pixabay.com