k8s kubectl统计集群中用到的所有镜像地址,让每台服务器拉取这些镜像。
kubectl统计集群中用到的所有镜像地址
·
在部署项目时,通常会开放外网以便拉取所需的镜像。然而,一旦部署完成,关闭外网可能会导致在当前服务器上仅存在部分服务的镜像。这可能会导致后续的调度无法拉取其他服务所需的镜像。为了解决这个问题,可以在部署完成后,通过脚本在主节点统计项目所使用的所有镜像地址,并将其保存到一个文件中。然后,在每台服务器上运行一个脚本,该脚本会读取该文件中的镜像地址,并拉取相应的镜像,以确保所有服务器上都存在所需的镜像。这样就能够保证集群中的所有节点都具有所需的镜像,而不会受到外网关闭的影响。
1、在主机点 新建一个脚本 vi count_images.sh,加入以下代码,并赋予执行权限
执行后会在本目录下输出一个images.txt,里面包含了项目中用到的所有镜像地址。
#!/bin/bash
IMAGES=$(kubectl get pods --all-namespaces -o=jsonpath='{.items[*].spec.containers[*].image}')
IFS=' ' read -r -a IMAGE_ARRAY <<< "$IMAGES"
declare -A IMAGE_COUNT
for IMAGE in "${IMAGE_ARRAY[@]}"; do
if [[ -v IMAGE_COUNT["$IMAGE"] ]]; then
((IMAGE_COUNT["$IMAGE"]++))
else
IMAGE_COUNT["$IMAGE"]=1
fi
done
echo "镜像地址列表:" > images.txt
for IMAGE in "${!IMAGE_COUNT[@]}"; do
echo "$IMAGE" >> images.txt
done
echo "镜像地址已保存到 images.txt 文件中。"
2、 将images.txt文件 scp到每个工作节点服务器上
scp命令
scp images.txt 用户名@IP地址:/路径
3、在工作节点拉取这些镜像,新建一个脚本 vi pull_images.sh 并赋予执行权限 加入以下代码
#!/bin/bash
while IFS= read -r LINE; do
if [[ $LINE != "镜像地址列表:" ]]; then
echo "拉取镜像:$LINE"
docker pull "$LINE"
fi
done < images.txt
执行这个脚本,当前服务器就会自动拉取这些镜像。
补充 批量tag镜像并推送
#!/bin/bash
while IFS= read -r LINE; do
if [[ $LINE != "镜像地址列表:" ]]; then
# 替换 LINE 中的 123 为 567
NEW_LINE=${LINE//123/567}
echo "重新标记镜像:$LINE 为 $NEW_LINE"
docker tag "$LINE" "$NEW_LINE"
echo "推送镜像:$NEW_LINE"
docker push "$NEW_LINE"
fi
done < images.txt
更多推荐
已为社区贡献5条内容
所有评论(0)