OCI Connector

OCI Connector 是一个平台无关的连接器,允许您连接到任何 OCI Registry,例如 Docker Hub、Harbor 等。您可以使用 OCI Connector 在 CI/CD 流水线中安全访问私有 OCI 仓库,或在容器化工作负载中执行 OCI 操作而无需提供凭证。此外,您可以集中管理 OCI 访问配置,避免在每个命名空间中重复配置 OCI 凭证。

本文档将介绍:

  • OCI Registry 的访问要求
  • 如何基于 OCI Connector 类型创建 OCI Connector
  • OCI Connector 的代理及配置能力

OCI Registry 要求

被访问的 OCI Registry 必须满足以下条件:

  1. 接口实现要求:

  2. 认证方式要求:

基于 OCI Connector 类型创建 OCI Connector

以下是创建基础 OCI Connector 的示例:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: dockerhub-demo
spec:
  connectorClassName: oci
  address: https://index.docker.io
  auth:
    name: tokenAuth

spec.connectorClassName

使用常量值 oci

description

您可以通过 annotations 字段为 OCI Connector 添加描述信息。

  • cpaas.io/description:OCI Connector 的描述。

例如:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: dockerhub-demo
  annotations:
    cpaas.io/description: "连接到 Docker Hub 以访问团队公共仓库"

地址

spec.address 指定 OCI Registry 的访问地址,例如:https://index.docker.io

认证

OCI Connector 支持以下认证类型:

  • tokenAuth:基于令牌的认证(可选)

使用基于令牌的认证

示例:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: dockerhub-demo
spec:
  connectorClassName: oci
  address: https://index.docker.io
  # . . .
  auth:
    name: tokenAuth
    secretRef:
      name: oci-secret
---
apiVersion: v1
stringData:
  password: your-password
  username: your-username
kind: Secret
metadata:
  name: oci-secret
type: cpaas.io/distribution-registry-token

如果目标 OCI Registry 不需要认证,可以省略认证信息。配置示例如下:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: dockerhub-demo
spec:
  connectorClassName: oci
  address: https://index.docker.io
  auth:
    name: tokenAuth

令牌所需权限

配置的令牌所需权限取决于您在 Pod/流水线中的使用场景。

例如:

  • 镜像拉取操作:如果仅需使用该连接器拉取镜像,令牌只需对目标仓库具有读取权限。
  • 镜像拉取和推送操作:如果需使用该连接器推送镜像,令牌必须对目标仓库同时具备读写权限。换言之,令牌应允许您从仓库拉取和推送镜像。

出于安全最佳实践,建议创建权限最小化的令牌。当需要额外权限时,创建权限更高的独立 Connector,并通过命名空间隔离控制用户访问。

代理与配置

为了让客户端无需凭证即可访问 OCI 仓库,OCI Connector 类型提供了一个代理服务器,用于自动注入认证信息。

拥有连接器访问权限的客户端可以使用该代理服务器访问 OCI 仓库,而无需在客户端配置凭证。

为简化使用,OCI Connector 类型提供可通过 CSI 挂载到 Pod 的配置信息。在 Pod 中执行 OCI 操作时,可自动使用代理服务完成操作。

代理

代理地址

创建 Connector 后,系统将:

  1. 自动创建代理的 Service。
  2. status.proxy.httpAddress 字段记录代理地址。

您可以使用该代理地址进行镜像推拉操作。

例如:

apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: dockerhub-demo
  namespace: default
spec:
  address: https://index.docker.io
  auth:
    name: tokenAuth
    secretRef:
      name: dockerhub-demo
  connectorClassName: oci
status:
  conditions:
  # . . .
  proxy:
    httpAddress:
      url: http://c-dockerhub-demo.default.svc.cluster.local/namespaces/oci-connector-demo/connectors/oci-connector

正向代理

您可以通过 CSI 将代理信息挂载到 Pod 中,然后通过环境变量或配置文件使用代理信息。

volumes:
- name: proxyconfig
  csi:
    readOnly: true
    driver: connectors-csi
    volumeAttributes:
      connector.name: "harbor"

随后,在执行容器操作前,通过环境变量或配置文件使用代理信息。

export http_proxy=$(cat /{mount-path}/http.proxy)
export https_proxy=$(cat /{mount-path}/https.proxy)
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$https_proxy
export no_proxy=localhost,127.0.0.1
export NO_PROXY=$no_proxy
echo "Using proxy: http_proxy=$http_proxy, https_proxy=$https_proxy, no_proxy=$no_proxy"

反向代理

使用反向代理时,需要将目标镜像地址修改为代理地址。

示例: index.docker.io/test/abc:v1 → c-dockerhub-demo.default.svc.cluster.local/namespaces/oci-connector-demo/connectors/oci-connector/test/abc:v1

并将凭证配置文件挂载到 Pod 中,且在 insecure-registries 中配置代理地址。

基于 OCI Connector 类型创建的 OCI Connector 提供以下配置:

docker-config:OCI CLI(如 buildkit、buildah)所需的配置凭证。

  • 提供 config.json 配置文件。
  • 包含访问代理所需的认证信息。

例如:

// config.json

{
  "auths": {
      "<proxy address of the connector>": {
          "auth": "<authentication information required to access the connector proxy>"
      }
  }
}

buildkitd:BuildKit Daemon 所需的配置信息。

  • 提供 buildkitd.toml 配置文件。
  • 配置文件中默认将当前连接器设置为 insecure-registries

例如:

insecure-entitlements = [ "network.host", "security.insecure" ]
[registry."<proxy address of the connector>"]
  http = true

您可以通过 connectors-csi 将该配置信息挂载到 Pod 中,结合代理能力,实现无凭证的镜像推拉操作。

更多