在 K8S 工作负载中使用 OCI Connector Proxy

在 Kubernetes 集群中,使用 OCI 客户端访问 OCI Registry 时,通常需要为客户端配置 Registry 认证信息。这就需要将认证信息分发给工作负载编排器,从而增加了凭证泄露的风险。

OCI Connector 通过其代理能力提供了一种 secretless 的访问 Registry 方式,使普通用户无需接触认证信息即可访问 Registry,从而最大限度地保障凭证安全。

目前社区中已有多种 OCI 客户端可用于访问 OCI Registry。本文档将介绍如何在 Kubernetes 工作负载中利用 OCI Connector 的代理能力,并说明其通用配置逻辑。

如果您已有初步了解,可以直接参考更具体的案例:

利用 OCI Connector 代理能力

OCI Connector 支持两种代理模式:

  • Forward Proxy - 推荐大多数场景使用。对客户端配置侵入性小,使用更便捷。
  • Reverse Proxy - 需要修改目标镜像地址并额外配置客户端。

Forward Proxy

使用 Forward Proxy 主要涉及以下方面:

  • 为客户端设置代理环境变量
  • 配置客户端支持不安全的 Registry

通过 Connectors CSI Driver 挂载内置配置

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

大多数容器镜像仓库客户端支持从环境变量(http_proxyhttps_proxyno_proxy)读取代理设置。可以通过两种方式配置:

# 方案一:逐个设置代理变量
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

# 方案二:source 环境变量文件
source /{mount-path}/.env

注意:部分客户端需要在其配置文件中指定代理设置。

由于 forward proxy 会拦截并重新签发 TLS 流量(MITM),客户端必须配置为信任代理证书或允许不安全连接。具体请参考您的 CLI 文档,或查看 OCI ConnectorClass Forward Proxy 中 ConnectorClass 提供的默认配置。

Reverse Proxy

使用 OCI Connector 代理能力主要涉及以下三方面:

  • 修改目标镜像地址为代理后的镜像仓库地址
  • 配置访问代理所需的认证信息
  • 配置客户端 CLI 支持推送到不安全的 Registry

下面将详细说明每项内容的具体含义。

  1. 修改目标镜像地址为代理后的镜像仓库地址

示例: harbar.example.com/test/abc:v1 → c-harbor-connector.default.svc.local/namespaces/oci-connector-ns/connectors/oci-connector-name/test/abc:v1

  1. 配置访问代理所需的认证信息

访问代理所需的认证信息可以通过 docker/config.json 文件配置。

OCI ConnectorClass 提供了开箱即用的配置,可通过 connector-csi 挂载。

volumes:
- name: docker-config
  csi:
    readOnly: true
    driver: connectors-csi
    volumeAttributes:
      connector.name: "harbor"
      configuration.names: "docker-config"

有关 OCI ConnectorClass 的配置信息,请参见 OCI ConnectorClass Configuration

  1. 配置客户端 CLI 支持推送到不安全的 Registry

由于 connector 提供的代理服务使用 HTTP 协议,客户端需要配置 insecure-registries。不同客户端配置方式不同:

buildkitd.yaml 可通过 buildkitd.toml 指定。OCI ConnectorClass 提供了 buildkitd 的开箱即用配置,可通过 connector-csi 挂载。

- name: buildkitd-config
  csi:
    readOnly: true
    driver: connectors-csi
    volumeAttributes:
      connector.name: "harbor"
      configuration.names: "buildkitd"

部分工具支持直接在命令行指定,此时可将对应参数写死在脚本中。

例如:

  • buildah 在命令行指定 --tls-verify=false 支持不安全 Registry。
  • ko 在命令行指定 --insecure-registry 支持不安全 Registry。

更多