实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1
目录
文章目录
- 实战:借助ucloud镜像加速功能下载镜像(亲测成功)-2022.1.1
- 目录
- 实验环境
- 实验软件
- 1、背景
- 2、技术实现
- 3、批量下载镜像并上传到私有仓库
- 3.1 获取当前最新的镜像
- 3.2 获取指定tag的镜像
- 4.Ucloud
- 注意事项
- 📍 当时使用kubeadm安装k8s集群时使用的是阿里云的镜像仓库
- 📍 其它方式
- 关于我
- 最后
实验环境
docker环境
实验软件
无
1、背景
由于众所周知的原因,k8s安装期间无法直接从k8s.gcr.io
获取镜像,需要经过额外的技术手段才能获取到镜像文件,很不便于k8s的安装部署。为了解决国际互联网下载镜像的各种痛点,需要将镜像拉取到国内的镜像仓库中。
2、技术实现
ucloud的 容器镜像库-UHub
服务提供了镜像加速
功能,可以很方便地将国外镜像拉取到国内,供国内用户使用。
目前,该镜像服务是免费的,但镜像加速需要手动配置。 未查询到相关的官方APl,工单咨询客服得到的答复是未提供创建镜像加速任务的 APl。
具体的操作都是web浏览器中完成的,比较简单。这里仅截图示意。
- 打开ucloud官网,并注册:
- 在全部产品里搜索
Uhub
,找到容器镜像库Uhub
:
- 首先需要创建镜像加速任务:
- 镜像加速下载后,我们可以到用户镜像这里看到已经下载好的镜像了:
- 验证:
docker pull uhub.service.ucloud.cn/k8s_dns_node_cache/k8s-dns-node-cache:1.21.1
- 此时,我们可以将这里的镜像推送到我们的私有仓库就可以方便使用了(或者使用原有进项地址也是可以的)
完美,实验到此结束。
3、批量下载镜像并上传到私有仓库
由于涉及多个镜像,每个镜像又涉及到pull、tag、push操作,这里采用shell脚本实现批量操作。
3.1 获取当前最新的镜像
脚本名称get_k8s_images.sh
,脚本内容如下:
#!/bin/bash
# 说明:本脚本用于从互联网上获取k8s部署时所需的镜像并保存到私有仓库
# 用法: sudo sh get_k8s_images.sh
# 依赖:
1、本脚本依赖ucloud的镜像加速功能,该功能目前为免费功能。但当前不能通过API等方式自动创建镜像加速任务,需要手动创建。
2、上传到本地镜像仓库一般需要登录,请注意本地未保存harbor仓库登录信息时的影响
# 指定互联网地址
ucloud_url="uhub.service.ucloud.cn/kube_apiserver "
# 指定私有仓库地址
harbor_url="harbor.xxxx.xx/k8s"
# 配置yum源。用于安装kubeadm等软件
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 指定安装的kubeadm等软件的版本。小版本不影响该脚本的使用
k8s_version=("1.18.20" "1.19.12" "1.20.8" "1.21.2")
# 循环安装不同版本的kubeadm ,以便于获取不同版本的k8s镜像
for k8s in ${k8s_version[@]};do
# 卸载kubeadm等软件
yum remove -y kubelet kubeadm kubectl
# 安装指定版本的kubeadm等软件
yum install -y kubelet-${k8s} kubeadm-${k8s} kubectl-${k8s} --disableexcludes=kubernetes
# 获取所有k8s安装所需的镜像名称及版本等信息
images_list=`/usr/bin/kubeadm config images list|awk -F '/' '{print $NF}'`
for image in ${images_list[@]};do
# 从ucloud下载镜像到本地
docker pull ${ucloud_url}/${image}
if [ $? -eq 0 ];then
echo "从ucloud容器镜像库成功拉取${image}镜像"
else
echo "从ucloud容器镜像库成功拉取${image}镜像失败"
exit 1
fi
# 打标签
docker tag ${ucloud_url}/${image} ${harbor_url}/${image}
# 推送到本地私有的harbor仓库
docker push ${harbor_url}/${image}
if [ $? -eq 0 ];then
echo "成功将${image}推送到harbor仓库"
else
echo "推送${image}镜像失败"
fi
done
done
3.2 获取指定tag的镜像
脚本名称get_k8s_images.sh
,脚本内容如下:
#!/bin/bash
# 说明:本脚本用于从互联网上获取k8s部署时所需的镜像并保存到私有仓库
# 用法: sudo sh get_k8s_images.sh 镜像版本
# 用法示例: sudo sh get_k8s_images.sh 1.21.1
# 依赖:
1、本脚本依赖ucloud的镜像加速功能,该功能目前为免费功能。但当前不能通过API等方式自动创建镜像加速任务,需要手动创建。
2、上传到本地镜像仓库一般需要登录,请注意本地未保存harbor仓库登录信息时的影响
# 指定互联网地址
ucloud_url="uhub.service.ucloud.cn/kube_apiserver "
# 指定私有仓库地址
harbor_url="harbor.xxxx.xx/k8s"
# 指定kubeadm版本。根据传入的镜像版本自动匹配
TEMP_NUMBER=`echo $1|awk -F '.' '{print $2}'`
case "$TEMP_NUMBER" in
18)
VERSION="1.18.20"
;;
19)
VERSION="1.19.12"
;;
20)
VERSION="1.20.8"
;;
21)
VERSION="1.21.2"
;;
*)
echo "请您核对输入的镜像版本! "
exit 1
;;
esac
# 配置yum源。用于安装kubeadm等软件
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 卸载kubeadm等软件。这里采用偷懒的做法,不管是否符合预期,都是先卸载在安装
yum remove -y kubelet kubeadm kubectl
# 指定安装的kubeadm等软件的版本。小版本不影响该脚本的使用
yum install -y kubelet-${VERSION} kubeadm-${VERSION} kubectl-${VERSION} --disableexcludes=kubernetes
# 导出k8s配置文件
kubeadm config print init-defaults > /tmp/kubeadm.yaml
# 获取默认的镜像版本
k8s_version=`egrep kubernetesVersion /tmp/kubeadm.yaml`
# 将镜像版本替换为指定版本
sed -i "s#${k8s_version}#kubernetesVersion: $1#g" /tmp/kubeadm.yaml
# 获取所有k8s安装所需的镜像名称及版本等信息
images_list=`/usr/bin/kubeadm config images list --config /tmp/kubeadm.yaml|awk -F '/' '{print $NF}'` for image in ${images_list[@]};do
# 从ucloud下载镜像到本地
docker pull ${ucloud_url}/${image}
if [ $? -eq 0 ];then
echo "从ucloud容器镜像库成功拉取${image}镜像"
else
echo "从ucloud容器镜像库成功拉取${image}镜像失败"
exit 1
fi
# 打标签
docker tag ${ucloud_url}/${image} ${harbor_url}/${image}
# 推送到本地私有的harbor仓库
docker push ${harbor_url}/${image}
if [ $? -eq 0 ];then
echo "成功将${image}推送到harbor仓库"
else
echo "推送${image}镜像失败"
fi
done
4.Ucloud
注意事项
📍 当时使用kubeadm安装k8s集群时使用的是阿里云的镜像仓库
⚠️ 下面这个需求自己当时安装并没有用到,先记录下来,我记得是使用阿里云的那个仓库地址就可以来着,感觉不需要再写一个sehll脚本这么麻烦来着的。
registry.aliyuncs.com/google_containers
💥 还需要注意的是:这个registry.aliyuncs.com/google_containers
仓库地址,是配置在k8s image位置的,但是我在docker里想单独配置,该如何配置呢?只不是只能使用ucloud
来做镜像中转了。
(把这个配置在/etc/docker/daemon.json
里是有问题的;)
📍 其它方式
- cloudshell
https://console.cloud.google.com/cloudshell,可以用这个,你搜搜使用方法把,就是通过这个下载镜像,然后推送到docker hub后,国内就可以下载了。