Сsi-external-provisioner#

Сsi-external-provisioner - компонент управляет динамическим выделением томов CSI. Обеспечивает создание, монтирование и удаление томов CSI по запросу. Компонент предоставляет API для создания, удаления и монтирования томов и запускается в DropApp Plus в виде pod.

Последовательность выполнения#

Рекомендуемые флаги приведены в таблице.

Таблица. Рекомендуемые флаги Сsi-external-provisioner

Синтаксис флага

Значение

--csi-address <path to CSI socket>

Путь к сокету драйвера CSI внутри pod, который контейнер external-provisioner будет использовать для выполнения операций CSI (/run/csi/socket используется по умолчанию)

--leader-election

Включает выбор главного процесса. Флаг обязателен, если для одного драйвера CSI запущено несколько реплик одного и того же внешнего поставщика. Активным может быть только один из них. Новый главный процесс будет выбран когда текущий процесс завершит работу или перестанет отвечать на запросы в течение примерно 15 секунд

--leader-election-namespace

Пространство имен, в котором будет создан объект выбора главного процесса. Рекомендуется, чтобы этот параметр заполнялся в прострастве, в котором работает external-provisioner

--leader-election-lease-duration <duration>

Продолжительность в секундах, в течение которой допускается простой процесса. По умолчанию – 15 секунд

--leader-election-renew-deadline <duration>

Продолжительность в секундах, в течение которой главный процесс повторяет попытку обновления лидерства, прежде чем завершить работу. По умолчанию – 10 секунд

--leader-election-retry-period <duration>

Продолжительность в секундах, в течение которой клиенты LeaderElector должны ждать между попытками действий. По умолчанию – 5 секунд

--timeout <duration>

Тайм-аут всех обращений к драйверу CSI. Он должен быть установлен на значение, которое подходит для большинства вызовов ControllerCreateVolume и ControllerDeleteVolume. По умолчанию используется 15 секунд

--retry-interval-start <duration>

Начальный интервал повторных попыток при неудачной инициализации или удалении. Он удваивается с каждым сбоем, до --retry-interval-max, а затем перестает увеличиваться. Значение по умолчанию — 1 секунда

--retry-interval-max <duration>

Максимальный интервал повторных попыток при неудачной инициализации или удалении. Значение по умолчанию — 5 минут

--worker-threads <num>

Количество одновременно запущенных ControllerCreateVolume и ControllerDeleteVolume. Значение по умолчанию – 100

--kube-api-qps <num>

Количество запросов в секунду, отправленных клиентом DropApp на API server DropApp Plus. По умолчанию – 5.0

--kube-api-burst <num>

Количество запросов к серверу API DropApp Plus, превышающее число запросов в секунду, которые можно отправить в любой момент времени. По умолчанию 10

--cloning-protection-threads <num>

Количество одновременно запущенных потоков, обрабатывающих удаление финализатора клонирования. По умолчанию – 1

--http-endpoint

Cетевой адрес TCP, который будет прослушивать HTTP-сервер (порт 8080 на локальном хосте). По умолчанию используется пустая строка, что означает, что сервер отключен

--metrics-path

HTTP-путь, по которому будут отображаться метрики Prometheus. Значение по умолчанию /metrics

--extra-create-metadata

Ввод дополнительных метаданных PVC и PV в качестве параметров при вызове CreateVolume драйвера (ключи csi.storage.k8s.io/pvc/name, csi.storage.k8s.io/pvc/namespace, csi .storage.k8s.io/pv/name)

--controller-publish-readonly

Этот параметр позволяет пометить PV как доступный только для чтения при вызове тома публикации контроллера, если режим доступа PVC. По умолчанию значение false

--enable-pprof

Включение профилирования pprof на сетевом TCP-адресе, указанном параметром --http-endpoint. Путь HTTP /debug/pprof/

Сsi-external-provisioner может работать в одном pod с другими внешними контроллерами CSI, такими как Сsi-external-attacher, Сsi-external-snapshotter и Сsi-external-resizer.

