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

CRI についておさらいしよう

makocchi
January 28, 2021

CRI についておさらいしよう

runtime meetup #3 での発表資料です
「CRI についておさらいしよう」

makocchi

January 28, 2021
Tweet

More Decks by makocchi

Other Decks in Technology

Transcript

  1. 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
  2. CNBF #3 | @makocchi 4 本日のゴール CRI について知ろう! CRI って名前は聞いたことあるけど・・

    実はよくわかってない そんなアナタのお悩みを解決します(多分)
  3. Container Runtime Meetup #3 | @makocchi 6 CRI = C??

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

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

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

    Runtime Interface もちろん正解はこちら
  7. Container Runtime Meetup #3 | @makocchi 10 CRI = C??

    R?? I?? https://en.wikipedia.org/wiki/CRI ちなみに英語の Wikipedia にも載ってなかった
  8. @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
  9. @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 に対応している必要がある
  10. @makocchi Container Runtime Meetup #3 14 CRIとは? kubelet とコンテナランタイムの間でのやりとりに共通の仕様(CRI)があれば、kubelet 側もコンテナラン

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

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

    でも Docker 側は CRI に対応していないので dockershim を実装してやりとりするようになった v1.3 v1.5
  13. @makocchi Container Runtime Meetup #3 20 CRIの歴史 - 余談1 -

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

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

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

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

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

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

    削除される(予定) ※ Dockershim Deprecation FAQ v1.3 v1.5 v1.10 v1.20 v1.23 いまココ!
  20. @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
  21. @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
  22. CNBF #3 | @makocchi 31 CRI とは kubelet とコンテナランタイムのやりとりを共通化したプラグインイン ターフェイス

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

    runtime 徹底比較」 「runc だけじゃないコンテナ low level runtime 徹底比較」 ランタイムに興味が出てきた人!ぜひ Meetup で発表お願いします!
  24. ∫∫∫∫∫∫∫ Presented by @makocchi Container Runtime Meetup #3 導入セッション :

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