跳到主要内容

使用 TCR 托管 Cilium 镜像

概述

如果对集群有较高的可用性要求,需要确保扩容节点时能够快速完成初始化并就绪,建议将 Cilium 的依赖镜像同步到 TCR 镜像仓库,安装 Cilium 时也指定使用 TCR 镜像仓库中的镜像,避免因 Cilium 镜像拉取慢或拉取不到导致节点迟迟不能 Ready。

本文将介绍如何实现将 Cilium 的依赖镜像改为用 TCR 镜像仓库托管。

创建 TCR 镜像仓库

要想快速拉取镜像,肯定要在集群所在地域创建 TCR 镜像仓库,如果你在多个地域都有集群需要安装 Cilium,可以利用 TCR 的 同实例多地域复制镜像跨实例(账号)同步镜像 的能力来实现将 Cilium 依赖镜像上传到一个镜像仓库后自动同步到其它地域的镜像仓库中。

新建命名空间

TCR 镜像仓库创建完成后,新建一个命名空间:

  1. 名称: cilium。
  2. 访问级别:公开。

配置访问控制

上传 Cilium 镜像需要让上传镜像的客户端能访问到 TCR 镜像仓库:

  1. 从公网推送镜像:参考 配置公网访问控制 开启镜像仓库的公网访问能力。
  2. 从内网推送镜像:参考 配置内网访问控制 开启镜像仓库的内网访问能力,确保上传 Cilium 的客户端所在 VPC 与 TCR 镜像仓库建立内网访问链路。

另外 TKE 集群节点拉取 Cilium 依赖镜像也需要让节点能访问到 TCR 镜像仓库,参考 配置内网访问控制 开启镜像仓库与 TKE 集群所在 VPC 建立内网访问能力,确保上传 Cilium 的客户端所在 VPC 与 TCR 镜像仓库建立内网访问链路,并确保勾选 自动解析

安装 TCR 插件

在集群 组件管理 页面搜索 tcr,安装该组件,参数配置中点开 高级设置,确保 内网访问链路 显示链路正常,不要勾选 启用内网解析功能(前面我们配置了 TCR 内网访问链路时,已经设置了自动解析,无需向节点下发 hosts 来实现 TCR 域名解析):

配置并获取访问凭证

上传 Cilium 镜像前,需要先配置 TCR 的访问凭证,参考 用户级账号管理服务级账号管理,获取一个可以登录 TCR 镜像仓库的访问凭证。

搬运 Cilium 镜像

上传 Cilium 镜像之前,得先确认当前的安装配置依赖了哪些镜像,可以使用 helm template 并加上计划添加的安装参数,看渲染出来的 YAML 实际使用了哪些镜像:

$ helm template cilium cilium/cilium --version 1.18.3 \
--namespace kube-system \
--set operator.tolerations[0].key="node-role.kubernetes.io/control-plane",operator.tolerations[0].operator="Exists" \
--set operator.tolerations[1].key="node-role.kubernetes.io/master",operator.tolerations[1].operator="Exists" \
--set operator.tolerations[2].key="node.kubernetes.io/not-ready",operator.tolerations[2].operator="Exists" \
--set operator.tolerations[3].key="node.cloudprovider.kubernetes.io/uninitialized",operator.tolerations[3].operator="Exists" \
--set operator.tolerations[4].key="tke.cloud.tencent.com/uninitialized",operator.tolerations[4].operator="Exists" \
--set operator.tolerations[5].key="tke.cloud.tencent.com/eni-ip-unavailable",operator.tolerations[5].operator="Exists" \
--set routingMode=native \
--set endpointRoutes.enabled=true \
--set ipam.mode=delegated-plugin \
--set enableIPv4Masquerade=false \
--set devices=eth+ \
--set cni.chainingMode=generic-veth \
--set cni.customConf=true \
--set cni.configMap=cni-config \
--set cni.externalRouting=true \
--set extraConfig.local-router-ipv4=169.254.32.16 \
--set kubeProxyReplacement=true \
--set k8sServiceHost=169.254.128.125 \
--set k8sServicePort=60002 \
| grep image: | awk -F 'image: "' '/image:/ {gsub(/@sha256:[^"]+"/, ""); print $2}' | sort | uniq
quay.io/cilium/cilium-envoy:v1.34.10-1761014632-c360e8557eb41011dfb5210f8fb53fed6c0b3222
quay.io/cilium/cilium:v1.18.3
quay.io/cilium/operator-generic:v1.18.3

接着准备上传镜像,可以使用 skopeo 这个工具将 cilium 依赖镜像搬运到 TCR 镜像仓库中,参考 Installing Skopeo 进行安装。

然后用 skopeo 登录 TCR 镜像仓库(注意替换仓库域名以及用户名和密码):

skopeo login xxx.tencentcloudcr.com --username xxx --password xxx

最后使用 skopeo 将 cilium 依赖镜像都同步到 TCR 镜像仓库中:

skopeo copy -a docker://quay.io/cilium/cilium-envoy:v1.34.10-1761014632-c360e8557eb41011dfb5210f8fb53fed6c0b3222  docker://your-tcr-name.tencentcloudcr.com/quay.io/cilium/cilium-envoy:v1.34.10-1761014632-c360e8557eb41011dfb5210f8fb53fed6c0b3222
skopeo copy -a docker://quay.io/cilium/cilium:v1.18.3 docker://your-tcr-name.tencentcloudcr.com/quay.io/cilium/cilium:v1.18.3
skopeo copy -a docker://quay.io/cilium/operator-generic:v1.18.3 docker://your-tcr-name.tencentcloudcr.com/quay.io/cilium/operator-generic:v1.18.3

