本文介紹如何利用 flexVolume 掛載 windows share folder,k8s集群通過rke搭建
flexVolume
FlexVolume 是一個自 1.2 版本(在 CSI 之前)以來在 Kubernetes 中一直存在的 out-of-tree 插件接口。 它使用基於 exec 的模型來與驅動程序對接。 用戶必須在每個節點(在某些情況下是主節點)上的預定義卷插件路徑中安裝 FlexVolume 驅動程序可執行文件。
Pod 通過 flexvolume in-tree 插件與 Flexvolume 驅動程序交互。 更多詳情請參考這里。
juliohm/cifs
基於 Flexvolume 的卷插件,可以讓集群掛載 CIFS volumes (samba shares),詳見這里
使用方法
-
在每台 node 節點安裝依賴 cifs-utils,用於掛載共享目錄
sudo apt-get install -y cifs-utils
-
在每台 node 節點安裝 juliohm/cifs 插件
這里可以利用 DaemonSet 來自動部署到 node:
git clone https://github.com/juliohm1978/kubernetes-cifs-volumedriver.git
cd kubernetes-cifs-volumedriver
make install
pod 會掛載 node 的 /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ 目錄並將文件復制過去
測試
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
nodeSelector:
mediatek/role: app
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test
mountPath: /data
volumes:
- name: test
flexVolume:
driver: "juliohm/cifs"
fsType: "cifs"
options:
opts: username=[user_name],password=[pass_word],domain=[domain],file_mode=0755,dir_mode=0755
server: [ip_or_host_name]
share: [share_folder]
隱藏敏感信息
實際使用時,不應將 username password 等敏感信息直接放在 opts 中,可以放在 secret 中:
---
apiVersion: v1
data:
password: dXNlcjEyMw==
username: cGFzczEyMw==
kind: Secret
metadata:
name: my-secret
type: juliohm/cifs
---
...
options:
opts: domain=Foo
server: 10.0.0.114
share: /publico
secretRef:
name: my-secret
debug
實際使用時,遇到一些問題:
- volume無法mount,describe pod 發現報錯:Timeout expired waiting for volumes to attach
ps. 用rke升級k8s到1.17.x之后,會打印更詳細的提示:
Unable to attach or mount volumes: unmounted volumes=[xxx], unattached volumes=[xxx default-token-rcxrw]: failed to get Plugin from volumeSpec for volume "xxx" err=no volume plugin matched
打印 kubelet container 的 log,提示無法找到插件,enable-controller-attach-detach: false以及 extra_binds: - "/usr/libexec/kubernetes/kubelet-plugins:/var/lib/kubelet/volumeplugins" 都設定過,並且檢查 pod 中插件目錄確實存在,這個問題困擾了我很久。
最后再仔細看 flexvolume 的文檔,找到這樣一段話
The default plugin directory is /usr/libexec/kubernetes/kubelet-plugins/volume/exec/. It can be changed in kubelet via the --volume-plugin-dir flag, and in controller manager via the --flex-volume-plugin-dir flag.
注意這里提到的插件目錄是 /usr/libexec/kubernetes/kubelet-plugins/volume/exec/而非 /var/lib/kubelet/volumeplugins,然后嘗試給 kubelet 傳遞啟動參數:
services:
kubelet:
extra_args:
volume-plugin-dir: /var/lib/kubelet/volumeplugins/volume/exec
重啟 kubelet 之后搞定!