快速开始

本文档将帮助您快速了解如何创建 OCI Connector,并使用它安全访问容器镜像仓库,而无需直接处理凭据。

目录

介绍

适用场景

OCI (Open Container Initiative) Connector 提供了一种安全的方式来:

  • 访问容器镜像仓库(Docker Hub、Harbor 等),无需在工作负载中嵌入凭据
  • 集中管理镜像仓库认证信息
  • 通过代理机制安全地推送和拉取容器镜像
  • 配置容器工具以配合镜像仓库代理使用

该方案特别适用于:

  • 需要向私有仓库推送镜像的 CI/CD 流水线
  • 多团队环境中需要安全共享仓库凭据的场景
  • Kubernetes 内的容器构建流程

预计阅读时间

15 分钟

注意事项

  • OCI connector 通过 CSI 驱动集成安全注入仓库凭据。
  • 不同容器工具(Docker、Buildah 等)可能需要针对不安全仓库访问进行特定配置。
  • 连接器生成的配置文件有效期为 30 分钟。

前提条件

  • 已安装 Connectors 系统的 Kubernetes 集群(Operator、Core 和 OCI 组件)。详情请参见安装指南
  • 已配置 kubectl 可访问集群
  • 容器镜像仓库的访问凭据(Docker Hub、Harbor 等)
  • 具备 Kubernetes 资源的基础知识

流程概览

序号操作步骤说明
1创建 Namespace创建一个专用的命名空间用于演示
2创建仓库凭据和 OCI Connector配置连接器以连接容器镜像仓库
3配置 RBAC 权限授予使用连接器的相应权限
4创建容器构建/推送 Job部署一个使用连接器与仓库交互的 Job
5验证操作检查仓库操作是否成功完成

操作步骤

步骤 1:创建 Namespace

为本次演示创建一个专用命名空间:

kubectl create ns oci-connector-demo

步骤 2:创建仓库凭据和 OCI Connector

创建包含仓库凭据的 Secret 和 OCI Connector 资源。有关创建和配置连接器的详细信息,请参阅Connectors 快速开始指南

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: registry-auth
  namespace: oci-connector-demo
type: cpaas.io/distribution-registry-token
stringData:
  username: your-username  # 替换为您的仓库用户名
  password: your-token     # 替换为您的仓库密码/令牌
---
apiVersion: connectors.alauda.io/v1alpha1
kind: Connector
metadata:
  name: oci-connector
  namespace: oci-connector-demo
spec:
  connectorClassName: oci
  address: "https://index.docker.io"  # 替换为您的仓库地址
  auth:
    name: tokenAuth
    secretRef:
      name: registry-auth
EOF

确认连接器处于 "Ready" 状态:

kubectl get connector oci-connector -n oci-connector-demo

输出应显示:

NAME           CLASS   ADDRESS               READY   AGE
oci-connector  oci     https://index.docker.io True    1m

步骤 3:创建容器构建/推送 Job

创建包含示例 Dockerfile 的 ConfigMap:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: dockerfile
  namespace: oci-connector-demo
data:
  Dockerfile: |
    FROM scratch
    LABEL maintainer="example@example.com"
    WORKDIR /app
    ENV APP_VERSION="1.0.0"
EOF

创建一个使用连接器构建并推送容器镜像的 Job:

cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
  name: image-build
  namespace: oci-connector-demo
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: buildkit
        image: moby/buildkit:v0.11.0
        securityContext:
          privileged: true
        env:
        - name: BUILDKITD_FLAGS
          value: "--config /etc/buildkit/buildkitd.toml"
        command:
        - /bin/sh
        - -c
        args:
        - |
          set -ex
          buildctl-daemonless.sh \
          build \
          --progress=plain \
          --frontend=dockerfile.v0 \
          --local context=/workspace \
          --local dockerfile=/workspace \
          --output type=image,name=c-oci-connector.oci-connector-demo.svc.cluster.local/namespaces/oci-connector-demo/connectors/oci-connector/your-username/test-image:v1,push=true
        volumeMounts:
        - name: dockerfile
          mountPath: /workspace
        - name: docker-config
          mountPath: /root/.docker
        - name: buildkitd-config
          mountPath: /etc/buildkit
      volumes:
      - name: dockerfile
        configMap:
          name: dockerfile
      - name: docker-config
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "oci-connector"
            configuration.names: "docker-config"
      - name: buildkitd-config
        csi:
          readOnly: true
          driver: connectors-csi
          volumeAttributes:
            connector.name: "oci-connector"
            configuration.names: "buildkitd"
