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. ∫∫∫∫∫∫∫
    Presented by @makocchi
    Container Runtime Meetup #3
    導入セッション : CRI についておさらいしよう

    View Slide

  2. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. @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

    View Slide

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

    View Slide

  13. @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 に対応している必要がある

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. @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

    View Slide

  29. @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

    View Slide

  30. 30
    本日のまとめ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide