ucloud镜像加速
更新于:2024年3月8日
实战-借助ucloud镜像加速功能下载镜像-2022.1.1(测试成功)

1、背景
由于众所周知的原因,k8s安装期间无法直接从k8s.gcr.io获取镜像,需要经过额外的技术手段才能获取到镜像文件,很不便于k8s的安装部署。为了解决国际互联网下载镜像的各种痛点,需要将镜像拉取到国内的镜像仓库中。
2、技术实现
ucloud的 容器镜像库-UHub服务提供了镜像加速功能,可以很方便地将国外镜像拉取到国内,供国内用户使用。
目前,该镜像服务是免费的,但镜像加速需要手动配置。 未查询到相关的官方APl,工单咨询客服得到的答复是未提供创建镜像加速任务的 APl。
具体的操作都是web浏览器中完成的,比较简单。这里仅截图示意。
- 打开ucloud官网,并注册:
- 在全部产品里搜索
Uhub,找到容器镜像库Uhub:

- 首先需要创建镜像加速任务:


- 镜像加速下载后,我们可以到用户镜像这里看到已经下载好的镜像了:

- 验证:
1docker pull uhub.service.ucloud.cn/k8s_dns_node_cache/k8s-dns-node-cache:1.21.1


- 此时,我们可以将这里的镜像推送到我们的私有仓库就可以方便使用了(或者使用原有镜像地址也是可以的)
完美,实验到此结束。😘
3、批量下载镜像并上传到私有仓库
由于涉及多个镜像,每个镜像又涉及到pull、tag、push操作,这里采用shell脚本实现批量操作。
1.获取当前最新的镜像
脚本名称get_k8s_images.sh,脚本内容如下:
1###!/bin/bash
2### 说明:本脚本用于从互联网上获取k8s部署时所需的镜像并保存到私有仓库
3### 用法: sudo sh get_k8s_images.sh
4### 依赖:
51、本脚本依赖ucloud的镜像加速功能,该功能目前为免费功能。但当前不能通过API等方式自动创建镜像加速任务,需要手动创建。
62、上传到本地镜像仓库一般需要登录,请注意本地未保存harbor仓库登录信息时的影响
7### 指定互联网地址
8ucloud_url="uhub.service.ucloud.cn/kube_apiserver "
9### 指定私有仓库地址
10harbor_url="harbor.xxxx.xx/k8s"
11
12### 配置yum源。用于安装kubeadm等软件
13cat <<EOF > /etc/yum.repos.d/kubernetes.repo
14[kubernetes]
15name=Kubernetes
16baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
17enabled=1
18gpgcheck=1
19repo_gpgcheck=1
20gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
21http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
22EOF
23
24### 指定安装的kubeadm等软件的版本。小版本不影响该脚本的使用
25k8s_version=("1.18.20" "1.19.12" "1.20.8" "1.21.2")
26
27### 循环安装不同版本的kubeadm ,以便于获取不同版本的k8s镜像
28for k8s in ${k8s_version[@]};do
29### 卸载kubeadm等软件
30yum remove -y kubelet kubeadm kubectl
31### 安装指定版本的kubeadm等软件
32yum install -y kubelet-${k8s} kubeadm-${k8s} kubectl-${k8s} --disableexcludes=kubernetes
33### 获取所有k8s安装所需的镜像名称及版本等信息
34images_list=`/usr/bin/kubeadm config images list|awk -F '/' '{print $NF}'`
35for image in ${images_list[@]};do
36### 从ucloud下载镜像到本地
37docker pull ${ucloud_url}/${image}
38if [ $? -eq 0 ];then
39echo "从ucloud容器镜像库成功拉取${image}镜像"
40else
41echo "从ucloud容器镜像库成功拉取${image}镜像失败"
42exit 1
43fi
44### 打标签
45docker tag ${ucloud_url}/${image} ${harbor_url}/${image}
46### 推送到本地私有的harbor仓库
47docker push ${harbor_url}/${image}
48if [ $? -eq 0 ];then
49echo "成功将${image}推送到harbor仓库"
50else
51echo "推送${image}镜像失败"
52fi
53done
54done