EOF

卷定义中的关键参数:

  • connector.name:您的 OCI connector 名称
  • configuration.names:指定从 OCI ConnectorClass 生成的配置类型:
    • "docker-config":生成用于任何仓库操作的认证配置(config.json)
    • "buildkitd":生成用于不安全仓库访问的 BuildKit 守护进程配置
  • mountPath:指定配置文件在容器中的挂载路径:
    • "/root/.docker" 用于 Docker 认证配置
    • "/etc/buildkit" 用于 BuildKit 配置

步骤 4:验证操作

查看 Job 日志,确认镜像构建并推送成功:

kubectl logs -f job/image-build -n oci-connector-demo

您应看到构建过程完成,并且镜像已推送到仓库。

预期结果

完成所有步骤后,您将看到:

  1. OCI connector 处于 "Ready" 状态:

    NAME           CLASS   ADDRESS               READY   AGE
    oci-connector  oci     https://index.docker.io True    5m
  2. Job 日志中显示镜像构建和推送成功,表明镜像通过连接器代理推送到了仓库。

  3. 连接器状态字段中的代理地址:

    status:
      proxy:
        httpAddress:
          url: http://c-oci-connector.oci-connector-demo.svc.cluster.local

工作原理

OCI Connector 的工作流程:

  1. 创建一个代理服务,位于您的工作负载和容器镜像仓库之间
  2. 请求通过代理时注入认证信息
  3. 提供容器工具使用的配置文件以配合代理工作

连接器生成三种类型的配置文件,分别用于不同目的:

  1. docker-config:生成包含访问代理服务所需认证信息的 config.json 文件

    {
      "auths": {
        "<proxy-address>": {
          "auth": "<auth-token>"
        }
      }
    }

    该配置是认证的关键,所有容器操作均需使用。

  2. buildkitd:生成配置 BuildKit 信任不安全仓库代理的 buildkitd.toml 文件

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

    仅在使用 BuildKit 构建和推送镜像时需要。

查看生成的配置:

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: inspect-config
  namespace: oci-connector-demo
spec:
  containers:
  - name: inspector
    image: busybox
    command: ["sleep", "3600"]
    volumeMounts:
    - name: docker-config
      mountPath: /mnt/docker
  volumes:
  - name: docker-config
    csi:
      readOnly: true
      driver: connectors-csi
      volumeAttributes:
        connector.name: "oci-connector"
        configuration.names: "docker-config"
EOF

查看生成的配置内容:

kubectl exec -it inspect-config -n oci-connector-demo -- cat /mnt/docker/config.json

故障排查

如果容器操作失败,请检查以下内容:

  1. 连接器状态:确保连接器处于 "Ready" 状态:

    kubectl describe connector oci-connector -n oci-connector-demo
  2. RBAC 权限:确认 RoleBinding 配置正确。

  3. 仓库访问:确认凭据有权访问指定的仓库。

  4. 配置挂载:确保配置卷正确挂载到 Job 中。

  5. 代理地址:确保镜像引用中使用了 status.proxy.httpAddress.url 中的正确代理地址。

后续步骤

成功使用 OCI Connector 推送首个镜像后,您可以:

  • 在 Kubernetes 工作负载中使用连接器拉取私有镜像
  • 集成到 CI/CD 流水线中构建和推送镜像
  • 配置不同容器工具配合连接器使用
  • 将连接器用于不同的镜像仓库服务