Сsi-external-provisioner не масштабируется с большим количеством реплик. Только один экземпляр Сsi-external-provisioner избирается в качестве главного процесса и работает. Новый главный процесс переизбирается через 15 секунд после завершения работы старого процесса.

Внешний поставщик можно использовать для создания объектов CSIStorageCapacity, которые содержат информацию о емкости хранилища, доступной через драйвер. Затем планировщик DropApp Plus использует эту информацию при выборе узлов для модулей с несвязанными томами, ожидающими первого потребителя.

Все объекты CSIStorageCapacity, созданные экземпляром Сsi-external-provisioner, имеют определенные метки:

  • csi.storage.k8s.io/drivername имя драйвера CSI;

  • csi.storage.k8s.io/managed-by Сsi-external-provisioner для централизованного предоставления, Сsi-external-provisioner для распределенного предоставления.

Они создаются в пространстве имен, указанном в переменной среды.

Каждый экземпляр Сsi-external-provisioner управляет именно теми объектами с метками, которые соответствуют экземпляру.

При необходимости все объекты CSIStorageCapacity, созданные экземпляром Сsi-external-provisioner, могут иметь владельца. Это гарантирует автоматическое удаление объектов при удалении драйвера CSI. Владелец определяется переменными среды POD_NAME/NAMESPACE и параметром --capacity-ownerref-level.

Если владение отключено, администратор хранилища отвечает за удаление потерянных объектов CSIStorageCapacity, и для очистки потерянных объектов драйвера можно использовать следующую команду:

oc delete csistoragecapacities -l csi.storage.k8s.io/drivername=my-csi.example.com

Следуйте последовательности действий, чтобы настроить поддержку емкости.

  1. Установите переменные среды POD_NAME и NAMESPACE:

    env:
    - name: NAMESPACE
      valueFrom:
      fieldRef:
      fieldPath: metadata.namespace
    - name: POD_NAME
      valueFrom:
      fieldRef:
      fieldPath: metadata.name
    
  2. Примените манифест:

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: csi-provisioner
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: csi-provisioner
      template:
        metadata:
          labels:
            app: csi-provisioner
        spec:
          serviceAccount: csi-provisioner
          containers:
            - name: csi-provisioner
              image: dappregistry/1.2/csi-provisioner:v3.3.0
              args:
                - "--csi-address=$(ADDRESS)"
                - "--leader-election"
                - "--http-endpoint=:8080"
              env:
                - name: ADDRESS
                  value: /var/lib/csi/sockets/pluginproxy/mock.socket
              imagePullPolicy: "IfNotPresent"
              volumeMounts:
                - name: socket-dir
                  mountPath: /var/lib/csi/sockets/pluginproxy/
              ports:
                - containerPort: 8080
                  name: http-endpoint
                  protocol: TCP
              livenessProbe:
                failureThreshold: 1
                httpGet:
                  path: /healthz/leader-election
                  port: http-endpoint
                initialDelaySeconds: 10
                timeoutSeconds: 10
                periodSeconds: 20
            - name: mock-driver
              image: quay.io/k8scsi/mock-driver:canary
              env:
                - name: CSI_ENDPOINT
                  value: /var/lib/csi/sockets/pluginproxy/mock.socket
              volumeMounts:
                - name: socket-dir
                  mountPath: /var/lib/csi/sockets/pluginproxy/
          volumes:
            - name: socket-dir
              emptyDir:
    
  3. Добавьте в командную строку флаг --enable-capacity.

  4. Добавьте StorageCapacity: true в информационный объект CSIDriver.

  5. Если Сsi-external-provisioner не развернут StatefulSet, настройте при помощи флага --capacity-ownerref-level какими объектами будет происходить управление CSIStorageCapacity.

  6. Настройте частоту опроса драйвера для обнаружения измененной емкости с помощью флага --capacity-poll-interval.

  7. Настройте количество рабочих потоков, используемых параллельно с помощью флага --capacity-threads.

  8. Включите создание информации также для классов хранения, которые используют немедленную привязку тома с файлом --capacity-for-immediate-binding.

Результат#

Сsi-external-provisioner настроен и готов к использованию.