如果你的安装配置所依赖镜像较多,也可以通过脚本来实现一键将所有依赖镜像全部同步到 TCR 镜像仓库中,保存下面的脚本内容到 sync-cilium-images.sh 文件中:

注意
  1. TARGET_REGISTRY 是目标 TCR 镜像仓库地址,替换成自己仓库的地址。
  2. 根据自己实际需要的部署配置,修改下 helm template 后面使用的安装参数。
sync-cilium-images.sh
#!/bin/bash

set -e

TARGET_REGISTRY="your-tcr-name.tencentcloudcr.com"

source_images=$(helm template cilium cilium/cilium --version 1.18.3 \
--namespace kube-system \
--set operator.tolerations[0].key="node-role.kubernetes.io/control-plane",operator.tolerations[0].operator="Exists" \
--set operator.tolerations[1].key="node-role.kubernetes.io/master",operator.tolerations[1].operator="Exists" \
--set operator.tolerations[2].key="node.kubernetes.io/not-ready",operator.tolerations[2].operator="Exists" \
--set operator.tolerations[3].key="node.cloudprovider.kubernetes.io/uninitialized",operator.tolerations[3].operator="Exists" \
--set operator.tolerations[4].key="tke.cloud.tencent.com/uninitialized",operator.tolerations[4].operator="Exists" \
--set operator.tolerations[5].key="tke.cloud.tencent.com/eni-ip-unavailable",operator.tolerations[5].operator="Exists" \
--set routingMode=native \
--set endpointRoutes.enabled=true \
--set ipam.mode=delegated-plugin \
--set enableIPv4Masquerade=false \
--set devices=eth+ \
--set cni.chainingMode=generic-veth \
--set cni.customConf=true \
--set cni.configMap=cni-config \
--set cni.externalRouting=true \
--set extraConfig.local-router-ipv4=169.254.32.16 \
--set kubeProxyReplacement=true \
--set k8sServiceHost=169.254.128.125 \
--set k8sServicePort=60002 \
| grep image: | awk -F 'image: "' '/image:/ {gsub(/@sha256:[^"]+"/, ""); print $2}' | sort | uniq)

if [[ -z "${source_images}" ]]; then
echo "没有找到任何镜像"
exit 1
fi

echo "将会进行以下的镜像同步操作:"
while IFS= read -r source_image; do
if [[ -n "${source_image}" ]]; then
target_image="${TARGET_REGISTRY}/${source_image}"
echo "${source_image} --> ${target_image}"
fi
done <<<"${source_images}"

read -p "确认开始同步? (y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "已取消"
exit 0
fi

while IFS= read -r source_image; do
if [[ -n "${source_image}" ]]; then
target_image="${TARGET_REGISTRY}/${source_image}"
echo "同步镜像 ${source_image}${target_image}"
skopeo copy -a "docker://${source_image}" "docker://${target_image}"
fi
done <<<"${source_images}"

赋予执行权限并执行:

chmod +x sync-cilium-images.sh
./sync-cilium-images.sh

使用 TCR 镜像安装 Cilium

参考 安装 cilium 进行安装,替换下依赖镜像为 TCR 镜像仓库中对应的镜像地址:

helm upgrade --install cilium cilium/cilium --version 1.18.3 \
--namespace kube-system \
--set image.repository=your-tcr-name.tencentcloudcr.com/quay.io/cilium/cilium \
--set envoy.image.repository=your-tcr-name.tencentcloudcr.com/quay.io/cilium/cilium-envoy \
--set operator.image.repository=your-tcr-name.tencentcloudcr.com/quay.io/cilium/operator \
--set operator.tolerations[0].key="node-role.kubernetes.io/control-plane",operator.tolerations[0].operator="Exists" \
--set operator.tolerations[1].key="node-role.kubernetes.io/master",operator.tolerations[1].operator="Exists" \
--set operator.tolerations[2].key="node.kubernetes.io/not-ready",operator.tolerations[2].operator="Exists" \
--set operator.tolerations[3].key="node.cloudprovider.kubernetes.io/uninitialized",operator.tolerations[3].operator="Exists" \
--set operator.tolerations[4].key="tke.cloud.tencent.com/uninitialized",operator.tolerations[4].operator="Exists" \
--set operator.tolerations[5].key="tke.cloud.tencent.com/eni-ip-unavailable",operator.tolerations[5].operator="Exists" \
--set routingMode=native \
--set endpointRoutes.enabled=true \
--set ipam.mode=delegated-plugin \
--set enableIPv4Masquerade=false \
--set devices=eth+ \
--set cni.chainingMode=generic-veth \
--set cni.customConf=true \
--set cni.configMap=cni-config \
--set cni.externalRouting=true \
--set extraConfig.local-router-ipv4=169.254.32.16 \
--set kubeProxyReplacement=true \
--set k8sServiceHost=$(kubectl get ep kubernetes -n default -o jsonpath='{.subsets[0].addresses[0].ip}') \
--set k8sServicePort=60002

如果已经执行过安装,可通过以下方式修改依赖镜像地址:

helm upgrade cilium cilium/cilium --version 1.18.3 \
--namespace kube-system \
--reuse-values \
--set image.repository=your-tcr-name.tencentcloudcr.com/quay.io/cilium/cilium \
--set envoy.image.repository=your-tcr-name.tencentcloudcr.com/quay.io/cilium/cilium-envoy \
--set operator.image.repository=your-tcr-name.tencentcloudcr.com/quay.io/cilium/operator