远端代理实例通过远端代理的缓存功能,实现就近访问的效果,有效提升跨境镜像拉取的效率。本文介绍容器服务 VKE 调用远端代理仓中的镜像文件,发布应用的方法。当前支持多种调用发布的方式,请根据您的具体使用场景选择。
在远端代理仓中创建命名空间,操作详情参见 创建命名空间。
说明
library
命名空间。如果需要使用公共镜像请设置远端代理仓的用户名和密码。使用标准版本远端代理仓时,需要在远端代理仓的 访问控制 > VPC 页面,添加 VKE 集群所在 VPC,确保代理和集群的网络连通。添加 VPC 的说明参见 连通本账号 VPC。
说明
小微版远端代理仓时默认使用同地域内网,无需单独配置。
支持多种方式调用远端代理仓中的镜像文件,发布应用。
方式一:通过远端代理仓域名
使用 访问域名 下载并使用镜像文件,域名支持在远端代理仓概览页查看。
注意
发布应用时需要将 nginx
替换为 {访问域名}/library/nginx:latest
。
方式二:通过 Docker Hub 官方地址
登录所有 VKE 集群节点,修改 contianerd
配置。
创建 /etc/containerd/certs.d/docker.io
目录。
配置 /etc/containerd/config.toml
增加鉴权信息。
说明
命名空间设置为 公开 时可跳过该步骤。
[plugins."io.containerd.grpc.v1.cri".registry] config_path = "/etc/containerd/certs.d" [plugins."io.containerd.grpc.v1.cri".registry.configs."<访问域名>".auth] username="<远端代理仓的用户名>" password="<远端代理仓的密码>"
创建文件 /etc/containerd/certs.d/docker.io/hosts.toml
。
server = "https://registry-1.docker.io" # Exclude this to not use upstream [host."https://<访问域名>"] capabilities = ["resolve","pull"]
重启 contianerd
。
systemctl stop containerd systemctl start containerd
镜像地址直接填写 nginx:latest
发布应用。
方式三:通过 Kyverno 替换访问域名
通过 Kyverno,在部署 Kubernetes 应用时自动替换访问域名。
安装 Kyverno。
创建 policy
。
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: replace-image-registry-with-harbor annotations: policies.kyverno.io/title: Replace Image Registry With Harbor pod-policies.kyverno.io/autogen-controllers: none policies.kyverno.io/category: Sample policies.kyverno.io/severity: medium policies.kyverno.io/subject: Pod kyverno.io/kyverno-version: 1.11.4 kyverno.io/kubernetes-version: "1.27" policies.kyverno.io/description: >- Some registries like Harbor offer pull-through caches for images from certain registries. Images can be re-written to be pulled from the redirected registry instead of the original and the registry will proxy pull the image, adding it to its internal cache. The imageData context variable in this policy provides a normalized view of the container image, allowing the policy to make decisions based on various "live" image details. As a result, it requires access to the source registry and the existence of the target image to verify those details. spec: rules: - name: redirect-docker match: any: - resources: kinds: - Pod operations: - CREATE - UPDATE mutate: foreach: - list: request.object.spec.initContainers[] context: - name: imageData imageRegistry: reference: "{{ element.image }}" preconditions: any: - key: "{{imageData.registry}}" operator: Equals value: index.docker.io patchStrategicMerge: spec: initContainers: - name: "{{ element.name }}" image: <访问域名>/{{imageData.repository}}:{{imageData.identifier}} - list: request.object.spec.containers[] context: - name: imageData imageRegistry: reference: "{{ element.image }}" preconditions: any: - key: "{{imageData.registry}}" operator: Equals value: index.docker.io patchStrategicMerge: spec: containers: - name: "{{ element.name }}" image: <访问域名>/{{imageData.repository}}:{{imageData.identifier}}
使用 nginx:latest
发布应用。