ConnectorClass
Содержание
ОбзорИнформация об адресеПараметрыИнформация об аутентификацииТип аутентификацииПараметры аутентификацииНеобязательная аутентификацияLiveness ProbeПроверка с помощью HTTP-запросовПроверка с помощью API ConnectorClassAuthentication ProbeПроверка с помощью HTTP-запросовПроверка с помощью API ConnectorClassПользовательские параметры проверки аутентификацииВыражения проверки аутентификацииКонфигурация логики аутентификации на основе RegoДоступные переменные в RegoПримеры политик RegoРасширенные техники RegoConnectorClass APIКонфигурация адреса APIРазрешение адреса APIОписание OpenAPIВозможности конфигурацииТипы конфигурацийПользовательские конфигурацииМетаданные для удобочитаемого отображенияProxy ConnectorClassИспользование Rego для извлечения токена из запросаТип ResolverИнформация о статусеСовместимостьДополнительные примерыДополнительноОбзор
ConnectorClass — это ресурс на уровне кластера, который определяет режимы доступа и спецификации поведения для определённых типов инструментов.
В следующем примере определяется коннектор типа hello-git, поддерживающий базовую аутентификацию:
В ConnectorClass режимы доступа и спецификации поведения для подключения инструментов к платформе определяются описанием следующей информации:
- Формат адреса доступа к инструменту
- Поддерживаемые методы аутентификации
- Как проверять доступность инструмента
- Как проверять валидность аутентификации
- Как инструмент предоставляет API-возможности
- Какие возможности конфигурации предоставляет инструмент
- Метаданные для отображения в удобочитаемом виде
В этом документе также приведены примеры, помогающие лучше понять, как настраивать ConnectorClass. Примеры
Информация об адресе
Информация об адресе определяет формат доступа к инструменту. В настоящее время поддерживаются конфигурации адреса типа string. Эта информация ограничивает тип поля, которому должен соответствовать текущий тип инструмента.
Это означает, что адрес для подключения инструмента к платформе должен быть типа string.
Параметры
Параметры используются для определения дополнительных параметров при создании коннектора.
Вы можете определить обязательные параметры для создания коннектора с помощью поля spec.params в connectorclass.
spec.params[].name— имя параметра.spec.params[].type— тип параметра. В настоящее время поддерживается только типstring.spec.params[].default— значение параметра по умолчанию (необязательно). Если задано значение по умолчанию, пользователь может опустить этот параметр при создании коннектора.spec.params[].description— описание параметра (необязательно).
Например, следующее определение позволяет пользователям указывать параметр sslVerify при создании коннектора типа git, со значением по умолчанию true.
Для конфигурации параметров при создании Connectors смотрите документацию по Connector.
В сочетании с возможностями connectors-csi-driver это позволяет более гибко настраивать конфигурацию. Особенно полезно, когда нужно предоставить параметризуемые настройки. Например, при создании коннектора типа git пользователь может указать параметр sslVerify для управления проверкой SSL-сертификата. Подробнее см. в документации ConnectorClass Configuration.
Информация об аутентификации
Тип аутентификации
Тип аутентификации определяет тип учётных данных, используемых для аутентификации инструмента. Инструмент может поддерживать несколько типов аутентификации, позволяя пользователям выбирать один из них при использовании инструмента.
Пользователь может уникально назвать текущий тип аутентификации через
spec.auth.types[].name, который должен быть уникальным и не повторяться.spec.auth.types[].secretType, который указывает типSecret, необходимого для аутентификации, соответствующий типу Kubernetes Secret.
Пример:
В встроенных типах K8S Secret все типы, кроме Opaque, имеют ограничения по полям. При предоставлении Secret пользователь должен убедиться, что поля Secret соответствуют ограничениям типа.
При использовании типа Opaque необходимо объявить параметры аутентификации.
Как и в k8s, можно использовать собственный тип Secret. В этом случае также нужно объявить параметры аутентификации.
Параметры аутентификации
Параметры, необходимые для учётных данных при аутентификации, определяются в spec.auth.types[].params.
Для стандартных типов Kubernetes Secret с чётко определёнными полями данных параметры можно опустить. Например:
kubernetes.io/basic-auth: аутентификация по имени пользователя и паролюkubernetes.io/ssh-auth: аутентификация по SSH-ключу
Для пользовательских типов аутентификации можно определить необходимые параметры аутентификации, при этом secretType указывается как Opaque или пользовательское имя.
Например, для аутентификации GitLab с использованием Personal Access Token (PAT):
Это определение требует, чтобы учётные данные, используемые в коннекторе инструмента, содержали поля, указанные в params.
Необязательная аутентификация
Некоторые инструменты поддерживают доступ без аутентификации, что отмечается полем optional, указывающим, является ли аутентификация необязательной:
Например, следующий пример указывает, что учётные данные для basicAuth необязательны, а для sshAuth обязательны.
В этом случае при подключении такого типа инструмента к платформе аутентификация типа basicAuth может быть опущена.
Liveness Probe
Проверка доступности используется для проверки, можно ли нормально получить доступ к инструменту. Конфигурация способа проведения такой проверки задаётся через поле livenessProbe.
Проверка доступности может выполняться с помощью HTTP-запросов или API ConnectorClass.
Проверка с помощью HTTP-запросов
Вы можете настроить spec.livenessProbe.http для выполнения проверки доступности с помощью HTTP-запросов.
Пример
Следующий фрагмент указывает, что проверка выполняется с помощью HTTP-запросов.
Если инструмент возвращает статус 200, он считается доступным.
Подробнее см. Probe using HTTP Requests in Authentication Probe. Конфигурация идентична, за исключением путей полей.
Проверка с помощью API ConnectorClass
Вы можете настроить spec.livenessProbe.api для выполнения проверки доступности с помощью API ConnectorClass.
Пример
Следующий фрагмент указывает, что проверка выполняется с помощью API ConnectorClass.
Подробнее см. Probe using ConnectorClass API in Authentication Probe. Конфигурация идентична, за исключением путей полей.
Authentication Probe
Проверка аутентификации используется для проверки валидности учётных данных аутентификации для инструментов данного типа. Если проверка аутентификации не требуется, поле authProbes можно опустить.
spec.authProbes[].authNameуказывает тип аутентификации, который проверяется, и должен совпадать с одним из имён, определённых вspec.auth.types[].name.
Проверка аутентификации может выполняться с помощью HTTP-запросов или API ConnectorClass.
Проверка с помощью HTTP-запросов
Вы можете настроить spec.authProbes[].probe.http для выполнения проверки аутентификации с помощью HTTP-запросов.
spec.authProbes[].probe.http.hostуказывает целевой хост для проверки аутентификации. По умолчанию берётся хост из адреса коннектора.spec.authProbes[].probe.http.pathуказывает путь запроса для проверки аутентификации. Это абсолютный путь, который будет добавлен к URI хоста, разрешённому изspec.addressконнектора при выполнении проверки. Еслиspec.addressсодержит префикс пути, он игнорируется при проверке аутентификации. Чтобы включить префикс пути, используйтеAuthentication Check Expressionsдля динамического получения.spec.authProbes[].probe.http.methodуказывает HTTP-метод для проверки аутентификации, поддерживаются GET и POST. По умолчанию GET.spec.authProbes[].probe.http.disableRedirectуказывает, отключать ли HTTP-перенаправления при проверке аутентификации. По умолчанию false (автоматическое перенаправление разрешено).spec.authProbes[].probe.http.httpHeadersуказывает HTTP-заголовки, которые будут включены в запросы проверки аутентификации.spec.authProbes[].probe.http.schemeуказывает схему URI для проверки аутентификации. По умолчанию берётся схема из адреса коннектора.
Пример
Следующая YAML-конфигурация демонстрирует, что при проверке аутентификации система отправит запрос GET https://example.com/ HTTP/1.1 к адресу коннектора с заголовком Authorization: abc.
Проверка с помощью API ConnectorClass
Вы можете настроить spec.authProbes[].probe.api для выполнения проверки аутентификации с помощью API ConnectorClass. Для этого сначала необходимо настроить spec.api в спецификации ConnectorClass. Ответ 200 означает успешную аутентификацию, а 401 или 403 — ошибку аутентификации. Подробнее о ConnectorClass API.
spec.authProbes[].probe.api.pathуказывает путь конечной точки API для проверки аутентификации. Это относительный путь, который будет добавлен к адресу API, разрешённому из конфигурацииspec.apiConnectorClass. Еслиspec.apiсодержит префикс пути, он будет включён при выполнении проверки аутентификации.
Пример
Следующая YAML-конфигурация демонстрирует, что при проверке аутентификации система отправит запрос GET https://example-api.default.svc.cluster.local/api/auth/check HTTP/1.1 к API ConnectorClass.
Пользовательские параметры проверки аутентификации
Некоторые сценарии проверки аутентификации могут требовать дополнительных параметров, например, указания имени репозитория при проверке доступа к Git-репозиторию. Эти параметры можно определить с помощью spec.authProbes[].params.
Выражения проверки аутентификации
При настройке authProbes можно использовать выражения для динамического получения информации об учётных данных или метаданных Connector.
Например:
- Выражения можно использовать в полях
probe.http.httpHeaders,probe.http.pathиprobe.api.path. - Формат выражений соответствует синтаксису Go template.
- Поддерживаемые верхнеуровневые поля включают:
.Connector: содержит информацию о самом ресурсе Connector.Secret: содержит данные Secret, используемого для аутентификации Connector
- Доступные методы в выражениях документированы в библиотеке sprig:
- Например:
b64encдля Base64-кодирования строк,trimPrefixдля удаления префиксов строк
- Например:
Пример
Проверка базовой аутентификации:
Коннектор выполнит проверку аутентификации на основе конфигурации, определённой в ConnectorClass.
В приведённом YAML показана проверка базовой аутентификации:
path: использует значениеrepositoryизauth.paramsConnector, формируя путь как/<repository>/info/refs?service=git-upload-packAuthorization: при наличии Secret в Connector поляusernameиpasswordкодируются в Base64 и включаются в заголовок Basic аутентификации.
Конфигурация логики аутентификации на основе Rego
Когда коннекторам инструментов требуется более сложная логика аутентификации, можно использовать конфигурацию логики аутентификации на основе Rego.
Rego — декларативный язык политик, позволяющий определять логику аутентификации. В ConnectorClass политики Rego указываются в поле auth.types[].generator.rego:
Политика Rego должна соответствовать следующим правилам:
- Определять правила в пакете proxy
- Возвращать объект auth со следующей структурой:
- position: место вставки аутентификации, например "header", "query" или "body"
- contentType: тип содержимого для вставки в тело (необязательно, используется с позицией "body")
- auth: карта ключ-значение аутентификации
Доступные переменные в Rego
Примеры политик Rego
Базовая аутентификация
Аутентификация с API ключом
Аутентификация с JSON телом
Расширенные техники Rego
Можно использовать условную логику Rego для разных методов аутентификации:
Условная аутентификация
Аутентификация на основе времени
Для подробностей по языку Rego смотрите:
ConnectorClass API
API ConnectorClass позволяет разработчикам расширять возможности API для ConnectorClass через дополнительный HTTP API сервис. Это предоставляет RESTful API для ConnectorClass, позволяя клиентам легко получать доступ к ресурсам внутри инструментов при использовании Connectors.
Если нет необходимости предоставлять кастомные API-возможности для инструмента, spec.api можно не задавать.
Конфигурация адреса API
API ConnectorClass настраивается в поле spec.api. Вы можете указать сервис API тремя способами:
1. Через ссылку на Kubernetes Service:
2. Через ссылку на Service с префиксом URI:
Если у API есть фиксированный префикс пути, его можно указать через spec.api.uri:
3. Через абсолютный URI:
Также можно использовать spec.api.uri для указания абсолютного пути API:
Разрешение адреса API
Независимо от способа конфигурации, окончательный разрешённый адрес API будет храниться в status.api.address.url. Например:
Для дополнительной информации смотрите:
Описание OpenAPI
Описание OpenAPI — это необязательная конфигурация, которая служит двум основным целям:
- Отметить, является ли API кастомным или использует Connector Proxy для доступа к оригинальному API инструмента
- Предоставить определения API для поддержки ссылок на API в динамических формах клиента
Вы можете определить описание OpenAPI с помощью spec.api.openapi. Структура соответствует спецификации OpenAPI 3.0. Например:
Вы можете определить расширенное поле x-provider-type в путях API, чтобы отметить, является ли API кастомным или использует Proxy для доступа к оригинальному API инструмента. Допустимые значения: api или proxy.
Расширение x-provider-type определяется как: api.openapi.paths[<path>].<verb>[x-provider-type]
Пример:
Когда клиенты запрашивают Connector API, система Connectors определяет, использовать ли кастомный API или напрямую использовать Connectors Proxy для доступа к оригинальному API инструмента, основываясь на значении x-provider-type в ConnectorClass, соответствующем текущему Connector. Если эта информация отсутствует или не найдено совпадение по пути API, система по умолчанию использует Connectors Proxy для доступа к оригинальному API инструмента.
Если необходимо ссылаться на API в динамических формах, требуется дополнительная настройка в spec.api.openapi. Подробнее см. Использование Connectors API в динамических формах.
Возможности конфигурации
Возможности конфигурации определяют конфигурационные файлы, которые ConnectorClass предоставляет клиентам. Эти файлы могут быть смонтированы в Pods с помощью Connectors-CSI Driver.
Типы конфигураций
- Пользовательские конфигурации: определяются в
spec.configurations - Встроенные конфигурации: автоматически предоставляются Connectors-CSI Driver (см. Встроенные конфигурации)
Пользовательские конфигурации
Конфигурации задаются через spec.configurations:
Подробнее см.: Рендеринг конфигурационных файлов
Примечание: spec.configurations является необязательным. Если не задано, доступны только встроенные конфигурации.
Метаданные для удобочитаемого отображения
ConnectorClass — это стандартный ресурс k8s, который можно помечать пользовательской информацией с помощью labels и annotations.
Например:
Например:
Proxy ConnectorClass
Proxy ConnectorClass используется для настройки адреса прокси для ConnectorClass.
Proxy ConnectorClass настраивается через spec.proxy. Например:
Connector будет использовать адрес прокси для проксирования запросов к ConnectorClass. Подробнее
Использование Rego для извлечения токена из запроса
При использовании встроенного обратного прокси можно настроить правила Rego с помощью spec.proxy.authExtractor для извлечения токенов из запросов клиентов, что позволяет встроенному обратному прокси проверять аутентификацию клиента с помощью извлечённого токена.
Например:
Правила Rego должны соответствовать следующим требованиям:
- Правила должны быть определены в пакете
proxy - Используйте переменную
authдля возврата токена, где токен — строка, например:auth = { "token": "abcd1234" } - Если токен не может быть извлечён, возвращайте пустую строку, например:
auth = { "token": "" }
В Rego доступны следующие переменные:
Примечания:
- Ключи заголовков в
headersиспользуют формат Canonical MIME Header Key (первая буква заглавная) - При реализации правил Rego обеспечьте устойчивую логику. Например, возвращайте пустую строку, если
input.request.headersравен null или пуст.
Пример
Этот пример демонстрирует устойчивое извлечение токена за счёт:
- Определения правила по умолчанию, возвращающего пустую строку токена
- Проверки существования и ненулевого значения заголовков перед доступом к ним
- Проверки наличия ключа заголовка и наличия хотя бы одного значения
Для более продвинутых правил Rego смотрите документацию Rego Policy Language. Для дополнительной информации по использованию встроенного обратного прокси смотрите Connectors Proxy.
Тип Resolver
Адрес прокси ConnectorClass будет разрешаться в соответствии с указанным типом resolver.
Тип resolver настраивается через аннотации connectors.cpaas.io/proxy-resolver. Например:
Это соглашение между ConnectorClass-Proxy и Connector. Необязательно.
Поддерживаемые значения: host, path. По умолчанию host.
- Формат
host:http://{.ConnectorClass.Status.ProxyAddress.URL} - Формат
path:http://{.ConnectorClass.Status.ProxyAddress.URL}/namespaces/{namespace}/connectors/{connector-name}
Информация о статусе
После определения ресурса ConnectorClass информация о статусе будет храниться в status.
Типы status.conditions включают:
APIReady: статус API-возможностейProxyReady: статус Proxy-возможностейReady: общий статус текущего ConnectorClass
Условие Ready
Условие Ready используется для обозначения статуса текущего ConnectorClass. Оно агрегирует статусы других условий.
- Если все другие условия True, текущее условие True.
- Если любое другое условие False, текущее условие False.
- Если любое другое условие Unknown, текущее условие Unknown.
Условие APIReady
Отражает статус API-сервиса, настроенного для ConnectorClass. API-сервис настраивается через spec.api ConnectorClass.
Примечание:
- Проверка API выполняет только попытку запроса и не оценивает HTTP-статусы. Проверка здоровья API-сервиса должна опираться на собственный механизм проверки здоровья API.
- Поскольку API-сервис может изменяться в любой момент, статус не отражает информацию в реальном времени. Рекомендуется использовать статус как подсказку, а не для блокировки поведения клиента.
Условие ProxyReady
Отражает статус Proxy-сервиса, настроенного для ConnectorClass. Proxy-сервис настраивается через spec.proxy ConnectorClass.
Совместимость
Обновления ConnectorClass могут повлиять на существующие Connectors. Если в ConnectorClass внесены несовместимые изменения, это может привести к неработоспособности ранее созданных Connectors. Возможные изменения, приводящие к несовместимости:
-
Изменения в информации об аутентификации: если ConnectorClass изменяет поддерживаемые типы или методы аутентификации, это может привести к сбоям Connectors, использующих старый метод аутентификации.
-
Изменения в конфигурационной информации: если изменяется конфигурация ConnectorClass, например, удаляется существующая конфигурация, это может привести к сбоям Kubernetes workloads, зависящих от старой конфигурации.
Рекомендуется тщательно оценивать зону влияния при обновлении ConnectorClass или при необходимости создавать новый ConnectorClass.
Дополнительные примеры
-
ConnectorClass, поддерживающий тип аутентификации
basic-auth -
ConnectorClass с пользовательским типом аутентификации
-
ConnectorClass с настроенной
liveness probe -
ConnectorClass с настроенной
auth probe -
Полный пример конфигурации git-коннектора: