为内置 Registry 添加外部访问地址

Overview

global 集群使用 Platform Built-in Registry 时,业务集群通常也会使用该 Registry 拉取镜像。该 Registry 不仅为 global 集群内的组件提供服务,还必须对业务集群节点可访问。

在某些场景下,业务集群节点无法直接访问 global 集群的 Registry 地址——例如,global 集群位于私有数据中心,而业务集群位于公有云或边缘环境。

本指南介绍如何为平台默认 Registry 配置一个外部可访问的地址,以便业务集群拉取镜像。

Prerequisites

开始之前,请准备以下内容:

  • 业务集群节点可访问的域名
  • 域名指向的 IP 地址
  • 域名对应的有效 SSL 证书
WARNING
  • 域名必须与平台访问地址不同
  • 确保域名的 IP 地址能够转发流量至 global 集群所有控制平面节点

Procedure

配置平台 Registry 的证书和路由规则

  1. 将域名的有效证书复制到 global 集群任一控制平面节点

  2. 创建包含域名证书的 TLS Secret:

    kubectl create secret tls registry-address.tls --cert=<certificate-filename> --key=<key-filename> -n kube-system

    示例:

    kubectl create secret tls registry-address.tls --cert=custom.crt --key=custom.key -n kube-system

    注意:创建证书后,请关注 global 集群 kube-system 命名空间中 registry-address.tls Secret 的过期时间,证书到期前需替换。

  3. global 集群任一控制平面节点创建 ingress 规则:

    REGISTRY_DOMAIN_NAME=<www.registry.com> # 替换为你的可访问域名
    cat << EOF | kubectl create -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/backend-protocol: HTTPS
      name: registry-address
      namespace: kube-system
      labels:
        service_name: registry
    spec:
      rules:
        - host: $REGISTRY_DOMAIN_NAME
          http:
            paths:
              - backend:
                  service:
                    name: registry
                    port:
                      number: 443
                path: /v2/
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: registry
                    port:
                      number: 443
                path: /v2/_catalog
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: registry
                    port:
                      number: 443
                path: /v2/.+/tags/list
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: registry
                    port:
                      number: 443
                path: /v2/.+/manifests/[A-Za-z0-9_+.-:]+
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: registry
                    port:
                      number: 443
                path: /v2/.+/blobls/[A-Za-z0-9-:]+
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: registry
                    port:
                      number: 443
                path: /v2/.+/blobls/uploads/[A-Za-z0-9-:]+
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: registry
                    port:
                      number: 443
                path: /auth/token
                pathType: ImplementationSpecific
      tls:
        - secretName: registry-address.tls
          hosts:
            - $REGISTRY_DOMAIN_NAME
    EOF

    出现类似 ... created 的响应表示 ingress 创建成功。

  4. 检查是否存在 Registry Service 资源:

    kubectl -n kube-system get svc | grep registry

    若 Service 不存在,则创建:

    cat << EOF | kubectl create -f -
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        name: registry
        service_name: registry
      name: registry
      namespace: kube-system
    spec:
      ports:
        - protocol: TCP
          port: 443
          targetPort: 60080
      selector:
        component: registry
      type: ClusterIP
    EOF
  5. 通过域名拉取镜像测试配置:

    crictl pull <registry-domain-name>/automation/qaimages:helloworld

    podman pull <registry-domain-name>/automation/qaimages:helloworld