本文介绍如何利用 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 之后搞定!