配置平台默认镜像仓库以支持业务集群的外网访问
在平台上创建或者接入业务集群时,集群中的节点需要通过访问 平台默认 的镜像仓库(global 部署时配置)获取所需的组件镜像。
若业务集群的节点无法访问 平台默认 的镜像仓库,可参考本文为平台默认镜像仓库配置一个业务集群可访问的地址。在集群创建或接入时,通过设置 镜像仓库 参数,确保集群中的节点能够通过该地址访问 平台默认 镜像仓库。
场景示例
部署平台时,使用内网地址部署 global。在平台运行期间,需要将外部网络中的某个业务集群(例如:公有云 Kubernetes 集群、其他边缘集群)接入平台管理时,业务集群只能通过公网对接平台的默认镜像仓库,获取所需的组件镜像。
此时,可参考本文提供的方案,为平台的默认镜像仓库添加一个外网业务集群可访问的地址,即可满足外网业务集群对接平台默认镜像仓库的需求,又可避免重新部署平台或修改平台镜像仓库地址所带来的的成本和风险。
前提条件
请提前准备好业务集群可访问的 域名、域名指向的 IP 地址 及域名对应的 合法证书。
注意:
-
该域名不允许和 平台访问地址 一致。
-
需保证该域名的端口(HTTPS 端口,即平台访问地址的端口)能够将流量转发到 global 集群的所有控制节点。
为平台默认镜像仓库配置证书及路由规则
-
将域名的合法证书拷贝至 global 集群的任一控制节点。
-
执行以下命令行,在平台上创建保存了域名合法证书的证书(registry-address.tls)。
kubectl create secret tls registry-address.tls --cert=<域名的证书名称> --key=<域名的证书的 key> -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 证书的信息(包含有效期),请在证书到期前及时更换。
-
在 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
说明:得到类似如下示例中的回显时,表明 ingress 创建成功。
... created
-
在 global 集群的其中一个 master 节点上,执行以下命令检查是否存在 Registry 的 Service 资源。
kubectl -n kube-system get svc |grep registry
若 Service 不存在,使用如下命令创建 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 <镜像仓库域名>/automation/qaimages:helloworld
或
docker pull <镜像仓库域名>/automation/qaimages:helloworld
为业务集群配置镜像仓库
为镜像仓库配置证书和路由规则之后,镜像仓库已准备完成,您可根据相应场景,在创建/接入集群时为业务集群添加本仓库,或为已创建的集群配置镜像仓库。
-
在平台上创建/接入集群时,可参考如下说明配置:
-
镜像仓库:选择
外部
。 -
IP 地址/域名 、端口:自定义地址的域名和端口(HTTPS 端口)。
-
用户名、密码:平台默认镜像仓库的用户名和密码。
-
-
若集群已使用平台默认的镜像仓库创建,可参考如下说明配置为已创建的集群配置镜像仓库:
在集群所有节点上添加
annotation
,增加键值对cpaas.io/registry-addressl
:<镜像仓库访问地址,例如:https://publicIP:11443>
。