场景, 重启某个节点,或者下掉某个节点后,因为镜像的原因不能快速的拉去,所以有了这个脚本,可以获取所有拉去镜像失败的 pod 信息,包含镜像名称,以及所在节点。
脚本如下:
只列出:节点+镜像:
checkall-k8s-images-fail.sh
#!/bin/bash
# 获取所有 Pod 的详细信息
pods=$(kubectl get pods --all-namespaces -o json)
# 使用 jq 解析 JSON 数据,提取 ImagePullBackOff 的容器信息,包括镜像名称和所在节点
failed_containers=$(echo "$pods" | jq -r '
.items[] |
{
namespace: .metadata.namespace,
pod: .metadata.name,
node: .spec.nodeName,
containers: .status.containerStatuses[] |
select(.state.waiting.reason == "ImagePullBackOff") |
{
container: .name,
image: .image,
message: .state.waiting.message
}
} |
select(.containers != null) |
" Node: \(.node), Image: \(.containers.image)"
')
# 检查是否有失败的容器
if [ -z "$failed_containers" ]; then
echo "没有找到处于 ImagePullBackOff 状态的容器。"
else
echo "处于 ImagePullBackOff 状态的容器信息:"
echo "$failed_containers"
fi
checkall-k8s-images-fail.sh
列出其他容器信息
#!/bin/bash
# 获取所有 Pod 的详细信息
pods=$(kubectl get pods --all-namespaces -o json)
# 使用 jq 解析 JSON 数据,提取 ImagePullBackOff 的容器信息,包括镜像名称和所在节点
failed_containers=$(echo "$pods" | jq -r '
.items[] |
{
namespace: .metadata.namespace,
pod: .metadata.name,
node: .spec.nodeName,
containers: .status.containerStatuses[] |
select(.state.waiting.reason == "ImagePullBackOff") |
{
container: .name,
image: .image,
message: .state.waiting.message
}
} |
select(.containers != null) |
"Namespace: \(.namespace), Pod: \(.pod), Node: \(.node), Container: \(.containers.container), Image: \(.containers.image), Message: \(.containers.message)"
')
# 检查是否有失败的容器
if [ -z "$failed_containers" ]; then
echo "没有找到处于 ImagePullBackOff 状态的容器。"
else
echo "处于 ImagePullBackOff 状态的容器信息:"
echo "$failed_containers"
fi
2- 批量拉去镜像:
方式1:定义个列表
bulk_pullimages_lists.sh
#!/bin/bash
# 传入目标标签前缀
URL=docker.m.daocloud.io
#URL=hub.baimeidashu.com
# 定义源镜像列表
#SOURCE_IMAGES=("image1" "image2" "image3") # 你可以根据需要修改这个列表
SOURCE_IMAGES=("kubesphere/ks-installer:v3.3.2" "kubesphere/kube-rbac-proxy:v0.11.0") # 你可以根据需要修改这个列表
for SOURCE_IMAGE in "${SOURCE_IMAGES[@]}"; do
FULL_SOURCE_IMAGE="$URL/$SOURCE_IMAGE"
echo "Pulling image: $FULL_SOURCE_IMAGE"
docker pull "$FULL_SOURCE_IMAGE"
TARGET_TAG="${SOURCE_IMAGE}"
echo "Tagging image: $FULL_SOURCE_IMAGE as $TARGET_TAG"
docker tag "$FULL_SOURCE_IMAGE" "$TARGET_TAG"
echo "$TARGET_TAG is success"
done
方式2: 镜像名称在txt中
sh 2_bulk_pullimages_txt.sh images.txt
2_bulk_pullimages_txt.sh
内容如下:
#!/bin/bash
# 传入源镜像文件和目标标签前缀
URL=docker.m.daocloud.io
#URL=hub.baimeidashu.com
SOURCE_IMAGE_FILE=$1
# 检查文件是否存在
if [[ ! -f "$SOURCE_IMAGE_FILE" ]]; then
echo "File $SOURCE_IMAGE_FILE not found!"
exit 1
fi
# 读取文件中的每一行并处理
while IFS= read -r SOURCE_IMAGE; do
FULL_SOURCE_IMAGE="$URL/$SOURCE_IMAGE"
echo "Pulling image: $FULL_SOURCE_IMAGE"
docker pull "$FULL_SOURCE_IMAGE"
TARGET_TAG="${SOURCE_IMAGE}"
echo "Tagging image: $FULL_SOURCE_IMAGE as $TARGET_TAG"
docker tag "$FULL_SOURCE_IMAGE" "$TARGET_TAG"
echo "$TARGET_TAG is success"
done < "$SOURCE_IMAGE_FILE"
images.txt
欢迎来撩 : 汇总all