Files
devstar/docs/kubernetes/k8s-step5-install-flannel.sh

78 lines
2.5 KiB
Bash

#!/bin/bash
set -e
# Kubernetes 网络插件安装脚本
# 功能: 在 Master 节点安装 Flannel 网络插件
echo "==== 安装 Flannel 网络插件 ===="
# 1. 下载 Flannel 配置文件
echo "下载 Flannel 配置文件..."
FLANNEL_VER="v0.27.4"
curl -fsSL https://raw.githubusercontent.com/flannel-io/flannel/${FLANNEL_VER}/Documentation/kube-flannel.yml -O
# 2. 修改 Flannel 配置
echo "修改 Flannel 配置..."
sed -i 's|"Network": "10.244.0.0/16"|"Network": "10.244.0.0/16"|g' kube-flannel.yml
echo "预拉取 Flannel 相关镜像(优先国内镜像域名,拉取后回标官方名)..."
DOCKER_MIRROR="docker.m.daocloud.io"
REGISTRY_K8S_MIRROR="registry-k8s-io.mirrors.sjtug.sjtu.edu.cn"
GHCR_MIRROR="ghcr.tencentcloudcr.com"
IMAGES=(
"registry.k8s.io/pause:3.8"
"ghcr.io/flannel-io/flannel:${FLANNEL_VER}"
)
pull_and_tag() {
local origin_ref="$1" # e.g. registry.k8s.io/pause:3.8
local mirror_ref="$2" # e.g. registry-k8s-io.mirrors.sjtug.sjtu.edu.cn/pause:3.8
echo "尝试从镜像 ${mirror_ref} 预拉取..."
for i in $(seq 1 5); do
if sudo ctr -n k8s.io images pull "${mirror_ref}"; then
echo "打官方标签: ${origin_ref} <- ${mirror_ref}"
sudo ctr -n k8s.io images tag "${mirror_ref}" "${origin_ref}" || true
return 0
fi
echo "pull 失败,重试 ${i}/5..."; sleep 2
done
return 1
}
# 预拉取 pause 镜像
echo "预拉取: registry.k8s.io/pause:3.8"
if pull_and_tag "registry.k8s.io/pause:3.8" "${REGISTRY_K8S_MIRROR}/pause:3.8"; then
echo "pause 镜像拉取成功"
else
echo "WARN: pause 镜像拉取失败,将由 kubelet 重试"
fi
# 预拉取 flannel 镜像
echo "预拉取: ghcr.io/flannel-io/flannel:${FLANNEL_VER}"
if pull_and_tag "ghcr.io/flannel-io/flannel:${FLANNEL_VER}" "${GHCR_MIRROR}/flannel-io/flannel:${FLANNEL_VER}"; then
echo "flannel 镜像拉取成功"
else
echo "WARN: flannel 镜像拉取失败,将由 kubelet 重试"
fi
# 3. 安装 Flannel
echo "安装 Flannel..."
kubectl apply -f kube-flannel.yml
# 4. 等待 Flannel 启动
echo "等待 Flannel 组件就绪..."
kubectl -n kube-flannel rollout status daemonset/kube-flannel-ds --timeout=600s || true
kubectl wait --for=condition=ready pod -l app=flannel -n kube-flannel --timeout=600s || true
echo "等待 CoreDNS 由 Pending 变为 Ready..."
kubectl -n kube-system rollout status deploy/coredns --timeout=600s || true
# 5. 验证网络插件
echo "==== 验证 Flannel 安装 ===="
kubectl get pods -n kube-flannel
kubectl get nodes
echo "==== Flannel 网络插件安装完成 ===="