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:基于 Token 的认证(可选)

使用基于 Token 的认证

例如:

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

Token 所需权限

配置的 Token 所需权限取决于您打算如何在 Pod/流水线中使用它。

例如:

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

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

代理与配置

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

拥有访问该 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 配置文件。
  • 配置文件中默认将当前 Connector 设置为 insecure-registries

例如:

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

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

更多