Registry v2:公开 Registry

默认情况下,请为集群内的 workload 使用内部 registry service。只有当开发人员机器、CI systems 或其他外部客户端必须 push 或 pull images 时,才公开 Registry v2

前提条件

  • Registry v2 已安装并可用。
  • 您有权限更新 Config/cluster,并在 image-registry-system 中创建或引用 TLS Secrets。
  • 集群具有可将流量路由到 image-registry-system 的 Ingress controller。
  • 对于自定义 host,请准备 DNS 记录和 TLS certificate,其 Subject Alternative Name 与 Registry hostname 匹配。

公开默认 Registry

Config/cluster 中启用默认 external endpoint:

kubectl patch configs.imageregistry.operator.alauda.io cluster \
  --type=merge \
  -p '{"spec":{"defaultRoute":true}}'

Operator 会在 image-registry-system 中生成一个名为 default-route 的 Kubernetes Ingress。

验证生成的 Ingress 和 Registry 配置:

kubectl get configs.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system get ingress default-route

获取生成的 host:

REGISTRY_HOST="$(
  kubectl -n image-registry-system get ingress default-route \
    -o jsonpath='{.spec.rules[0].host}'
)"

echo "$REGISTRY_HOST"

预期结果:

  • Config/cluster.spec.defaultRoutetrue
  • image-registry-system 中存在 default-route Ingress。
  • REGISTRY_HOST 包含分配给默认路由的 hostname。

如果 Ingress certificate 由私有 CA 签名,请在登录之前将 CA certificate 添加到 external client 和 OCI client 的信任存储中。请从 external client 验证 TLS chain:

openssl s_client \
  -connect "$REGISTRY_HOST:443" \
  -servername "$REGISTRY_HOST" \
  -verify_return_error </dev/null

为生成的 host 写入凭据:

ac registry login \
  --registry "$REGISTRY_HOST"

公开自定义安全 Registry Host

image-registry-system 中创建或提供 TLS Secret,然后配置 Config.spec.routes[]

当设置了 secretName 时,TLS Secret 必须存在于 image-registry-system 中。

生成的 Ingress 使用 registry service 作为后端,并将后端协议设置为 HTTPS。

使用自定义路由修补 Config/cluster。请使用 merge patch,以免删除其他 Config/cluster.spec 字段,例如 storage 和 pull-secret 设置。此 patch 中的 routes 数组会替换当前的 routes 数组,因此请包含所有必须保留配置的自定义路由:

kubectl patch configs.imageregistry.operator.alauda.io cluster \
  --type=merge \
  -p '{
    "spec": {
      "managementState": "Managed",
      "defaultRoute": false,
      "routes": [
        {
          "name": "public-registry",
          "hostname": "registry.example.com",
          "secretName": "registry-tls"
        }
      ]
    }
  }'
描述
public-registry路由名称。Operator 将其用作生成的 Ingress 名称。
registry.example.com外部客户端可访问的 Registry hostname。DNS 记录必须解析到 Ingress controller。
registry-tlsimage-registry-system 中的 TLS Secret。证书的 Subject Alternative Name 必须与 Registry hostname 匹配。

验证配置和生成的 Ingress:

kubectl get configs.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system get ingress public-registry
kubectl -n image-registry-system describe ingress public-registry

预期结果:

  • Config/cluster.spec.routes[] 包含 public-registry
  • public-registry Ingress 使用 registry.example.com
  • Ingress 引用了 registry-tls Secret。

验证 TLS 信任并登录:

openssl s_client \
  -connect registry.example.com:443 \
  -servername registry.example.com \
  -verify_return_error </dev/null

ac registry login \
  --registry registry.example.com

配置客户端信任

如果 Ingress certificate 由私有 CA 签名,请在登录以及 push 或 pull 操作之前,将 CA 添加到每个外部客户端的信任存储中。

对于使用 insecure registry 选项的测试客户端,请将不安全设置仅限定到 Registry host:

ac registry login \
  --registry registry.example.com \
  --insecure

如果 OCI client 还连接到 HTTP endpoint 或不受信任的 certificate,请单独配置该 OCI client 的 trust 或 insecure-registry 设置。

验证外部访问

检查 Ingress:

kubectl -n image-registry-system get ingress
kubectl -n image-registry-system describe ingress public-registry

从外部客户端写入凭据:

ac registry login \
  --registry registry.example.com

push 和 pull 一个测试 image:

nerdctl tag my-app:latest registry.example.com/team-a/my-app:external-test
nerdctl push registry.example.com/team-a/my-app:external-test
nerdctl pull registry.example.com/team-a/my-app:external-test

故障排除

症状检查
缺少 IngressConfig.spec.defaultRouteConfig.spec.routes[] 和 Operator 日志。
Ingress 没有地址Ingress controller 状态、ALB project label 和 Ingress events。
TLS 握手失败TLS Secret、客户端信任存储、certificate SANs 以及 private CA 配置。
登录失败 凭据、namespace RoleBinding、OIDC runtime discovery 和 Registry 日志。
登录后 push 或 pull 失败image namespace 权限、repository path、storage backend 以及 Registry 就绪状态。