Назад | Перейти на главную страницу

Kubernetes: как монтировать тома в поды Windows?

Я настроил небольшой кластер Kubernetes для тестирования, а в качестве хранилища использую glusterfs. Нет CSI, я пока просто создаю тома вручную.

Теперь я добавил в кластер узел Windows. Пока он работает нормально, но я не могу установить какие-либо тома в контейнер.

Я сделал очень простое определение модуля:

---
apiVersion: v1
kind: Pod
metadata:
  name: windows-test
  labels:
    name: windows-test
spec:
  containers:
    - name: sample
      image: mcr.microsoft.com/windows/servercore:ltsc2019
      resources:
        limits:
          cpu: "1.0"
          memory: "1Gi"
      command:
        - cmd
        - "/c"
        - "dir"
        - "/s"
        - 'c:\'
      volumeMounts:
        - mountPath: "foo"
          name: testvol
  nodeSelector:
    "kubernetes.io/os": windows
  volumes:
    - name: testvol
      glusterfs:
        path: wintest
        endpoints: glusterfs-cluster
        readOnly: false

Когда я запускаю это, модуль никогда не запускается, и когда я его описываю, я получаю:

  Warning  FailedMount  <invalid>                      kubelet, node09    MountVolume.SetUp failed for volume "testvol" : mount failed: only cifs mount is supported now, fstype: "glusterfs", mounting source ("10.93.111.35:wintest"), target ("c:\\var\\lib\\kubelet\\pods\\6d207138-09fb-4e1f-86e7-6a71cef5ce7e\\volumes\\kubernetes.io~glusterfs\\testvol"), with options (["auto_unmount" "backup-volfile-servers=10.93.111.31:10.93.111.32:10.93.111.33:10.93.111.34:10.93.111.35:10.93.111.36:10.93.111.37:10.93.111.38" "log-file=\\var\\lib\\kubelet\\plugins\\kubernetes.io\\glusterfs\\testvol\\windows-test-glusterfs.log" "log-level=ERROR"]), the following error information was pulled from the glusterfs log to help diagnose this issue: could not open log file for pod windows-test

Кажется, что поды Windows не поддерживают glusterfs, а только cifs. Может ли кто-нибудь подсказать мне, как смонтировать том через cifs? Единственная информация, которую я нашел в документации, касалась azure-file хранилище, но я не мог понять, может ли он также монтировать общие ресурсы CIFS локально.

Я думаю, ты мог бы начать с этот.

Плагин CIFS Flexvolume для Kubernetes

Установка

Плагин flexvolume представляет собой скрипт с одной оболочкой с именем cifs. Этот сценарий оболочки должен быть доступен на мастере Kubernetes и на каждом из узлов Kubernetes. По умолчанию Kubernetes ищет сторонние плагины томов в / usr / libexec / kubernetes / kubelet-plugins / volume / exec /. Каталог плагинов можно настроить с помощью параметра kubelet --volume-plugin-dir, запустите ps aux | grep kubelet, чтобы узнать расположение каталога плагина в вашей системе (см. №1). Скрипт cifs должен находиться в подкаталоге с именем fstab ~ cifs /. Имя каталога fstab ~ cifs / будет сопоставлено с именем драйвера Flexvolume fstab / cifs.

На мастере Kubernetes и на каждом узле Kubernetes выполните следующие команды:

VOLUME_PLUGIN_DIR="/usr/libexec/kubernetes/kubelet-plugins/volume/exec"
mkdir -p "$VOLUME_PLUGIN_DIR/fstab~cifs"
cd "$VOLUME_PLUGIN_DIR/fstab~cifs"
curl -L -O https://raw.githubusercontent.com/fstab/cifs/master/cifs
chmod 755 cifs

Скрипту cifs необходимо, чтобы на каждой хост-системе было доступно несколько исполняемых файлов:

mount.cifs, в Ubuntu он находится в cifs-utils пакет. jq, в Ubuntu это находится в jq пакет. точка монтирования, в Ubuntu это утилита-Linux пакет. base64, в Ubuntu это coreutils пакет. Чтобы проверить, прошла ли установка успешно, выполните следующую команду:

VOLUME_PLUGIN_DIR="/usr/libexec/kubernetes/kubelet-plugins/volume/exec"
$VOLUME_PLUGIN_DIR/fstab~cifs/cifs init

Он должен вывести строку JSON, содержащую «status»: «Success». Эта команда также запускается самим Kubernetes, когда плагин cifs обнаруживается в файловой системе.

Бег

Плагин берет имя пользователя и пароль CIFS из Kubernetes Secret. Чтобы создать секрет, вам сначала нужно преобразовать ваше имя пользователя и пароль в кодировку base64:

echo -n username | base64
echo -n password | base64

Затем создайте файл secret.yml и используйте вывод вышеуказанных команд в качестве имени пользователя и пароля:

apiVersion: v1
kind: Secret
metadata:
  name: cifs-secret
  namespace: default
type: fstab/cifs
data:
  username: 'ZXhhbXBsZQ=='
  password: 'bXktc2VjcmV0LXBhc3N3b3Jk'

Примените секрет:

kubectl apply -f secret.yml

Вы можете проверить, успешно ли был установлен секрет, используя kubectl describe secret cifs-secret.

Затем создайте файл pod.yml с тестовым модулем (замените // server / share на сетевой путь вашего общего ресурса CIFS):

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: test
      mountPath: /data
  volumes:
  - name: test
    flexVolume:
      driver: "fstab/cifs"
      fsType: "cifs"
      secretRef:
        name: "cifs-secret"
      options:
        networkPath: "//server/share"
        mountOptions: "dir_mode=0755,file_mode=0644,noperm"

Запустите модуль:

kubectl apply -f pod.yml

Вы можете убедиться, что том был успешно смонтирован, используя kubectl describe pod busybox.


Дополнительно есть еще один руководство по github с помощью Kubernetes CIFS Volume Driver.


Надеюсь, вы найдете это полезным.