天天看點

k8s對接smb/cifs存儲

之前文章提到,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的原有内容拷貝下來了。頁面可以看到湯姆貓了

k8s對接smb/cifs存儲
k8s對接smb/cifs存儲

雖然搞定的tomcat的smb存儲,但是mysql部署卻失敗了,很有可能出現在含單引号的檔案名和目錄名這個問題上。

經過在群晖上同時開啟smb和nfs共享測試,nfs挂載模式下mysql能部署成功,smb卻不能。基本可以斷定:smb協定對特殊字元的檔案夾和檔案如#~支援不太好,不太适合有特殊字元的程式作為存儲後端。

繼續閱讀