在部署项目时,通常会开放外网以便拉取所需的镜像。然而,一旦部署完成,关闭外网可能会导致在当前服务器上仅存在部分服务的镜像。这可能会导致后续的调度无法拉取其他服务所需的镜像。为了解决这个问题,可以在部署完成后,通过脚本在主节点统计项目所使用的所有镜像地址,并将其保存到一个文件中。然后,在每台服务器上运行一个脚本,该脚本会读取该文件中的镜像地址,并拉取相应的镜像,以确保所有服务器上都存在所需的镜像。这样就能够保证集群中的所有节点都具有所需的镜像,而不会受到外网关闭的影响。

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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