Kubernetes Novice Tokyo #6 で発表を行った"CSI入門"の資料です。 配信URLは https://www.youtube.com/watch?v=abAxPs5O5K4 になります。
CSI⼊⾨Kubernetes Novice Tokyo(2020/10/27)@bells17
View Slide
▶ Daiki Hayakawa / @bells17▶ Software Enginner▶ 普段やってること:+ Kubernetes 関連コンポーネントの開発+ Kubernetes as a Service開発の調査・研究▶ Kubernetes SIG-Docs Japanese localization reviewer▶ Kubernetes Internal Organizer▶ @bells17_
今⽇話すこと▶ CSIについて▶ KubernetesにおけるCSIの利⽤▶ KubernetesとCSI Driver連携の裏側
注意点▶ 内容としてはKubernetes Meetup Tokyo #25で発表した”KubernetesにおけるCSI”をベースとしたものになります▶ そのためKubernetes v1.17ベースでのお話になります+ CSIの仕様はv1.12だった気がします▶ 最新(v1.19あたり)の事情はまだキャッチアップできていないです+ ので現状との齟齬がある可能性があります
アジェンダ1. CSIとは?2. Kubernetesとボリュームプラグイン3. KubernetesとCSI Driverとの連携4. KubeletのPluginWatcherとCSI Plugin5. ボリューム作成 ~ マウントまでのフローについて
CSIとは?
CSI▶ KubernetesやMesos、Cloud Foundryなどコンテナオーケストレーター(CO)でストレージを利⽤するための共通の仕様を定義したもの+ なのでKubernetes⽤の仕様、というわけでない+ 例えばHashicorp NomadなどはすでにCSIを利⽤している▶ ストレージプロバイダは⼀度CSIに対応したドライバーを書いておくだけで、Kubernetesでもその他のCOでも利⽤できるものを⽬指している▶ CSIの仕様はGithubのcontainer-storage-interface/specリポジトリにあるspec.mdファイルで定義されている
CSI Driverがあれば様々なCOで対象のストレージを扱うことができる
CSIで定義されている仕様▶ CSI Driverの通信⽅法・提供⽅法について▶ CSI Driverが提供する機能について▶ COがCSI Driverを利⽤するためのgRPCのProtocol Buffers
CSI Driverの通信⽅法・提供⽅法について▶ コンテナイメージ形式(Docker, OCIなど)で提供する必要あり▶ CSI DriverとCO間の通信は+ UNIXドメインソケットを介して+ gRPCプロトコルを利⽤する必要がある
CSIが提供する機能▶ ボリュームの作成/削除▶ ノードへのボリュームのアタッチ/デタッチ▶ ボリュームのマウント/アンマウント▶ ボリュームのスナップショットの作成/削除▶ etc...
Protocol Buffersで定義されているgRPCのインターフェイス▶ Controller Plugin▶ Node Plugin
Controller Plugin▶ CSI Driverのcontrol plane として動くgRPCサーバー▶ 以下のgRPCのサービスを実装したもの+ Controller Service+ Identity Service▶ ボリュームやスナップショット⾃体をコントロールする機能を提供する▶ 具体的には以下のような機能を提供する+ ボリュームの作成/削除+ ノードへのボリュームのアタッチ/デタッチ+ ボリュームのスナップショットの作成/削除
Node Plugin▶ COに参加している各Worker Nodeで動くgRPCサーバー▶ 以下のgRPCのサービスを実装したもの+ Node Service+ Identity Service▶ ボリュームを対象Worker Nodeで利⽤するための機能を提供する▶ 主に以下の機能を提供する+ ノードにアタッチされたボリュームのフォーマット+ ボリュームのマウント/アンマウント
ボリュームライフサイクル
CSIまとめ▶ CSIとはストレージプロバイダがボリュームプラグインをCOに提供するために定義された共通の仕様▶ 具体的には以下のようなものを定義している+ CSI Driverの動作環境や通信⽅法の定義+ コンテナイメージ形式+ UNIXドメインソケット/gRCPプロトコル+ RPCインターフェイスの定義+ Controller Plugin+ Node Plugin
Kubernetesとボリュームプラグイン
Kubernetesのボリュームプラグインには以下の3つがある▶ In-Tree Volume▶ Kubernetesのコード内部に実装されているボリュームプラグイン▶ ConfigMap/Secret/EmptyDirなどはここに該当▶ FlexVolume▶ CSI登場前に作成されたプラグイン(v1.8)▶ Kubernetesの内部実装に関する知識が必要ということで、あまり使われてはない模様▶ CSI Driver▶ v1.9よりAlpha提供開始▶ KubernetesがCSI Driverと連携を⾏うサイドカーアプリケーションを提供してくれているため、Kubernetesの内部実装の知識を必要とせずにボリュームプラグインを提供できる
CSI Driver導⼊によるKubernetesのメリット▶ 30を超えるIn-Tree Volumeプラグインを外部化することが可能になる+ 実際に全てのIn-Tree Volumeプラグインを外部化するのかは不明+ 主要なものとしては各Cloud Provider向けのボリュームプラグインのCSI Driver移⾏▶ 外部化することで+ 不要なコードをKubernetesのバイナリから除去できる+ Kubernetes本体のコードの保守性が⾼まる+ Kubernetesの各種バイナリサイズが減る+ CSIの仕様に沿ったドライバーを作って配布するだけで、様々なストレージとKubernetesが連携可能になる
KubernetesとCSI Driverとの連携
サイドカーアプリケーションによる連携https://github.com/kubernetes/community/blob/d83cd53979d08ac0e0e33704c6aec6b1c3cb7c8d/contributors/design-proposals/storage/container-storage-interface_diagram1.png
Controller Sidecarexternal-provisioner ボリュームの作成/削除を⾏うexternal-attacher ボリュームのアタッチ/デタッチを⾏うexternal-resizer ボリュームのリサイズを⾏うexternal-snapshotter スナップショットの作成/削除を⾏うlivenessprobe Liveness Probe⽤HTTPプロキシ
Node Sidecarnode-driver-registrarKubeletにあるPlugin Watcherという機能を利⽤してCSIドライバをKubeletに登録する機能を提供する
CSI Driverを利⽤するときにリリースする必要があるもの
CSIDriver Object▶ StorageClassよってに指定されるCSI Driverの種別を表すオブジェクト▶ kubectl get CSIDriverコマンドでユーザーに利⽤可能なCSIドライバを⽰すために作成される▶ podInfoOnMount などCSIDriverの設定を⾏うことができるので、設定の変更が必要なCSIDriverの場合には作成する必要があるapiVersion: storage.k8s.io/v1beta1kind: CSIDrivermetadata:name: mycsidriver.example.comspec:attachRequired: truepodInfoOnMount: true
StorageClass Object▶ PV(C)でボリュームを扱う際に指定されるStorageClassの種別を表すオブジェクト▶ PVCが作成された時にボリュームのプロビジョニングを⾏うprovisionerを設定することで、PVCがプロビジョニングを⾏うボリュームプラグイン(CSIDriver Object)を指定することができる▶ CSIの場合csi.storage.k8s.io/fstypeなどStorage Class単位でCSIドライバのデフォルトの設定を⾏うことができるapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:name: my-csi-storageprovisioner: mycsidriver.example.comparameters:csi.storage.k8s.io/fstype: ext4csi.storage.k8s.io/provisioner-secret-name: mysecretcsi.storage.k8s.io/provisioner-secret-namespace: mynamespace
VolumeSnapshotClass Object▶ VolumeSnapshotリソースを利⽤して、ボリュームのスナップショットを作成する際に指定されるVolumeSnapshotClassの種別を表すオブジェクト▶ snapshotterにはボリュームプラグイン名を指定する▶ CSIドライバがボリュームのスナップショット機能をサポートしない場合には作成は不要apiVersion: snapshot.storage.k8s.io/v1alpha1kind: VolumeSnapshotClassmetadata:name: my-csi-snapclasssnapshotter: mycsidriver.example.com
CSI Driverのデプロイ時に起こること
CSINode Object▶ ボリュームのアタッチ/デタッチやトポロジーに基づくPod作成先のノードの選定に利⽤される▶ KubeletによってCSIドライバのNodeGetInfo RPCの情報から⾃動的に作成される▶ Node Objectに追加するには情報量が多いのでCSI⽤の追加情報がCSINode Objectに切り出されたapiVersion: storage.k8s.io/v1beta1kind: CSINodemetadata:name: node1spec:drivers:- name: mycsidriver.example.comnodeID: storageNodeID1topologyKeys:- mycsidriver.example.com/regions- mycsidriver.example.com/zones
KubeletのPluginWatcherとCSI Plugin
Kubelet Plugin Watcher
Kubelet ~ CSI Drier間の通信
ボリューム作成 ~ マウントまでのフローについて
ボリューム作成時の処理フロー
Pod作成時のボリュームマウントまでのフロー
まとめ
まとめ▶ CSIとは何か?Kubernetesは裏でどのようにCSI Driverと連携しているのか?について紹介しました▶ Kubernetesのボリューム処理の仕組みについて少しでも理解が深まれば幸いです
参考資料▶ 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 currentimplementation): 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
Thanks / Question?▶ Daiki Hayakawa, @bells17▶ Slide: https://speakerdeck.com/bells17▶ @bells17_