为内置镜像仓库添加外部访问地址
目录
Overview
当 global 集群使用 Platform Built-in 镜像仓库时,业务集群通常也会使用该仓库拉取镜像。该镜像仓库不仅为 global 集群内的组件提供服务,还必须对业务集群节点可访问。
在某些场景下,业务集群节点无法直接访问 global 集群的镜像仓库地址——例如 global 集群位于私有数据中心,而业务集群位于公有云或边缘环境时。
本指南介绍如何为平台默认镜像仓库配置一个外部可访问的地址,以便业务集群能够拉取镜像。
Prerequisites
开始之前,请准备以下内容:
- 业务集群节点可访问的域名
- 域名指向的 IP 地址
- 域名对应的有效 SSL 证书
WARNING
- 域名必须与平台访问地址不同
- 确保该域名的 IP 地址能够将流量转发至
global 集群所有控制平面节点
Procedure
配置平台镜像仓库的证书和路由规则
-
将域名的有效证书复制到 global 集群任一控制平面节点
-
创建包含域名证书的 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 的过期时间,证书到期前及时替换。
-
在 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 创建成功。
-
检查是否存在 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
-
通过域名拉取镜像测试配置:
crictl pull <registry-domain-name>/automation/qaimages:helloworld
或
docker pull <registry-domain-name>/automation/qaimages:helloworld