$30 off During Our Annual Pro Sale. View Details »

CSI入門/Introduction to CSI

bells17
October 27, 2020

CSI入門/Introduction to CSI

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

bells17

October 27, 2020
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

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

    + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発の調査・研究 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ @bells17_
  2. 注意点 ▶ 内容としてはKubernetes Meetup Tokyo #25で発表した”Kubernetesに おけるCSI”をベースとしたものになります ▶ そのためKubernetes v1.17ベースでのお話になります

    + CSIの仕様はv1.12だった気がします ▶ 最新(v1.19あたり)の事情はまだキャッチアップできていないです + ので現状との齟齬がある可能性があります
  3. CSI ▶ KubernetesやMesos、Cloud Foundryなどコンテナオーケストレーター (CO)でストレージを利⽤するための共通の仕様を定義したもの + なのでKubernetes⽤の仕様、というわけでない + 例えばHashicorp NomadなどはすでにCSIを利⽤している

    ▶ ストレージプロバイダは⼀度CSIに対応したドライバーを書いておくだけ で、Kubernetesでもその他のCOでも利⽤できるものを⽬指している ▶ CSIの仕様はGithubのcontainer-storage-interface/specリポジトリにある spec.mdファイルで定義されている
  4. Controller Plugin ▶ CSI Driverのcontrol plane として動くgRPCサーバー ▶ 以下のgRPCのサービスを実装したもの +

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

    + Identity Service ▶ ボリュームを対象Worker Nodeで利⽤するための機能を提供する ▶ 主に以下の機能を提供する + ノードにアタッチされたボリュームのフォーマット + ボリュームのマウント/アンマウント
  6. Kubernetesのボリュームプラグインには 以下の3つがある ▶ In-Tree Volume ▶ Kubernetesのコード内部に実装されているボリュームプラグイン ▶ ConfigMap/Secret/EmptyDirなどはここに該当 ▶

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

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