前置き
サイオステクノロジーの中島です。SMB CSI Driver for Kubernetes(https://github.com/kubernetes-csi/csi-driver-smb)というものがあり、SambaプロトコルのファイルストレージをKubernetesで使用できるようになるので、実際に動作テストを実施し、kubernetes 1.22で動作することを確認しました。
作業概要
KubernetesのPersistentVolumes(PVと省略)で使用できるファイルプロトコルでsambaは対応されていないですが、SMB CSI Driverを導入することで、sambaプロトコルをPVとして指定することができるようになります。
SMB CSI DriverをKubernetesを導入するには、以下の通りのリソースをKubernetesに登録する必要があります。
図1 SMB CSI Driverを適用する際の追加リソースについて
SMB CSI Driver for Kubernetesは主に以下のシステムから作成されます。
- Kubernetesを監視するコントローラ
- 各ノードで動作するエージェント
Kubernetesを監視するコントローラには権限は監視や制御するために権限を付与する必要があるため以下の権限を付与する。
表1 SMB CSI Driverのコントローラに付与する権限
リソース名 |
apiGroups |
権限 |
備考 |
PersistentVolumes |
* |
get, list, watch, create, delete |
|
PersistentVolumeClaims |
* |
get, list, watch, update |
|
StorageClasses |
storage.k8s.io |
get, list, watch |
|
Events |
* |
get, list, watch, create, update, patch |
|
CSINode |
storage.k8s.io |
get, list, watch |
|
Nodes |
* |
get, list, watch |
|
Leases |
coordination.k8s.io |
get, list, watch, create, update, patch |
|
Secrets |
* |
get |
上記コントローラ導入後、以下のようにリソースを設定することでsambaプロトコルのストレージをKubernetesのPodにマウントできるようになる。
図2 sambaストレージのPodマウント
動作テスト
実際にSMB CSI DriverをKubernetesに導入してSambaサーバのフォルダをコンテナにマウントして動作を確認する。なお、v1.10.0のコンテナはarm系の用意が無かったため、v1.9.0を使用してコントローラの構築を実施する。なお、手持ちのKubernetes環境はv1.22があるので、それを使用して確認をした。
まず、以下のコマンドでSMB CSI DriverをKubernetesに導入する
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/deploy/v1.9.0/rbac-csi-smb.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/deploy/v1.9.0/csi-smb-driver.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/deploy/v1.9.0/csi-smb-controller.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/deploy/v1.9.0/csi-smb-node.yaml
上記導入後、以下の通りcontollerとnodeへのエージェントが動作していることを確認する。
$ kubectl -n kube-system get pod |grep csi
csi-smb-controller-68fc76d4b8-fdxhg 3/3 Running 0 18h
csi-smb-node-2s6fm 3/3 Running 0 18h
csi-smb-node-7lsfn 3/3 Running 0 18h
csi-smb-node-qjh7v 3/3 Running 0 18h
csi-smb-node-r9n5c 3/3 Running 3 (5h46m ago) 18h
本記事は、defualtのネームスペースで動作確認するため以下のコマンドで、samabaへの接続ユーザーとパスワードを設定する。
kubectl -n default create secret generic smbcreds --from-literal username=USERNAME --from-literal password="PASSWORD"
SAMBAサーバの接続が「sambaserver.local」でフォルダ名が「share」の時のPVとPVCリソースは以下の通りになる。
---
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/provisioned-by: smb.csi.k8s.io
name: pv-smb
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: smb
mountOptions:
- dir_mode=0777
- file_mode=0777
- uid=1001
- gid=1001
- noperm
- mfsymlinks
- cache=strict
- noserverino # required to prevent data corruption
csi:
driver: smb.csi.k8s.io
readOnly: false
volumeHandle: smb-server.default.svc.cluster.local/share##
volumeAttributes:
source: "//sambaserver.local/share"
nodeStageSecretRef:
name: smbcreds
namespace: default
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-smb
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: smb
nginxのコンテナを動作させて、定期的にマウントしたsamabaのフォルダにデータ出力する処理をするkubernetesリソースを以下の通り定義する。
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: deployment-smb
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
name: deployment-smb
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: deployment-smb
image: nginx
command:
- "/bin/bash"
- "-c"
- set -euo pipefail; while true; do echo $(date) >> /mnt/smb/outfile; sleep 1; done
volumeMounts:
- name: smb
mountPath: "/mnt/smb"
readOnly: false
volumes:
- name: smb
persistentVolumeClaim:
claimName: pvc-smb
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
上記リソースに適応して動作に問題ない場合は、「outfile」というファイルがsambaのフォルダに作成される。
まとめ
以上の手順でKubernetesのPVボリュームとしてsamabaサーバのストレージを使用することが出来ました。samabaのストレージはNFSのストレージのように権限状態の維持ができないので、設定ファイル保存には適していないですが、Windowsのファイル共有をそのままコンテナとして使用できる利点があります。