CSI入門/Introduction to CSI

3499a1d71fa70b8ee44816ca9e7329fe?s=47 bells17
October 27, 2020

CSI入門/Introduction to CSI

Kubernetes Novice Tokyo #6 で発表を行った"CSI入門"の資料です。
配信URLは https://www.youtube.com/watch?v=abAxPs5O5K4 になります。

3499a1d71fa70b8ee44816ca9e7329fe?s=128

bells17

October 27, 2020
Tweet

Transcript

  1. CSI⼊⾨ Kubernetes Novice Tokyo(2020/10/27) @bells17

  2. ▶ Daiki Hayakawa / @bells17 ▶ Software Enginner ▶ 普段やってること:

    + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発の調査・研究 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ @bells17_
  3. 今⽇話すこと ▶ CSIについて ▶ KubernetesにおけるCSIの利⽤ ▶ KubernetesとCSI Driver連携の裏側

  4. 注意点 ▶ 内容としてはKubernetes Meetup Tokyo #25で発表した”Kubernetesに おけるCSI”をベースとしたものになります ▶ そのためKubernetes v1.17ベースでのお話になります

    + CSIの仕様はv1.12だった気がします ▶ 最新(v1.19あたり)の事情はまだキャッチアップできていないです + ので現状との齟齬がある可能性があります
  5. アジェンダ 1. CSIとは? 2. Kubernetesとボリュームプラグイン 3. KubernetesとCSI Driverとの連携 4. KubeletのPluginWatcherとCSI

    Plugin 5. ボリューム作成 ~ マウントまでのフローについて
  6. CSIとは?

  7. CSI ▶ KubernetesやMesos、Cloud Foundryなどコンテナオーケストレーター (CO)でストレージを利⽤するための共通の仕様を定義したもの + なのでKubernetes⽤の仕様、というわけでない + 例えばHashicorp NomadなどはすでにCSIを利⽤している

    ▶ ストレージプロバイダは⼀度CSIに対応したドライバーを書いておくだけ で、Kubernetesでもその他のCOでも利⽤できるものを⽬指している ▶ CSIの仕様はGithubのcontainer-storage-interface/specリポジトリにある spec.mdファイルで定義されている
  8. CSI Driverがあれば様々なCOで対象のストレージを扱うことができる

  9. CSIで定義されている仕様 ▶ CSI Driverの通信⽅法・提供⽅法について ▶ CSI Driverが提供する機能について ▶ COがCSI Driverを利⽤するためのgRPCのProtocol

    Buffers
  10. CSI Driverの通信⽅法・提供⽅法について ▶ コンテナイメージ形式(Docker, OCIなど)で提供する必要あり ▶ CSI DriverとCO間の通信は + UNIXドメインソケットを介して

    + gRPCプロトコルを利⽤する必要がある
  11. CSIが提供する機能 ▶ ボリュームの作成/削除 ▶ ノードへのボリュームのアタッチ/デタッチ ▶ ボリュームのマウント/アンマウント ▶ ボリュームのスナップショットの作成/削除 ▶

    etc...
  12. Protocol Buffersで定義されているgRPCの インターフェイス ▶ Controller Plugin ▶ Node Plugin

  13. Controller Plugin ▶ CSI Driverのcontrol plane として動くgRPCサーバー ▶ 以下のgRPCのサービスを実装したもの +

    Controller Service + Identity Service ▶ ボリュームやスナップショット⾃体をコントロールする機能を提供する ▶ 具体的には以下のような機能を提供する + ボリュームの作成/削除 + ノードへのボリュームのアタッチ/デタッチ + ボリュームのスナップショットの作成/削除
  14. Node Plugin ▶ COに参加している各Worker Nodeで動くgRPCサーバー ▶ 以下のgRPCのサービスを実装したもの + Node Service

    + Identity Service ▶ ボリュームを対象Worker Nodeで利⽤するための機能を提供する ▶ 主に以下の機能を提供する + ノードにアタッチされたボリュームのフォーマット + ボリュームのマウント/アンマウント
  15. None
  16. ボリュームライフサイクル

  17. CSIまとめ ▶ CSIとはストレージプロバイダがボリュームプラグインをCOに提供する ために定義された共通の仕様 ▶ 具体的には以下のようなものを定義している + CSI Driverの動作環境や通信⽅法の定義 +

    コンテナイメージ形式 + UNIXドメインソケット/gRCPプロトコル + RPCインターフェイスの定義 + Controller Plugin + Node Plugin
  18. Kubernetesとボリュームプラグイン

  19. Kubernetesのボリュームプラグインには 以下の3つがある ▶ In-Tree Volume ▶ Kubernetesのコード内部に実装されているボリュームプラグイン ▶ ConfigMap/Secret/EmptyDirなどはここに該当 ▶

    FlexVolume ▶ CSI登場前に作成されたプラグイン(v1.8) ▶ Kubernetesの内部実装に関する知識が必要ということで、あまり使われてはない模様 ▶ CSI Driver ▶ v1.9よりAlpha提供開始 ▶ KubernetesがCSI Driverと連携を⾏うサイドカーアプリケーションを提供してくれて いるため、Kubernetesの内部実装の知識を必要とせずにボリュームプラグインを提供 できる
  20. CSI Driver導⼊によるKubernetesのメリット ▶ 30を超えるIn-Tree Volumeプラグインを外部化することが可能になる + 実際に全てのIn-Tree Volumeプラグインを外部化するのかは不明 + 主要なものとしては各Cloud

    Provider向けのボリュームプラグインのCSI Driver移⾏ ▶ 外部化することで + 不要なコードをKubernetesのバイナリから除去できる + Kubernetes本体のコードの保守性が⾼まる + Kubernetesの各種バイナリサイズが減る + CSIの仕様に沿ったドライバーを作って配布するだけで、様々なストレージと Kubernetesが連携可能になる
  21. KubernetesとCSI Driverとの連携

  22. サイドカーアプリケーションによる連携 https://github.com/kubernetes/community/blob/d83cd53979d08ac0e0e33704c6aec6b1c3cb7c8d/contributors/design-proposals/storage/container-storage-interface_diagram1.png

  23. Controller Sidecar external-provisioner ボリュームの作成/削除を⾏う external-attacher ボリュームのアタッチ/デタッチを⾏う external-resizer ボリュームのリサイズを⾏う external-snapshotter スナップショットの作成/削除を⾏う

    livenessprobe Liveness Probe⽤HTTPプロキシ
  24. Node Sidecar node-driver-registrar KubeletにあるPlugin Watcherという機能を利⽤して CSIドライバをKubeletに登録する機能を提供する

  25. CSI Driverを利⽤するときにリリースする必要があるもの

  26. CSIDriver Object ▶ StorageClassよってに指定されるCSI Driverの種別を表すオブジェクト ▶ kubectl get CSIDriverコマンドでユーザーに利⽤可能なCSIドライバを⽰すために作成される ▶

    podInfoOnMount などCSIDriverの設定を⾏うことができるので、設定の変更が必要なCSI Driverの場合には作成する必要がある apiVersion: storage.k8s.io/v1beta1 kind: CSIDriver metadata: name: mycsidriver.example.com spec: attachRequired: true podInfoOnMount: true
  27. StorageClass Object ▶ PV(C)でボリュームを扱う際に指定されるStorageClassの種別を表すオブジェクト ▶ PVCが作成された時にボリュームのプロビジョニングを⾏うprovisionerを設定することで、PVC がプロビジョニングを⾏うボリュームプラグイン(CSIDriver Object)を指定することができる ▶ CSIの場合csi.storage.k8s.io/fstypeなどStorage

    Class単位でCSIドライバのデフォルトの設定を ⾏うことができる apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-csi-storage provisioner: mycsidriver.example.com parameters: csi.storage.k8s.io/fstype: ext4 csi.storage.k8s.io/provisioner-secret-name: mysecret csi.storage.k8s.io/provisioner-secret-namespace: mynamespace
  28. VolumeSnapshotClass Object ▶ VolumeSnapshotリソースを利⽤して、ボリュームのスナップショットを作成する際に 指定されるVolumeSnapshotClassの種別を表すオブジェクト ▶ snapshotterにはボリュームプラグイン名を指定する ▶ CSIドライバがボリュームのスナップショット機能をサポートしない場合には作成は不要 apiVersion:

    snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: my-csi-snapclass snapshotter: mycsidriver.example.com
  29. CSI Driverのデプロイ時に起こること

  30. CSINode Object ▶ ボリュームのアタッチ/デタッチやトポロジーに基づくPod作成先のノードの選定に利⽤される ▶ KubeletによってCSIドライバのNodeGetInfo RPCの情報から⾃動的に作成される ▶ Node Objectに追加するには情報量が多いのでCSI⽤の追加情報がCSINode

    Objectに 切り出された apiVersion: storage.k8s.io/v1beta1 kind: CSINode metadata: name: node1 spec: drivers: - name: mycsidriver.example.com nodeID: storageNodeID1 topologyKeys: - mycsidriver.example.com/regions - mycsidriver.example.com/zones
  31. KubeletのPluginWatcherとCSI Plugin

  32. Kubelet Plugin Watcher

  33. Kubelet ~ CSI Drier間の通信

  34. ボリューム作成 ~ マウントまでの フローについて

  35. ボリューム作成時の処理フロー

  36. Pod作成時のボリュームマウントまでのフロー

  37. まとめ

  38. まとめ ▶ CSIとは何か?Kubernetesは裏でどのようにCSI Driverと連携しているのか?について紹介 しました ▶ Kubernetesのボリューム処理の仕組みについて少しでも理解が深まれば幸いです

  39. 参考資料 ▶ Kubernetes Container Storage Interface (CSI) Documentation: https://kubernetes-csi.github.io/docs/ ▶

    CSI Volume Plugins in Kubernetes Design Doc: https://github.com/kubernetes/community/blob/master/contributors/design- proposals/storage/container-storage-interface.md ▶ Container Storage Interface (CSI) Spec: https://github.com/container-storage-interface/spec/blob/master/spec.md ▶ Container Storage Interface: Present and Future: https://www.youtube.com/watch?v=ktwY1anKN58 ▶ What Is The Container Storage Interface (CSI): https://speakerdeck.com/the_saad_ali/what-is-the-container-storage-interface- csi ▶ Introducing Container Storage Interface (CSI) Alpha for Kubernetes: https://kubernetes.io/blog/2018/01/introducing-container- storage-interface/ ▶ Plugin Watcher Utility - Model 2: Kubelet watches new plugins under a canonical path through inotify (Preferred one and current implementation): https://github.com/kubernetes/community/blob/d051d03b66c139d457f68dc10dab3db1367864bb/ contributors/design-proposals/node/plugin-watcher.md#model-2-kubelet-watches-new-plugins-under-a-canonical-path- through-inotify-preferred-one-and-current-implementation ▶ Kubernetes CSI Sidecar Applications: https://github.com/kubernetes-csi ▶ Attach/Detach Controller: https://github.com/kubernetes/kubernetes/blob/release-1.17/pkg/controller/volume/attachdetach/ attach_detach_controller.go
  40. Thanks / Question? ▶ Daiki Hayakawa, @bells17 ▶ Slide: https://speakerdeck.com/bells17

    ▶ @bells17_