ConnectorClass
目录
概述地址信息参数认证信息认证类型认证参数可选认证存活探针通过 HTTP 请求探测通过 ConnectorClass API 探测认证探针通过 HTTP 请求探测通过 ConnectorClass API 探测自定义认证验证参数认证验证表达式基于 Rego 的认证逻辑配置Rego 中可用变量Rego 策略示例高级 Rego 技巧ConnectorClass API配置 API 地址API 地址解析OpenAPI 描述配置能力配置类型自定义配置可读性展示的元数据信息ConnectorClass 代理使用 Rego 从请求中提取令牌解析器类型状态信息兼容性更多示例更多概述
ConnectorClass 是一个集群级别的资源,用于定义特定类型工具的访问模式和行为规范。
以下示例定义了一个支持基本认证的 hello-git 类型连接器:
在 ConnectorClass 中,通过描述以下信息定义连接工具到平台的访问模式和行为规范:
- 工具访问地址的格式
- 支持的认证方式
- 如何检查工具的可访问性
- 如何验证认证的有效性
- 工具如何提供 API 能力
- 工具提供哪些配置能力
- 用于可读性展示的元数据
本文档还提供示例,帮助读者更好地理解如何自定义 ConnectorClass。示例
地址信息
地址信息定义了访问工具的格式。目前支持字符串类型的地址配置。该地址信息限制了当前类型工具必须满足的字段类型约束。
此时表示连接工具到平台的地址信息必须为 string 类型。
参数
参数用于定义创建连接器时的额外参数。
你可以通过 connectorclass 的 spec.params 字段定义连接器创建时的必需参数。
spec.params[].name- 参数名称。spec.params[].type- 参数类型。目前仅支持string类型。spec.params[].default- 默认参数值(可选)。提供默认值时,用户创建连接器时可省略该参数。spec.params[].description- 参数描述(可选)。
例如,以下定义允许用户在创建 git 类型连接器时提供一个 sslVerify 参数,默认值为 true。
关于创建 Connector 时的参数配置,请参考 Connector 文档。
结合 connectors-csi-driver 的能力,可以实现更灵活的配置。这在需要提供参数化配置时非常有用。例如,创建 git 类型连接器时,用户可以提供 sslVerify 参数来控制 SSL 证书验证。详情请参考 ConnectorClass 配置能力 文档。
认证信息
认证类型
认证类型定义了用于工具认证的凭证类型。一个工具可以支持多种认证类型,允许用户在使用时选择其中一种。
用户可以通过以下方式为当前认证类型命名唯一标识:
spec.auth.types[].name,必须唯一且不可重复。spec.auth.types[].secretType,指定认证所需的Secret类型,对应 Kubernetes Secret 类型。
示例:
在内置的 K8S Secret 类型中,除 Opaque 外所有类型都有字段约束。提供 Secret 时,用户必须确保 Secret 的字段符合类型约束。
使用 Opaque 类型时,必须声明认证参数。
同样,你也可以使用自定义的 Secret 类型,此时必须声明认证参数。
认证参数
认证凭证所需的参数由 spec.auth.types[].params 定义。
对于字段明确的标准 Kubernetes Secret 类型,可以省略参数。例如:
kubernetes.io/basic-auth:用户名和密码认证kubernetes.io/ssh-auth:SSH 密钥认证
对于自定义认证类型,可以定义所需的认证参数,此时 secretType 标记为 Opaque 或自定义名称。
例如,GitLab 的个人访问令牌(PAT)认证:
该定义要求工具连接器使用的凭证包含 params 中指定的字段。
可选认证
部分工具支持无认证访问,通过 optional 字段标记认证是否可选:
例如,以下表示 basicAuth 的凭证为可选,而 sshAuth 凭证为必需。
此时,连接该类型工具到平台时,可以省略 basicAuth 类型的认证。
存活探针
可访问性检查用于验证工具是否能正常访问。该类型的配置通过 livenessProbe 字段完成。
存活检查可以通过 HTTP 请求或 ConnectorClass API 进行。
通过 HTTP 请求探测
你可以配置 spec.livenessProbe.http 使用 HTTP 请求进行存活检查。
示例
以下片段表示使用 HTTP 请求进行检测。
当工具返回 200 状态时,视为可访问。
详情请参考认证探针中的 HTTP 请求探测,配置完全相同,仅字段路径不同。
通过 ConnectorClass API 探测
你可以配置 spec.livenessProbe.api 使用 ConnectorClass API 进行存活检查。
示例
以下片段表示使用 ConnectorClass API 进行检测。
详情请参考认证探针中的 ConnectorClass API 探测,配置完全相同,仅字段路径不同。
认证探针
认证验证用于校验该类型工具的认证凭证有效性。如果不需要认证验证,可以省略 authProbes 字段。
spec.authProbes[].authName指定被验证的认证类型,必须匹配spec.auth.types[].name中定义的名称之一。
认证验证可以通过 HTTP 请求或 ConnectorClass API 进行。
通过 HTTP 请求探测
你可以配置 spec.authProbes[].probe.http 使用 HTTP 请求进行认证验证。
spec.authProbes[].probe.http.host指定认证验证的目标主机,默认为连接器地址中的主机。spec.authProbes[].probe.http.path指定认证验证的请求路径。该路径为绝对路径,执行探针时会追加到从连接器spec.address解析的主机 URI 后。如果spec.address包含路径前缀,认证验证时会忽略该路径前缀。若需包含路径前缀,请使用“认证检查表达式”动态获取。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 头。
通过 ConnectorClass API 探测
你可以配置 spec.authProbes[].probe.api 使用 ConnectorClass API 进行认证验证。需先在 ConnectorClass 规范中配置 spec.api。返回 200 表示认证成功,返回 401 或 403 表示认证失败。更多 ConnectorClass API 说明。
spec.authProbes[].probe.api.path指定认证验证的 API 端点路径。该路径为相对路径,会追加到从 ConnectorClass 的spec.api配置解析的 API 地址后。如果spec.api包含路径前缀,认证验证时会包含该路径前缀。
示例
以下 YAML 配置表示认证验证时,系统会向 ConnectorClass API 发送 GET https://example-api.default.svc.cluster.local/api/auth/check HTTP/1.1 请求。
自定义认证验证参数
某些认证验证场景可能需要额外参数,例如验证访问 Git 仓库时指定仓库名称。可通过 spec.authProbes[].params 定义这些参数。
认证验证表达式
配置 authProbes 时,可以使用表达式动态获取凭证信息或连接器元数据。
例如:
- 表达式可用于
probe.http.httpHeaders、probe.http.path和probe.api.path字段。 - 表达式格式遵循 Go 模板 语法。
- 支持的顶层字段包括:
.Connector:包含连接器资源自身信息.Secret:包含用于连接器认证的 Secret 数据
- 表达式中可用的方法记录在 sprig 库中:
- 例如:
b64enc用于字符串 Base64 编码,trimPrefix用于去除字符串前缀
- 例如:
示例
基本认证验证:
连接器将根据 ConnectorClass 中定义的配置执行认证验证。
上述 YAML 展示了基本认证验证:
path:使用连接器auth.params中的repository值,构造路径为/<repository>/info/refs?service=git-upload-packAuthorization:当连接器配置了 Secret 时,将username和password字段进行 Base64 编码,并包含在 Basic 认证头中。
基于 Rego 的认证逻辑配置
当工具连接器需要更复杂的认证逻辑时,可以使用基于 Rego 的认证逻辑配置。
Rego 是一种声明式策略语言,允许定义认证逻辑。在 ConnectorClass 中,Rego 策略通过 auth.types[].generator.rego 字段指定:
Rego 策略必须遵循以下规则:
- 在 proxy 包下定义规则
- 产生一个结构如下的 auth 对象:
- position:注入认证的位置,如 "header"、"query" 或 "body"
- contentType:body 注入时的内容类型(可选,配合 "body" 使用)
- auth:认证键值对映射
Rego 中可用变量
Rego 策略示例
基本认证
API Key 认证
JSON Body 认证
高级 Rego 技巧
你可以使用 Rego 的条件逻辑实现不同的认证方式:
条件认证
基于时间的认证
更多 Rego 语言详情,请参考:
ConnectorClass API
ConnectorClass API 允许开发者通过额外的 HTTP API 服务扩展 ConnectorClass 的 API 能力。它为 ConnectorClass 提供了一个 RESTful API,使客户端在使用连接器时能方便地访问工具内的资源。
如果不需要为工具提供自定义 API 能力,spec.api 可以不定义。
配置 API 地址
ConnectorClass API 在 spec.api 字段配置。你可以通过三种方式指定 API 服务:
1. 通过 Kubernetes Service 引用:
2. 通过带 URI 路径前缀的 Service 引用:
如果 API 地址有固定路径前缀,可以通过 spec.api.uri 指定:
3. 通过绝对 URI:
也可以使用 spec.api.uri 指定 API 的绝对路径:
API 地址解析
无论使用哪种配置方式,最终解析出的 API 地址会存储在 status.api.address.url 中。例如:
更多信息请参考:
OpenAPI 描述
OpenAPI 描述是可选配置,主要用于两个目的:
- 标记该 API 是自定义 API 还是通过 Connector Proxy 访问工具原生 API
- 提供 API 定义,支持客户端动态表单中的 API 引用
你可以通过 spec.api.openapi 定义 OpenAPI 描述,结构遵循 OpenAPI 3.0 规范。例如:
你可以在 API 路径中定义扩展字段 x-provider-type,标记该 API 是自定义 API 还是通过 Proxy 访问工具原生 API。有效值为 api 或 proxy。
x-provider-type 扩展定义为:api.openapi.paths[<path>].<verb>[x-provider-type]
示例:
当客户端请求 Connector API 时,Connectors 系统会根据当前连接器对应的 ConnectorClass 中 x-provider-type 的值,决定使用自定义 API 还是直接使用 Connectors Proxy 访问工具原生 API。若未提供该信息或未匹配到 API 路径,系统默认使用 Connectors Proxy 访问工具原生 API。
当需要在动态表单中引用 API 时,需在 spec.api.openapi 中做额外配置。详情请参考 动态表单中使用 Connectors API。
配置能力
配置能力定义了 ConnectorClass 向客户端提供的配置文件,这些文件可以通过 Connectors-CSI Driver 挂载到 Pod 中。
配置类型
- 自定义配置:通过
spec.configurations定义 - 内置配置:由 Connectors-CSI Driver 自动提供(详见:内置配置)
自定义配置
通过 spec.configurations 指定配置:
详情请参见:配置文件渲染
注意: spec.configurations 为可选字段,未定义时仅提供内置配置。
可读性展示的元数据信息
ConnectorClass 是标准的 k8s 资源,可以通过 labels 和 annotations 打标签,添加自定义信息。
例如:
示例:
ConnectorClass 代理
ConnectorClass 代理用于配置 ConnectorClass 的代理地址。
ConnectorClass 代理通过 spec.proxy 配置。例如:
连接器将使用代理地址将请求代理到 ConnectorClass。更多信息
使用 Rego 从请求中提取令牌
使用内置反向代理时,可以通过 spec.proxy.authExtractor 配置 Rego 规则,从客户端请求中提取令牌,使内置反向代理能使用提取的令牌验证客户端认证。
例如:
Rego 规则必须满足以下要求:
- 规则必须定义在
proxy包中 - 使用
auth变量返回令牌,令牌为字符串类型,例如:auth = { "token": "abcd1234" } - 如果无法提取令牌,返回空字符串,例如:
auth = { "token": "" }
Rego 中可用变量:
注意:
headers中的 Header 键使用 Canonical MIME Header Key 格式(首字母大写)- 编写 Rego 规则时请保证逻辑健壮,例如当
input.request.headers为 null 或空时返回空字符串。
示例
该示例通过以下方式实现了健壮的令牌提取:
- 定义默认规则返回空令牌字符串
- 访问前检查 headers 是否存在且不为 null
- 检查指定的 Header 键是否存在且至少有一个值
更多高级 Rego 规则请参考 Rego 策略语言 文档。 关于内置反向代理的更多信息,请参见 Connectors Proxy。
解析器类型
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:代理能力的状态信息Ready:标记当前 ConnectorClass 的整体状态
Ready Condition
Ready Condition 用于标记当前 ConnectorClass 的状态。它聚合其他条件的状态。
- 当其他条件均为 True 时,当前条件为 True。
- 当任一其他条件为 False 时,当前条件为 False。
- 当任一其他条件为 Unknown 时,当前条件为 Unknown。
APIReady Condition
表示 ConnectorClass 配置的 API 服务的状态信息。API 服务通过 ConnectorClass 的 spec.api 配置。
注意:
- API 检测仅尝试请求链接,不对 HTTP 返回值做判断。API 服务健康检查应依赖 API 服务自身的健康检查机制。
- 由于 API 服务可能随时变更,API 状态信息无法反映实时信息,建议客户端将其作为提示而非阻断依据。
ProxyReady Condition
表示 ConnectorClass 配置的代理服务的状态信息。代理服务通过 ConnectorClass 的 spec.proxy 配置。
兼容性
更新 ConnectorClass 可能影响已有的连接器。如果 ConnectorClass 存在不兼容的变更,可能导致之前创建的连接器失效。以下是可能导致不兼容的变更示例:
-
认证信息变更:如果 ConnectorClass 修改了支持的认证类型或方式,可能导致使用旧认证方式的连接器异常。
-
配置信息变更:如果 ConnectorClass 的配置信息发生变化,例如移除已有配置,可能导致依赖旧配置的 Kubernetes 工作负载异常。
建议在更新 ConnectorClass 时确认影响范围,必要时创建新的 ConnectorClass。
更多示例
-
支持
basic-auth认证类型的 ConnectorClass -
自定义认证类型 ConnectorClass
-
配置了
liveness probe的 ConnectorClass -
配置了
auth probe的 ConnectorClass -
完整的 Git 连接器配置示例: