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

    Обзор

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

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

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

    INFO

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

    Этот документ фокусируется на поведении монтирования и рендеринга. О трафике proxy и аутентификации см. Connectors Proxy. О контроле разрешений и доступе к данным времени выполнения, инициируемом через approval, см. Connectors Approval & Permission Gating.

    Быстрый старт

    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

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

    # List all mounted files (including built-in configurations)
    kubectl exec -ti csi-demo -- ls -l /tmp/config
    
    # View the custom configuration from ConnectorClass
    kubectl exec -ti csi-demo -- cat /tmp/config/.gitconfig

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

    CSI Driver автоматически предоставляет встроенные файлы конфигурации, которые по умолчанию монтируются в Pods. Вы можете исключить отдельные смонтированные файлы, используя !<fileName> в configuration.names (например, !context.token), включая как встроенные файлы, так и файлы ConnectorClass, выбранные через configuration.names.

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

    Использование Forward Proxy:

    # Option 1
    export http_proxy=$(cat /{mount-path}/http.proxy)
    export https_proxy=$(cat /{mount-path}/https.proxy)
    
    # Option 2
    source /{mount-path}/.env

    Использование Reverse Proxy:

    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 (Deprecated — use connectors instead)
    connector.namespaceНетNamespace Connector, по умолчанию используется namespace Pod (Deprecated — use connectors instead)
    configuration.namesНетСелекторы, разделенные запятыми. Используйте имена конфигураций (например, config1,config2), чтобы включить конфигурации ConnectorClass; используйте !<fileName> (например, !context.token), чтобы исключить определенные файлы из итогового смонтированного вывода.
    configuration.paramsНетСтрока JSON с runtime-параметрами для именованных конфигураций (см. configuration.params)
    token.expirationНетВремя истечения срока действия токена (по умолчанию: 30m)
    connectorsДаСписок Connectors, разделенный запятыми, в формате namespace/name или name; если namespace не указан, используется namespace Pod. Используется для указания нескольких Connectors.

    Примеры

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

    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"

    Монтирование нескольких Connectors для аутентификации proxy:

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

    Исключение определенных смонтированных файлов:

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

    Исключение встроенного файла при монтировании только встроенных конфигураций:

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

    Примечания:

    • Если configuration.names не указан, монтируются только встроенные конфигурации
    • Когда несколько конфигураций содержат файлы с одинаковым именем, более поздние конфигурации перезаписывают более ранние
    • Исключения (!<fileName>) применяются к итоговым именам смонтированных файлов после сборки и объединения конфигураций.
    • Если указаны имена включаемых конфигураций, но ни одна из них не найдена, запрос завершается с ошибкой даже при наличии исключений.
    • Параметр connectors используется для указания нескольких Connectors для монтирования конфигурации.

    configuration.params

    configuration.params позволяет вызывающей стороне передавать runtime-параметры в шаблоны конфигурации во время монтирования. Каждая конфигурация в ConnectorClass может объявлять набор именованных параметров; configuration.params передает значения для этих параметров при создании CSI volume.

    Формат

    Значение представляет собой JSON-объект, ключами которого являются имена конфигураций, а каждое значение — это объект пар key-value:

    configuration.params: '{"<configName>": {"key": "value", ...}, ...}'

    Пример — передача mirrorRepository в конфигурацию settings и registry в конфигурацию npmrc в одном монтировании:

    volumeAttributes:
      configuration.names: "settings,npmrc"
      configuration.params: '{"settings": {"mirrorRepository": "maven-public"}, "npmrc": {"registry": "npm-proxy"}}'

    Область действия по имени конфигурации позволяет сохранять параметры неизменными независимо от того, сколько Connectors смонтировано и как они называются. Значения, специфичные для Connector, должны находиться в Connector.spec.params и доступны в шаблонах через .connectors[i].spec.params.

    Как работают значения по умолчанию

    Когда конфигурация ConnectorClass объявляет параметр со значением по умолчанию и вызывающая сторона его не указывает, CSI Driver автоматически подставляет значение по умолчанию перед рендерингом шаблона. В configuration.params явное значение не требуется.

    Пример — у strictSSL значение по умолчанию равно "true", поэтому его можно не указывать:

    # This is equivalent to passing '{"npmrc": {"registry": "npm-proxy", "strictSSL": "true"}}'
    configuration.params: '{"npmrc": {"registry": "npm-proxy"}}'

    Доступные переменные в шаблонах

    После обработки переданные (и значения по умолчанию) параметры доступны в шаблоне конфигурации как .configurations.<paramName>:

    {{ .configurations.mirrorRepository }}
    {{ .configurations.registry }}

    Несколько Connectors

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

    INFO

    Перед использованием нескольких Connectors в одном CSI volume включите флаг функциональности enable-multi-connector в connectors-config. Подробности см. в Feature Flags.

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

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

    WARNING

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

    Объединение конфигураций

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

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

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

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

    Шаблоны конфигурации должны поддерживать рендеринг данных для нескольких Connectors, чтобы один файл мог включать несколько наборов данных, специфичных для 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/
    # Output:
    # - .multi-connector-config
    WARNING

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

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

    Когда у указанных Connectors разные имена конфигураций, CSI Driver смонтирует все конфигурации отдельно.

    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"

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

    kubectl exec -ti pod-name -- ls -l /mount-path/
    # Output:
    # - config.xml
    # - settings.json

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

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

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

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

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

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

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

    О службе proxy

    Connectors предоставляют службу proxy для каждого 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 }}

    Использование службы proxy и token

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

    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 }}

    Следующие шаги