在 kubernetes 上使用 SMB 协议做存储的「即插即用」方案
helm 方式
1) 安装 SMB CSI 驱动(Helm)
helm repo add csi-driver-smb https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/master/charts
helm repo update
# 安装到 kube-system,版本示例:v1.19.1(当前最新版)
helm install csi-driver-smb csi-driver-smb/csi-driver-smb \-n kube-system --create-namespace \--version 1.19.1
该驱动官方仓库与版本见这里。([GitHub][2])
2) 准备访问凭据(Secret)
把 your_user/your_password 改成 NAS 账号与密码;如需域账户,用户名可写成 DOMAIN\\user(例如 Azure\\alice)。([docs.okd.io][3])
apiVersion: v1
kind: Secret
metadata:name: smb-secretnamespace: kube-system # 也可放到别的命名空间,下面 SC 同步修改
type: Opaque
stringData:username: "your_user" # 域账户可用: "DOMAIN\\your_user"password: "your_password" # 建议用 stringData,避免自己手动 base64
kubesphere上面
kind: Secret
apiVersion: v1
metadata:name: smb-secretnamespace: kube-systemannotations:kubesphere.io/creator: admin
data:password: your_userusername: your_password
type: kubernetes.io/basic-auth
3) 创建 StorageClass(动态供给 + 凭据引用)
把 //10.0.0.20/share 改为你的 NAS 共享路径。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: smb-csiannotations:storageclass.kubernetes.io/is-default-class: "false"
provisioner: smb.csi.k8s.io
parameters:# 共享路径(UNC)source: "//10.0.0.20/share"# 给控制器和节点阶段传递凭据(CSI 标准参数名)csi.storage.k8s.io/provisioner-secret-name: "smb-secret"csi.storage.k8s.io/provisioner-secret-namespace: "kube-system"csi.storage.k8s.io/node-stage-secret-name: "smb-secret"csi.storage.k8s.io/node-stage-secret-namespace: "kube-system"mountOptions:- vers=3.0- dir_mode=0777- file_mode=0777# 如需在容器内指定属主/属组,可加:# - uid=1000# - gid=1000reclaimPolicy: Retain # 保留 Delete:会删除nas上面的pvc目录
volumeBindingMode: Immediate
allowVolumeExpansion: true
csi.storage.k8s.io/*-secret-*是 CSI 约定的参数名;source为 SMB 共享地址。也支持把source放进 Secret(source-secret-name/source-secret-key),适合多站点差异化配置。
4) 验证(PVC + 测试 Pod)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-smb-test
spec:accessModes: ["ReadWriteMany"]storageClassName: smb-csiresources:requests:storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:name: smb-check
spec:containers:- name: boximage: busyboxcommand: ["sh","-c","echo OK-$(date) > /mnt/ok && ls -l /mnt && cat /mnt/ok && sleep 3600"]volumeMounts:- name: vmountPath: /mntvolumes:- name: vpersistentVolumeClaim:claimName: pvc-smb-test
kubectl logs -f smb-check 看到 OK-时间戳 即成功。
用官方安装脚本(kubectl 直装)
1. 下载安装文件 https://github.com/kubernetes-csi/csi-driver-smb/releases/tag/v1.19.1

脚本会把 repo 设为 ./deploy,随后如果 ver != master 再拼上版本号,所以本地路径必须是:
install-driver.sh
deploy/
└─ v1.19.1/├─ rbac-csi-smb.yaml├─ csi-smb-driver.yaml├─ csi-smb-controller.yaml├─ csi-smb-node.yaml├─ csi-smb-node-windows.yaml # 仅有 Windows 节点才需要└─ csi-smb-node-windows-hostprocess.yaml # 仅 hostprocess 模式时需要
可以在有外网的机器上把对应版本的这些 YAML 拉下来,然后拷回到离线环境;或者你已在本地准备好了这几份 YAML,直接放到上面的目录即可。
2.替换镜像到你的私有仓库(离线环境必做)
SMB CSI 及其 sidecar 的镜像默认在 registry.k8s.io。你可以用下面脚本自动抽取 YAML 里的镜像、用可达的代理源拉取一遍、然后推到你的私有仓库,并把 YAML 中的镜像前缀替换为你的仓库。
如果拉取不下来使用,用国内/代理镜像中转一次再推到你的私有仓库
先在一台能上网的跳板机上中转拉取,再推回你的 registry。
# 1) 先试官方源(能通就跳过后面的中转)
docker pull registry.k8s.io/sig-storage/smbplugin:v1.19.1# 2) 不通就用多云代理镜像拉(示例:DaoCloud 代理 registry.k8s.io)
docker pull k8s.m.daocloud.io/sig-storage/smbplugin:v1.19.1# 3) 重新打 tag 推到你内网仓库
docker tag k8s.m.daocloud.io/sig-storage/smbplugin:v1.19.1 registry.local/sig-storage/smbplugin:v1.19.1
docker push registry.local/sig-storage/smbplugin:v1.19.1
3.本地安装命令
- 仅 Linux 节点(最常见):
bash install-driver.sh v1.19.1 local
- 如需 Windows 且使用 hostprocess:
bash install-driver.sh v1.19.1 local-hostprocess
验证:
kubectl -n kube-system get deploy,ds | grep -i smb
kubectl -n kube-system get pods -o wide | grep -i smb
4.创建 NAS 账号/密码 Secret + StorageClass(RWX 动态供给)
把
your_user/your_password、//10.0.0.20/share改成你 NAS 的真实信息;域账户可写DOMAIN\\user。
# smb-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: smb-secretnamespace: kube-system
type: Opaque
stringData:username: "your_user" # 域账户示例: "CORP\\alice"password: "your_password"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: smb-csiannotations:storageclass.kubernetes.io/is-default-class: "false" # 需要默认可改为 "true"
provisioner: smb.csi.k8s.io
parameters:source: "//10.0.0.20/share" # NAS 共享路径(UNC)csi.storage.k8s.io/provisioner-secret-name: "smb-secret"csi.storage.k8s.io/provisioner-secret-namespace: "kube-system"csi.storage.k8s.io/node-stage-secret-name: "smb-secret"csi.storage.k8s.io/node-stage-secret-namespace: "kube-system"
mountOptions:- vers=3.0- dir_mode=0777- file_mode=0777
reclaimPolicy: Retain #保留 Delete:会删除nas上面的pvc目录
volumeBindingMode: Immediate
allowVolumeExpansion: true
kubectl apply -f smb-secret.yaml
5.快速自测(PVC + Pod)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-smb-test
spec:accessModes: ["ReadWriteMany"]storageClassName: smb-csiresources:requests:storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:name: smb-check
spec:containers:- name: boximage: busyboxcommand: ["sh","-c","echo OK-$(date) > /mnt/ok && ls -l /mnt && cat /mnt/ok && sleep 3600"]volumeMounts:- name: vmountPath: /mntvolumes:- name: vpersistentVolumeClaim:claimName: pvc-smb-test
kubectl apply -f test.yaml
kubectl logs -f smb-check
看到 OK-时间戳 即成功。
