• Русский
  • Connectors CSI Driver

    Overview

    Драйвер Connectors CSI — это драйвер хранения, реализованный на основе спецификации Container Storage Interface (CSI). Он позволяет монтировать конфигурации из Connector в виде томов в Kubernetes workloads. Основные возможности включают:

    • Монтирование конфигурационных файлов из Connector в Pods
    • Поддержка динамического рендеринга переменных в конфигурационных файлах для автоматической подстановки информации во время выполнения
    • Поддержка одновременного монтирования нескольких конфигурационных файлов

    Все данные конфигурации берутся из ConnectorClass configuration, связанной с Connector.

    Quick Start

    1. Создайте ConnectorClass

    Сначала создайте ConnectorClass, который включает конфигурацию Git:

    cat << EOF | kubectl apply -f -
    apiVersion: connectors.alauda.io/v1alpha1
    kind: ConnectorClass
    metadata:
      name: my-git
    spec:
      address:
        type: string
      configurations:
      - name: config
        data:
          .gitconfig: |
            this is git config
    EOF

    2. Создайте Connector

    Затем создайте Connector, который подключается к GitHub:

    cat << EOF | kubectl apply -f -
    apiVersion: connectors.alauda.io/v1alpha1
    kind: Connector
    metadata:
      name: git-connector
    spec:
      address: https://github.com
      connectorClassName: my-git
    EOF

    3. Создайте Pod с использованием CSI Driver

    Создайте Pod, который монтирует конфигурацию:

    cat << EOF | kubectl create -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: csi-demo
      namespace: default
    spec:
      restartPolicy: Never
      containers:
      - name: web
        image: bitnami/git:2.47.1
        imagePullPolicy: IfNotPresent
        command: ["sleep", "3600"]
        volumeMounts:
        - name: git-config
          mountPath: /tmp/config
      volumes:
      - name: git-config
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connectors: "default/git-connector"
            configuration.names: "config"
    EOF

    Проверьте смонтированные файлы:

    # Вывести список всех смонтированных файлов (включая встроенные конфигурации)
    kubectl exec -ti csi-demo -- ls -l /tmp/config
    
    # Просмотреть пользовательскую конфигурацию из ConnectorClass
    kubectl exec -ti csi-demo -- cat /tmp/config/.gitconfig

    Встроенные конфигурации

    Драйвер CSI автоматически предоставляет встроенные конфигурационные файлы, которые всегда монтируются в Pods.

    Имя файлаОписание
    .envФайл переменных окружения, содержащий http_proxy, https_proxy и no_proxy в формате key=value.
    Если присутствует несколько Connector Categories, применяются настройки прокси из последнего ConnectorClass.
    http.proxyURL форвард-прокси с аутентификацией для HTTP.
    Если присутствует несколько Connector Categories, применяются настройки прокси из последнего ConnectorClass.
    https.proxyURL форвард-прокси с аутентификацией для HTTPS.
    Если присутствует несколько Connector Categories, применяются настройки прокси из последнего ConnectorClass.
    context.tokenТокен аутентификации для прокси-сервиса
    context.proxy.caCertCA-сертификат для прокси Connectors
    connector.status.proxyAddressАдрес прокси (см. Connectors Proxy).
    Если присутствует несколько Connectors, используется информация прокси из последнего ConnectorClass.
    ca.certCA-сертификат для прокси Connectors, совпадает с context.proxy.caCert

    Использование форвард-прокси:

    # Вариант 1
    export http_proxy=$(cat /{mount-path}/http.proxy)
    export https_proxy=$(cat /{mount-path}/https.proxy)
    
    # Вариант 2
    source /{mount-path}/.env

    Использование реверс-прокси:

    export TOKEN=$(cat /{mount-path}/context.token)
    export SERVER=$(cat /{mount-path}/connector.status.proxyAddress)
    
    {cli} --server $SERVER --token $TOKEN

    Параметры тома CSI

    Параметры тома

    ПараметрОбязательныйОписание
    readOnlyДаДолжен быть true
    driverДаДолжен быть connectors-csi

    Атрибуты тома

    ПараметрОбязательныйОписание
    connector.nameНетИмя Connector (устарело — используйте connectors)
    connector.namespaceНетПространство имён Connector, по умолчанию пространство имён Pod (устарело — используйте connectors)
    configuration.namesНетИмена конфигураций через запятую (например, config1,config2), имена конфигураций — это имена конфигураций в ConnectorClass
    token.expirationНетВремя истечения токена (по умолчанию: 30m)
    connectorsДаСписок Connector через запятую в формате namespace/name или name; если пространство имён опущено, используется пространство имён Pod. Используется для указания нескольких Connector.

    Примеры

    Монтирование одной конфигурации:

    volumes:
    - name: config
      csi:
        driver: connectors-csi
        readOnly: true
        volumeAttributes:
          connectors: "my-connector"
          configuration.names: "config1"

    Монтирование нескольких конфигураций:

    volumes:
    - name: config
      csi:
        driver: connectors-csi
        readOnly: true
        volumeAttributes:
          connectors: "my-connector"
          configuration.names: "config1,config2"

    Монтирование нескольких Connector для аутентификации через прокси:

    volumes:
    - name: config
      csi:
        driver: connectors-csi
        readOnly: true
        volumeAttributes:
          connectors: "namespace1/connector1,namespace2/connector2"
          configuration.names: "config1,config2"

    Примечания:

    • Если configuration.names опущен, монтируются только встроенные конфигурации
    • Если в нескольких конфигурациях есть файлы с одинаковыми именами, более поздние конфигурации перезаписывают более ранние
    • Параметр connectors используется для указания нескольких Connector для монтирования конфигураций.

    Несколько Connector

    Драйвер Connectors CSI поддерживает использование нескольких Connector для конфигураций. Вы можете указать несколько Connector с помощью атрибута тома connectors в формате namespace/name или name; если пространство имён опущено, используется пространство имён Pod. Connector разделяются запятыми.

    volumes:
    - name: config
      csi:
        driver: connectors-csi
        readOnly: true
        volumeAttributes:
          connectors: "namespace1/connector1,namespace2/connector2"
          configuration.names: "config1,config2"

    При указании нескольких Connector драйвер CSI объединяет конфигурационные файлы на основе атрибута configuration.names. Поведение слияния описано в разделе Configuration Merging.

    WARNING

    Нет строгого ограничения на количество Connector, которые вы можете указать; однако избегайте слишком большого количества Connector, чтобы не возникали проблемы с избыточным размером заголовков запросов и другие проблемы, связанные с прокси.

    Слияние конфигураций

    При указании нескольких Connector драйвер CSI объединяет конфигурационные файлы всех указанных Connector на основе атрибута configuration.names.

    Существует несколько возможных сценариев обработки конфигурационных файлов; ниже описано поведение в каждом случае.

    Одинаковое имя конфигурации

    Для Connector с одинаковым именем конфигурации, при указании нескольких Connector, их данные конфигурации будут объединены в один конфигурационный файл.

    Шаблоны конфигураций должны поддерживать рендеринг данных для нескольких Connector, чтобы один файл мог включать несколько наборов данных, специфичных для каждого Connector.

    Например:

    apiVersion: connectors.alauda.io/v1alpha1
    kind: ConnectorClass
    metadata:
      name: multi-connector
    spec:
      configurations:
      - name: config
        data:
          .multi-connector-config: |
            {{- range .connectors }}
            # Configuration for Connector: {{ .name }}
            param_name = {{ .name }}
            param_value = {{ .spec.address }}
            {{- end }}

    В приведённом примере конфигурационный файл .multi-connector-config будет содержать секции для каждого Connector, указанного в атрибуте тома connectors.

    kubectl exec -ti pod-name -- ls -l /mount-path/
    # Вывод:
    # - .multi-connector-config
    WARNING

    Если объединённые Connector принадлежат разным ConnectorClass и имеют конфигурационные файлы с одинаковыми именами, конфигурация из более позднего ConnectorClass перезапишет конфигурацию из более раннего ConnectorClass. Поэтому рекомендуется использовать разные имена конфигурационных файлов в таком сценарии, чтобы избежать конфликтов.

    Разные имена конфигураций

    Если указанные Connector имеют разные имена конфигураций, драйвер CSI смонтирует все конфигурации отдельно.

    apiVersion: connectors.alauda.io/v1alpha1
    kind: ConnectorClass
    metadata:
      name: connector-a
    spec:
      configurations:
      - name: config-a
        data:
          config.xml: |
            {{- range .connectors }}
            # Configuration for Connector: {{ .name }}
            param_name = {{ .name }}
            param_value = {{ .spec.address }}
            {{- end }}
    ---
    apiVersion: connectors.alauda.io/v1alpha1
    kind: ConnectorClass
    metadata:   
      name: connector-b
    spec:
      configurations:
      - name: config-b
        data:
          settings.json: |
            {"connectors": [
            {{- range .connectors }}
              {"name": "{{ .name }}", "address": "{{ .spec.address }}"},
            {{- end }}
            ]}

    При монтировании с указанием и connectors, и configuration.names:

    - name: config
      csi:
        driver: connectors-csi
        readOnly: true
        volumeAttributes:
          connectors: "namespace-a/connector-a,namespace-b/connector-b"
          configuration.names: "config-a,config-b"

    В смонтированном томе будут присутствовать как config.xml, так и settings.json, каждый из которых заполнен данными соответствующих Connector.

    kubectl exec -ti pod-name -- ls -l /mount-path/
    # Вывод:
    # - config.xml
    # - settings.json

    Рендеринг конфигурационных файлов

    Драйвер CSI выполняет рендеринг переменных при монтировании конфигурационных файлов, используя синтаксис Go template.

    Доступные переменные

    ПеременнаяОписание
    .connector.status.proxyAddressАдрес прокси Connector; см. connectors-proxy
    .connector.spec.*Спецификация Connector, можно получить все поля Spec Connector, например .connector.spec.address или .connector.spec.params
    .context.tokenТокен аутентификации для доступа к прокси-сервису
    .context.proxy.caCertCA-сертификат для доступа к прокси Connectors (форвард-прокси); см. connectors-proxy
    .connectorsСписок Connector при указании нескольких Connector; каждый Connector имеет ту же структуру, что и .connector
    .connectorclass.proxyAddressАдрес прокси ConnectorClass при указании нескольких ConnectorClass

    Встроенные функции

    См. sprig для поддерживаемых функций

    Например: b64enc: Base64-кодирование строки

    О прокси-сервисе

    Connectors предоставляют прокси-сервис для каждого Connector, позволяя клиентам получать доступ к целевым ресурсам без необходимости хранить оригинальные учетные данные. Подробнее см. в connectors-proxy.

    Примеры конфигураций

    Постоянное содержимое

    apiVersion: connectors.alauda.io/v1alpha1
    kind: ConnectorClass
    metadata:
      name: my-git
    spec:
      address:
        type: string
      configurations:
      - name: config
        data:
          .gitconfig: |
            this is git config

    Использование connector.spec.params

    Следующий ConnectorClass определяет параметр sslVerify для управления проверкой SSL при выполнении git clone.

    kind: ConnectorClass
    metadata:
      name: git
    spec:
    
      params:
      - name: sslVerify
        type: string
        default: "true"
    
      configurations:
      - name: config
        data:
          .gitconfig: |
            {{ $sslVerify := "true" -}}
            {{- range .connector.spec.params }}{{- if eq .name "sslVerify" }}{{$sslVerify = .value }}{{ end }}{{- end }}
            [http]
              sslVerify = {{ $sslVerify }}

    Использование прокси-сервиса и токена

    Следующий ConnectorClass предоставляет файл с именем .gitconfig, который автоматически вставляет заголовки и заменяет URL git при выполнении git clone, используя прокси-сервис и токен.

    kind: ConnectorClass
    metadata:
      name: git
    spec:
      configurations:
      - name: config
        data:
          .gitconfig: |
            [http]
                extraHeader = Authorization: Basic {{ printf ":%s" .context.token | b64enc }}
            {{- range .connectors }}
            [url "{{ .status.proxyAddress }}"]
                insteadOf = {{.spec.address}}
            {{- end }}