别再手动拉镜像了!用这个脚本5分钟搞定K8s 1.18.6集群的国内镜像源问题

张开发
2026/4/21 9:30:32 15 分钟阅读

分享文章

别再手动拉镜像了!用这个脚本5分钟搞定K8s 1.18.6集群的国内镜像源问题
5分钟极速部署Kubernetes 1.18.6集群智能镜像加速方案全解析当你在国内环境尝试搭建Kubernetes集群时是否经常被各种镜像拉取失败的问题困扰传统的手动拉取镜像方式不仅耗时耗力还容易出错。本文将为你揭秘一种高效解决方案——通过智能脚本自动化处理镜像加速问题让你在5分钟内完成Kubernetes 1.18.6集群的部署。1. 为什么需要镜像加速方案Kubernetes官方镜像仓库k8s.gcr.io在国内访问存在明显延迟甚至无法连接的问题。这导致许多开发者在初始化集群时常常卡在kubeadm init阶段看着不断报错的镜像拉取提示束手无策。常见的解决方案包括手动从第三方仓库拉取后重命名使用国内镜像源如阿里云、中科大等导入他人分享的离线镜像包但这些方法各有局限手动操作步骤繁琐容易出错单一镜像源某些版本可能同步不及时离线包版本固定缺乏灵活性2. 智能镜像加速脚本设计我们设计了一个全自动化的Shell脚本它能智能选择最优镜像源完成拉取、重命名和清理工作。以下是脚本的核心功能#!/bin/bash # Kubernetes 1.18.6 镜像自动拉取脚本 set -e KUBE_VERSIONv1.18.6 MIRROR_SOURCES( registry.cn-hangzhou.aliyuncs.com/google_containers mirrorgooglecontainers kubeimage ) # 核心组件列表 CORE_IMAGES( kube-apiserver:${KUBE_VERSION} kube-controller-manager:${KUBE_VERSION} kube-scheduler:${KUBE_VERSION} kube-proxy:${KUBE_VERSION} pause:3.2 etcd:3.4.3-0 coredns:1.6.7 ) function select_fastest_mirror() { # 简单的镜像源测速逻辑 local fastest_source local min_time999 for source in ${MIRROR_SOURCES[]}; do local test_imagelibrary/hello-world local start_time$(date %s.%N) if docker pull ${source}/${test_image} /dev/null; then local end_time$(date %s.%N) local duration$(echo $end_time - $start_time | bc) if (( $(echo $duration $min_time | bc -l) )); then min_time$duration fastest_source$source fi docker rmi ${source}/${test_image} /dev/null || true fi done echo $fastest_source } function pull_and_retag() { local source$1 local image$2 case $source in registry.cn-hangzhou.aliyuncs.com/google_containers) docker pull ${source}/${image} docker tag ${source}/${image} k8s.gcr.io/${image} docker rmi ${source}/${image} ;; mirrorgooglecontainers) docker pull ${source}/${image} docker tag ${source}/${image} k8s.gcr.io/${image} docker rmi ${source}/${image} ;; kubeimage) local adjusted_image$(echo $image | sed s/:/\-amd64:/) docker pull ${source}/${adjusted_image} docker tag ${source}/${adjusted_image} k8s.gcr.io/${image} docker rmi ${source}/${adjusted_image} ;; esac } FASTEST_SOURCE$(select_fastest_mirror) echo [INFO] 选择最快镜像源: ${FASTEST_SOURCE} echo [INFO] 开始拉取Kubernetes ${KUBE_VERSION} 镜像... for image in ${CORE_IMAGES[]}; do echo 正在处理: ${image} pull_and_retag $FASTEST_SOURCE $image done echo [SUCCESS] 所有镜像已准备就绪脚本核心优势智能源选择自动测试多个镜像源的速度选择最优节点多源兼容支持阿里云、Google镜像和第三方仓库自动清理拉取重命名后自动删除中间镜像节省空间错误处理严格的错误检查机制避免部分失败导致整体问题3. 国内主流镜像源对比我们测试了三个主流镜像源的可用性和速度基于华东地区ECS测试镜像源名称平均下载速度版本同步延迟稳定性阿里云镜像仓库15MB/s1-3天★★★★★Google镜像仓库2MB/s实时★★★☆☆第三方kubeimage仓库8MB/s1-2周★★★★☆提示实际速度会受网络环境影响建议在脚本中配置多个备选源4. 集群部署实战准备好镜像后集群部署就变得非常简单# 初始化Master节点 kubeadm init \ --kubernetes-versionv1.18.6 \ --apiserver-advertise-address你的内网IP \ --pod-network-cidr10.244.0.0/16 \ --service-cidr10.1.0.0/16 # 配置kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 安装网络插件(以Flannel为例) kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml常见问题解决方案镜像拉取失败检查脚本是否选择了正确的镜像源尝试手动指定其他镜像源重新运行kubelet启动报错确认已关闭swapswapoff -a检查防火墙和SELinux状态网络插件无法正常工作确认--pod-network-cidr参数与插件匹配检查节点间网络连通性5. 高级技巧与优化对于生产环境我们还可以进一步优化多源并行下载修改脚本支持同时从多个源下载不同镜像# 在pull_and_retag函数中添加并行处理 MAX_PARALLEL3 for image in ${CORE_IMAGES[]}; do ((ii%MAX_PARALLEL)); ((i0)) wait pull_and_retag $FASTEST_SOURCE $image done本地镜像缓存将拉取好的镜像打包供其他节点使用# 在Master节点上导出镜像 docker save $(docker images | awk /k8s.gcr.io/{print $1:$2}) -o k8s-images.tar # 在Node节点上导入 docker load -i k8s-images.tar版本兼容性处理自动适配不同Kubernetes版本的核心组件# 根据Kubernetes版本自动确定配套组件版本 function set_component_versions() { local kube_version$1 local version_map( v1.18.6:3.4.3-0:1.6.7:3.2 v1.20.4:3.4.13-0:1.7.0:3.2 ) for item in ${version_map[]}; do if [[ $item ${kube_version}:* ]]; then IFS: read -r _ ETCD_VERSION CORE_DNS_VERSION PAUSE_VERSION $item return fi done # 默认版本 ETCD_VERSION3.4.3-0 CORE_DNS_VERSION1.6.7 PAUSE_VERSION3.2 }在实际项目中这个脚本帮助我们节省了大量部署时间。特别是在需要频繁创建销毁测试集群的场景下从原来的半小时缩短到5分钟效率提升显著。

更多文章