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

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. CSI⼊⾨
    Kubernetes Novice Tokyo(2020/10/27)
    @bells17

    View Slide

  2. ▶ Daiki Hayakawa / @bells17
    ▶ Software Enginner
    ▶ 普段やってること:
    + Kubernetes 関連コンポーネントの開発
    + Kubernetes as a Service開発の調査・研究
    ▶ Kubernetes SIG-Docs Japanese localization reviewer
    ▶ Kubernetes Internal Organizer
    ▶ @bells17_

    View Slide

  3. 今⽇話すこと
    ▶ CSIについて
    ▶ KubernetesにおけるCSIの利⽤
    ▶ KubernetesとCSI Driver連携の裏側

    View Slide

  4. 注意点
    ▶ 内容としてはKubernetes Meetup Tokyo #25で発表した”Kubernetesに
    おけるCSI”をベースとしたものになります
    ▶ そのためKubernetes v1.17ベースでのお話になります
    + CSIの仕様はv1.12だった気がします
    ▶ 最新(v1.19あたり)の事情はまだキャッチアップできていないです
    + ので現状との齟齬がある可能性があります

    View Slide

  5. アジェンダ
    1. CSIとは?
    2. Kubernetesとボリュームプラグイン
    3. KubernetesとCSI Driverとの連携
    4. KubeletのPluginWatcherとCSI Plugin
    5. ボリューム作成 ~ マウントまでのフローについて

    View Slide

  6. CSIとは?

    View Slide

  7. CSI
    ▶ KubernetesやMesos、Cloud Foundryなどコンテナオーケストレーター
    (CO)でストレージを利⽤するための共通の仕様を定義したもの
    + なのでKubernetes⽤の仕様、というわけでない
    + 例えばHashicorp NomadなどはすでにCSIを利⽤している
    ▶ ストレージプロバイダは⼀度CSIに対応したドライバーを書いておくだけ
    で、Kubernetesでもその他のCOでも利⽤できるものを⽬指している
    ▶ CSIの仕様はGithubのcontainer-storage-interface/specリポジトリにある
    spec.mdファイルで定義されている

    View Slide

  8. CSI Driverがあれば様々なCOで対象のストレージを扱うことができる

    View Slide

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

    View Slide

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

    View Slide

  11. CSIが提供する機能
    ▶ ボリュームの作成/削除
    ▶ ノードへのボリュームのアタッチ/デタッチ
    ▶ ボリュームのマウント/アンマウント
    ▶ ボリュームのスナップショットの作成/削除
    ▶ etc...

    View Slide

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

    View Slide

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

    View Slide

  14. Node Plugin
    ▶ COに参加している各Worker Nodeで動くgRPCサーバー
    ▶ 以下のgRPCのサービスを実装したもの
    + Node Service
    + Identity Service
    ▶ ボリュームを対象Worker Nodeで利⽤するための機能を提供する
    ▶ 主に以下の機能を提供する
    + ノードにアタッチされたボリュームのフォーマット
    + ボリュームのマウント/アンマウント

    View Slide

  15. View Slide

  16. ボリュームライフサイクル

    View Slide

  17. CSIまとめ
    ▶ CSIとはストレージプロバイダがボリュームプラグインをCOに提供する
    ために定義された共通の仕様
    ▶ 具体的には以下のようなものを定義している
    + CSI Driverの動作環境や通信⽅法の定義
    + コンテナイメージ形式
    + UNIXドメインソケット/gRCPプロトコル
    + RPCインターフェイスの定義
    + Controller Plugin
    + Node Plugin

    View Slide

  18. Kubernetesとボリュームプラグイン

    View Slide

  19. Kubernetesのボリュームプラグインには
    以下の3つがある
    ▶ In-Tree Volume
    ▶ Kubernetesのコード内部に実装されているボリュームプラグイン
    ▶ ConfigMap/Secret/EmptyDirなどはここに該当
    ▶ FlexVolume
    ▶ CSI登場前に作成されたプラグイン(v1.8)
    ▶ Kubernetesの内部実装に関する知識が必要ということで、あまり使われてはない模様
    ▶ CSI Driver
    ▶ v1.9よりAlpha提供開始
    ▶ KubernetesがCSI Driverと連携を⾏うサイドカーアプリケーションを提供してくれて
    いるため、Kubernetesの内部実装の知識を必要とせずにボリュームプラグインを提供
    できる

    View Slide

  20. CSI Driver導⼊によるKubernetesのメリット
    ▶ 30を超えるIn-Tree Volumeプラグインを外部化することが可能になる
    + 実際に全てのIn-Tree Volumeプラグインを外部化するのかは不明
    + 主要なものとしては各Cloud Provider向けのボリュームプラグインのCSI Driver移⾏
    ▶ 外部化することで
    + 不要なコードをKubernetesのバイナリから除去できる
    + Kubernetes本体のコードの保守性が⾼まる
    + Kubernetesの各種バイナリサイズが減る
    + CSIの仕様に沿ったドライバーを作って配布するだけで、様々なストレージと
    Kubernetesが連携可能になる

    View Slide

  21. KubernetesとCSI Driverとの連携

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  28. VolumeSnapshotClass Object
    ▶ VolumeSnapshotリソースを利⽤して、ボリュームのスナップショットを作成する際に
    指定されるVolumeSnapshotClassの種別を表すオブジェクト
    ▶ snapshotterにはボリュームプラグイン名を指定する
    ▶ CSIドライバがボリュームのスナップショット機能をサポートしない場合には作成は不要
    apiVersion: snapshot.storage.k8s.io/v1alpha1
    kind: VolumeSnapshotClass
    metadata:
    name: my-csi-snapclass
    snapshotter: mycsidriver.example.com

    View Slide

  29. CSI Driverのデプロイ時に起こること

    View Slide

  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

    View Slide

  31. KubeletのPluginWatcherとCSI Plugin

    View Slide

  32. Kubelet Plugin Watcher

    View Slide

  33. Kubelet ~ CSI Drier間の通信

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. まとめ

    View Slide

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

    View Slide

  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

    View Slide

  40. Thanks / Question?
    ▶ Daiki Hayakawa, @bells17
    ▶ Slide: https://speakerdeck.com/bells17
    ▶ @bells17_

    View Slide