Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

CSIとは?

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

KubernetesとCSI Driverとの連携

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

KubeletのPluginWatcherとCSI Plugin

Slide 32

Slide 32 text

Kubelet Plugin Watcher

Slide 33

Slide 33 text

Kubelet ~ CSI Drier間の通信

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

まとめ

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

参考資料 ▶ 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

Slide 40

Slide 40 text

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