之前文章提到,k8s官方是支援nfs存儲的,那麼在windows常見的檔案共享協定是否也支援呢。答案是肯定的。不過支援的方式是通過CSI接口進行支援的。官方提供的項目是csi-driver-smb
官網:https://github.com/kubernetes-csi/csi-driver-smb
安裝
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-smb/v1.9.0/deploy/install-driver.sh | bash -s v1.9.0 --
國内的環境實測安裝有點困難install-driver.sh實際上對應5個yaml檔案安裝,可以從項目的delploy目錄代碼中找到
kubectl apply -f rbac-csi-smb.yaml
kubectl apply -f csi-smb-driver.yaml
kubectl apply -f csi-smb-controller.yaml
kubectl apply -f csi-smb-node.yaml
kubectl apply -f csi-smb-node-windows.yaml
這幾個yaml檔案有4個鏡像來自registry.k8s.io,也不是那麼好下載下傳,建議從其他地方下載下傳導入再執行apply
registry.k8s.io/sig-storage/smbplugin
registry.k8s.io/sig-storage/csi-provisioner
registry.k8s.io/sig-storage/livenessprobe
registry.k8s.io/sig-storage/csi-node-driver-registrar
安裝完後檢視pod
kubectl get pod -A |grep smb
可以看到如下結果
kube-system csi-smb-controller-5879b96656-w4d64 3/3 Running 0 145m
kube-system csi-smb-node-bqkkk 3/3 Running 0 145m
說明安裝成功
之後是使用過程
建立secret儲存smb的使用者名密碼
kubectl create secret generic smbcreds --from-literal username=USERNAME --from-literal password="PASSWORD"
這裡将USERNAME改成你的smb使用者名PASSWORD 改成你的smb密碼,如果有AD域,使用--from-literal domain=DOMAINNAME 指定
編寫yaml檔案,這裡以部署tomcat8為例。
storageclass-smb.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: smb
provisioner: smb.csi.k8s.io
parameters:
source: "//192.168.1.16/AirDisk/新加卷-A/k8sstorage"
# if csi.storage.k8s.io/provisioner-secret is provided, will create a sub directory
# with PV name under source
csi.storage.k8s.io/provisioner-secret-name: "smbcreds"
csi.storage.k8s.io/provisioner-secret-namespace: "default"
csi.storage.k8s.io/node-stage-secret-name: "smbcreds"
csi.storage.k8s.io/node-stage-secret-namespace: "default"
reclaimPolicy: Delete # available values: Delete, Retain
volumeBindingMode: Immediate
mountOptions:
- dir_mode=0777
- file_mode=0777
- uid=1001
- gid=1001
這裡source改成你自己的路徑
tomcat-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: tomcat-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 4Gi
storageClassName: "smb"
tomcat-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
selector:
matchLabels:
app: tomcat8
template:
metadata:
labels:
app: tomcat8
spec:
containers:
- name: mytomcat8
image: tomcat:8.5.40
ports:
- containerPort: 8080
volumeMounts:
- name: tomcat-persistent-storage
mountPath: /usr/local/tomcat/webapps
volumes:
- name: tomcat-persistent-storage
persistentVolumeClaim:
claimName: tomcat-pvc
---
apiVersion: v1
kind: Service
metadata:
name: tomcatservice
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 30010
selector:
app: tomcat8
安裝指令
kubectl apply -f storageclass-smb.yaml
kubectl apply -f tomcat-pvc.yaml
kubectl apply -f tomcat-deploy.yaml
解除安裝指令
kubectl delete -f tomcat-deploy.yaml
kubectl delete -f tomcat-pvc.yaml
kubectl delete -f storageclass-smb.yaml
通路tomcat
http://192.168.1.10:30010/
預設出現404,把war包拷貝到smb目錄就可以正常通路了,我這裡把webapp的原有内容拷貝下來了。頁面可以看到湯姆貓了

雖然搞定的tomcat的smb存儲,但是mysql部署卻失敗了,很有可能出現在含單引号的檔案名和目錄名這個問題上。
經過在群晖上同時開啟smb和nfs共享測試,nfs挂載模式下mysql能部署成功,smb卻不能。基本可以斷定:smb協定對特殊字元的檔案夾和檔案如#~支援不太好,不太适合有特殊字元的程式作為存儲後端。