03-利用flexVolume掛載cifs目錄


本文介紹如何利用 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),詳見這里

使用方法

  1. 在每台 node 節點安裝依賴 cifs-utils,用於掛載共享目錄

    sudo apt-get install -y cifs-utils

  2. 在每台 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

實際使用時,遇到一些問題:

  1. 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 之后搞定!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM