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-secret
  namespace: 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-secret
  namespace: kube-system
  annotations:
    kubesphere.io/creator: admin
data:
  password: your_user
  username: 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-csi
  annotations:
    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=1000

reclaimPolicy: 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-csi
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: smb-check
spec:
  containers:
    - name: box
      image: busybox
      command: ["sh","-c","echo OK-$(date) > /mnt/ok && ls -l /mnt && cat /mnt/ok && sleep 3600"]
      volumeMounts:
        - name: v
          mountPath: /mnt
  volumes:
    - name: v
      persistentVolumeClaim:
        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-secret
  namespace: kube-system
type: Opaque
stringData:
  username: "your_user"         # 域账户示例: "CORP\\alice"
  password: "your_password"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: smb-csi
  annotations:
    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-csi
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: smb-check
spec:
  containers:
    - name: box
      image: busybox
      command: ["sh","-c","echo OK-$(date) > /mnt/ok && ls -l /mnt && cat /mnt/ok && sleep 3600"]
      volumeMounts:
        - name: v
          mountPath: /mnt
  volumes:
    - name: v
      persistentVolumeClaim:
        claimName: pvc-smb-test
kubectl apply -f test.yaml
kubectl logs -f smb-check

看到 OK-时间戳 即成功。


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