【SMB CSI Driver】KubernetesでSamabaサーバのストレージを使用する

前置き

 サイオステクノロジーの中島です。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のファイル共有をそのままコンテナとして使用できる利点があります。

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です