Rook: EdgeFS CSIを試す
Rookだらけの Advent Calendar 2019/12/23: Rook EdgeFS CSIを試す(CSIって聞くとホッとする)
この記事は「Rookだらけの Advent Calendar」 2019/12/23分です。Rook EdgeFSについて記事を投稿します。
TL;DR
- 著者はCSIと聞くと安心する
- EdgeFS CSI は NFS/iSCSI が存在
- (おそらく)Dynamic ProvisioningはCSI NFS/iSCSIを使う
EdgeFS には NFS, iSCSI がありますが、CSIモードのNFS, CSI もあります。
こちらがリポジトリのようですが、まだコミット数も少ない状態です。
Edge FSのNFS、iSCSIと何が違うのかについては歴史的な背景がありそうですが、はっきりとしたことはわかりません。やってみたところDynamic Provisioning したい場合はCSI版を使うことになりそうですし、これから始めるのであればCSIを実装しているドライバを使うほうがいいのではないかと思います。
CSI(Container Storage Interface)について知りたい場合はぜひこちらを。
EdgeFS NFSについてはこちらを。
事前準備
バージョンによってはCSIのCRDが入っていない可能性があるので確認し、なければ導入します。
kubectl get customresourcedefinition.apiextensions.k8s.io/csidrivers.csi.storage.k8s.io
kubectl get customresourcedefinition.apiextensions.k8s.io/csinodeinfos.csi.storage.k8s.io
上記コマンドでなにも出なかった場合は以下のコマンドでCSIのCRDを導入しておきます。
kubectl create -f https://raw.githubusercontent.com/kubernetes/csi-api/release-1.13/pkg/crd/manifests/csidriver.yaml
kubectl create -f https://raw.githubusercontent.com/kubernetes/csi-api/release-1.13/pkg/crd/manifests/csinodeinfo.yaml
NFS, iSCSI をノードから使うため、ノード側にもパッケージが必要です
# for NFS
apt install -y nfs-common rpcbind
# for ISCSI
apt install -y open-iscsi
CSI NFS のデプロイ
これまでと同様に最初にクラスタ、テナント、バケットをEdgeFSで作成後、サービス公開をしてからKubernetes上でのCSI ドライバのデプロイとなります。
今回はCSI用に以下の環境をEdgeFSで作成しました。
- Cluster名: csi-test
- Tenant名: tenant01
edgefs-nfs-csi-driver-config.yaml というコンフィグファイルがあります、これを使ってsecretを作成します。
edgefs-nfs-csi-driver-config.yaml はCluster名、Tenant名を指定する箇所があるので準備したものを設定します。
rook 以下で以下のように作業ディレクトリへ移動します。すs
cd cluster/examples/kubernetes/edgefs/csi/nfs
edgefs-nfs-csi-driver-config.yaml が該当箇所を変更します。
# edgefs-nfs-csi-driver config file to create k8s secret
#
# $ kubectl create secret generic edgefs-nfs-csi-driver-config --from-file=./edgefs-nfs-csi-driver-config.yaml
#
#Edgefs k8s cluster options
k8sEdgefsNamespaces: ["rook-edgefs"] # element 0 is a default edgefs cluster namespace, add more when needed
k8sEdgefsMgmtPrefix: rook-edgefs-mgr # edgefs cluster management prefix
#Edgefs csi operatins options
cluster: csi-test <- ここ
tenant: tenant01 <- ここ
#serviceFilter: "nfs01" #List of comma delimeted allowed service names to filter
# Edgefs connnection options
username: admin #edgefs k8s cluster grpc connection username
password: admin #edgefs k8s cluster grpc connection password
secret として上記内容を登録します。
kubectl create secret generic edgefs-nfs-csi-driver-config --from-file=./edgefs-nfs-csi-driver-config.yaml
次にCSI ドライバを作成します。
$ kubectl apply -f edgefs-nfs-csi-driver.yaml csidriver.csi.storage.k8s.io/io.edgefs.csi.nfs created serviceaccount/edgefs-nfs-csi-controller-service-account created clusterrole.rbac.authorization.k8s.io/edgefs-nfs-csi-controller-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/edgefs-nfs-csi-controller-cluster-role-binding created service/edgefs-nfs-csi-controller created statefulset.apps/edgefs-nfs-csi-controller created serviceaccount/edgefs-nfs-csi-node-service-account created clusterrole.rbac.authorization.k8s.io/edgefs-nfs-csi-node-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/edgefs-nfs-csi-node-cluster-role-binding created daemonset.apps/edgefs-nfs-csi-node created
CSI のポッドが上がってきました。
❯ kubectl get pod
NAME READY STATUS RESTARTS AGE
edgefs-nfs-csi-controller-0 3/3 Running 0 23h
edgefs-nfs-csi-node-4mnrz 2/2 Running 0 23h
edgefs-nfs-csi-node-hktzt 2/2 Running 0 23h
edgefs-nfs-csi-node-xvlx5 2/2 Running 0 23h
ここまで来るともう安心です。
StorageClassの作成、PVCをバインド
StorageClassを作成からPVCバウンドまでを一気に実施します。
今回はexamplesにStorageClassからまるっと作ってくれるものが入っているのでそれを使います。
$ cd rook/cluster/examples/kubernetes/edgefs/csi/nfs/examples$ kubectl apply -f dynamic-nginx.yaml
サンプルだと様々なパラメータが設定してありますが、上述したedgefs-nfs-csi-driver-config.yaml
に記載済みのため省略 しました。
❯ kubectl get pvc -n rook-edgefs
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
edgefs-nfs-csi-pvc Bound pvc-2fa43b39-2f25-4b68-ab63-852c32506d3b 1Gi RWO edgefs-nfs-csi-storageclass 23h
しっかりとBoundされました。nginx pod も立ち上がっています。
❯ kubectl get pod -n rook-edgefs
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 23h
中身としては以下の通りです。
StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: edgefs-nfs-csi-storageclass
provisioner: io.edgefs.csi.nfs
parameters:
segment: rook-edgefs
service: nfs-csi
cluster: csi-test
tenant: tenant01
上記StorageClassを使ったPVCの例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: edgefs-nfs-csi-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: edgefs-nfs-csi-storageclass
EdgeFS 側では以下のようにバケットが作成されていました。
まとめ
EdgeFS のNFS/iSCSIとCSI NFS/iSCSIはどう使い分けるのか?ということは感じますが基本路線はCSIを使うほうがこれからはいいと考えています。
今回もとりあえず動かすところをやってみました。はじめの一歩としてはこんなにすぐ正常に動くというところは素晴らしいと感じました。
またこの記事では記載しませんでしたが、CSIということでSnapshotやCloneにも対応しています。