2.获取指定tag的镜像
脚本名称get_k8s_images.sh,脚本内容如下:
1###!/bin/bash
2### 说明:本脚本用于从互联网上获取k8s部署时所需的镜像并保存到私有仓库
3### 用法: sudo sh get_k8s_images.sh 镜像版本
4### 用法示例: sudo sh get_k8s_images.sh 1.21.1
5### 依赖:
61、本脚本依赖ucloud的镜像加速功能,该功能目前为免费功能。但当前不能通过API等方式自动创建镜像加速任务,需要手动创建。
72、上传到本地镜像仓库一般需要登录,请注意本地未保存harbor仓库登录信息时的影响
8### 指定互联网地址
9ucloud_url="uhub.service.ucloud.cn/kube_apiserver "
10### 指定私有仓库地址
11harbor_url="harbor.xxxx.xx/k8s"
12
13### 指定kubeadm版本。根据传入的镜像版本自动匹配
14TEMP_NUMBER=`echo $1|awk -F '.' '{print $2}'`
15case "$TEMP_NUMBER" in
1618)
17VERSION="1.18.20"
18;;
1919)
20VERSION="1.19.12"
21;;
2220)
23VERSION="1.20.8"
24;;
2521)
26VERSION="1.21.2"
27;;
28*)
29echo "请您核对输入的镜像版本! "
30exit 1
31;;
32esac
33
34### 配置yum源。用于安装kubeadm等软件
35cat <<EOF > /etc/yum.repos.d/kubernetes.repo
36[kubernetes]
37name=Kubernetes
38baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
39enabled=1
40gpgcheck=1
41repo_gpgcheck=1
42gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
43http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
44EOF
45
46### 卸载kubeadm等软件。这里采用偷懒的做法,不管是否符合预期,都是先卸载在安装
47yum remove -y kubelet kubeadm kubectl
48
49### 指定安装的kubeadm等软件的版本。小版本不影响该脚本的使用
50yum install -y kubelet-${VERSION} kubeadm-${VERSION} kubectl-${VERSION} --disableexcludes=kubernetes
51### 导出k8s配置文件
52kubeadm config print init-defaults > /tmp/kubeadm.yaml
53### 获取默认的镜像版本
54k8s_version=`egrep kubernetesVersion /tmp/kubeadm.yaml`
55### 将镜像版本替换为指定版本
56sed -i "s###${k8s_version}###kubernetesVersion: $1###g" /tmp/kubeadm.yaml
57### 获取所有k8s安装所需的镜像名称及版本等信息
58images_list=`/usr/bin/kubeadm config images list --config /tmp/kubeadm.yaml|awk -F '/' '{print $NF}'` for image in ${images_list[@]};do
59### 从ucloud下载镜像到本地
60docker pull ${ucloud_url}/${image}
61if [ $? -eq 0 ];then
62echo "从ucloud容器镜像库成功拉取${image}镜像"
63else
64echo "从ucloud容器镜像库成功拉取${image}镜像失败"
65exit 1
66fi
67### 打标签
68docker tag ${ucloud_url}/${image} ${harbor_url}/${image}
69### 推送到本地私有的harbor仓库
70docker push ${harbor_url}/${image}
71if [ $? -eq 0 ];then
72echo "成功将${image}推送到harbor仓库"
73else
74echo "推送${image}镜像失败"
75fi
76done



FAQ
ucloud官网


个人镜像仓库ucloud
https://console.ucloud.cn/uhub/uhub/user_image
以后自己的个人镜像仓库就用
ucloud了:1.可以转存国外镜像;
2.可以当做自己的镜像仓库;(可公网供大家访问)


其它方式
- cloudshell (这个个人没用过)
https://console.cloud.google.com/cloudshell,可以用这个,你搜搜使用方法把,就是通过这个下载镜像,然后推送到docker hub后,国内就可以下载了。


关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

🍀 微信公众号
《云原生架构师实战》

🍀 语雀
https://www.yuque.com/xyy-onlyone
https://www.yuque.com/xyy-onlyone/exkgza?# 《语雀博客》

🍀 博客


🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎
https://www.zhihu.com/people/foryouone

最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!


