添加 install_k8s/install_k8s_ubuntu-final.sh

This commit is contained in:
2026-07-24 15:54:22 +08:00
parent a3c0a25aa0
commit 57425c0a3a
+276
View File
@@ -0,0 +1,276 @@
#!/bin/bash
# ---------------------------------------------------------
# Kubernetes (K8s) 高可用集群自动化脚本 (Ubuntu 专用 Final 版)
# 包含: 基础环境、组件安装、HAProxy+Keepalived VIP、K8s 初始化
# 解决: Containerd 2.x 兼容性、HAProxy 离线绑定崩溃、Crictl 警告等历史难题
# ---------------------------------------------------------
# ================= 变量配置区 (执行前务必修改) =================
K8S_VERSION="1.28.2-*"
POD_SUBNET="10.244.0.0/16"
SERVICE_SUBNET="10.96.0.0/12"
# 1. 高可用 VIP 配置
VIP="192.168.40.100"
VIP_PORT="16443"
# 自动获取当前机器的主网卡名称,避免 Keepalived 绑定失败
VIP_INTERFACE=$(ip route | grep default | awk '{print $5}' | head -n 1)
# 2. Master 节点真实 IP 列表
MASTER01_IP="192.168.40.10"
MASTER02_IP="192.168.40.11"
MASTER03_IP="192.168.40.12"
# 控制平面入口地址
CONTROL_PLANE_ENDPOINT="${VIP}:${VIP_PORT}"
# ===============================================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}请使用 root 权限运行此脚本!(sudo -i 或者 sudo ./script.sh)${NC}"
exit 1
fi
# 1. 基础环境
function prepare_env() {
echo -e "${GREEN}==> 开始初始化系统环境 (Ubuntu)...${NC}"
# 关闭防火墙
ufw disable
systemctl stop ufw && systemctl disable ufw
# 关闭 Swap
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 加载内核模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 【核心配置】增加 ip_nonlocal_bind,允许 HAProxy 绑定还未漂移过来的 VIP
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
EOF
sysctl --system
echo -e "${GREEN}==> 系统环境初始化完成。${NC}"
}
# 2. 安装并锁定 Containerd 1.6.x (避开 2.x 的巨坑)
function install_containerd() {
echo -e "${GREEN}==> 开始安装 Containerd (强制降级并锁定 1.6.x 稳定版)...${NC}"
# 清理可能存在的旧版本或不兼容的 2.x 版本
apt-get purge -y containerd containerd.io
apt-get autoremove -y
rm -rf /etc/containerd/
apt-get update -y
apt-get install -y apt-transport-https ca-certificates curl software-properties-common gpg
# 配置阿里云 Docker 官方源
install -m 0755 -d /etc/apt/keyrings
rm -f /etc/apt/keyrings/docker.gpg
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update -y
# 动态获取 1.6.x 系列的最新版本号并强制安装
local VER=$(apt-cache madison containerd.io | grep ' 1.6.' | head -n 1 | awk -F '|' '{print $2}' | tr -d ' ')
if [ -z "$VER" ]; then
echo -e "${RED}无法找到 containerd.io 1.6.x 版本,请检查网络源!${NC}"
exit 1
fi
echo -e "${YELLOW}匹配到稳定版本: ${VER}${NC}"
apt-get install -y --allow-downgrades containerd.io=$VER
# 锁定版本,防止无人值守更新将其升级到 2.x
apt-mark hold containerd.io
# 生成 1.6.x 兼容的默认配置
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml > /dev/null
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
systemctl daemon-reload
systemctl enable --now containerd
# 【核心配置】配置 crictl,消除 socket 警告
cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
echo -e "${GREEN}==> Containerd 安装配置完成。${NC}"
}
# 3. 安装 K8s 组件
function install_k8s_tools() {
echo -e "${GREEN}==> 开始安装 kubeadm, kubelet, kubectl (使用阿里云新版 APT 源)...${NC}"
mkdir -p /etc/apt/keyrings
rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update -y
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
systemctl enable --now kubelet
echo -e "${GREEN}==> Kubernetes 组件安装完成。${NC}"
}
# 4. 配置负载均衡 (HAProxy + Keepalived)
function setup_vip() {
local STATE=$1
local PRIORITY=$2
echo -e "${GREEN}==> 开始配置 HAProxy 和 Keepalived (绑定的网卡: ${VIP_INTERFACE})...${NC}"
apt-get install -y haproxy keepalived
cat <<EOF | tee /etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
mode tcp
log global
option tcplog
timeout connect 10s
timeout client 1m
timeout server 1m
frontend kubernetes-apiserver
bind ${VIP}:${VIP_PORT}
mode tcp
default_backend kubernetes-master
backend kubernetes-master
mode tcp
balance roundrobin
option tcp-check
server master01 ${MASTER01_IP}:6443 check
server master02 ${MASTER02_IP}:6443 check
server master03 ${MASTER03_IP}:6443 check
EOF
cat <<EOF | tee /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 3
weight -2
fall 10
rise 2
}
vrrp_instance VI_1 {
state ${STATE}
interface ${VIP_INTERFACE}
virtual_router_id 51
priority ${PRIORITY}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
${VIP}
}
track_script {
check_haproxy
}
}
EOF
systemctl restart haproxy keepalived
systemctl enable haproxy keepalived
echo -e "${GREEN}==> HAProxy 和 Keepalived 配置完成 (角色: ${STATE})。${NC}"
}
# 5. 初始化第一个 Master 节点
function init_first_master() {
echo -e "${YELLOW}==> 正在清理可能残留的 K8s 脏数据...${NC}"
kubeadm reset -f
rm -rf /etc/cni/net.d
rm -rf $HOME/.kube/config
echo -e "${GREEN}==> 检查 VIP 是否存活...${NC}"
ping -c 3 ${VIP} || { echo -e "${RED}警告: 无法 ping 通 VIP ${VIP},请确保 Keepalived 正常启动且无 IP 冲突!${NC}"; exit 1; }
echo -e "${GREEN}==> 检查 Containerd 存活状态...${NC}"
crictl ps > /dev/null || { echo -e "${RED}警告: 无法连接 containerd,请检查服务状态!${NC}"; exit 1; }
echo -e "${GREEN}==> 开始初始化第一个 Master 节点...${NC}"
kubeadm init \
--control-plane-endpoint="${CONTROL_PLANE_ENDPOINT}" \
--upload-certs \
--kubernetes-version=v1.28.2 \
--pod-network-cidr=${POD_SUBNET} \
--service-cidr=${SERVICE_SUBNET} \
--image-repository=registry.aliyuncs.com/google_containers
if [ $? -eq 0 ]; then
echo -e "${YELLOW}========================================================================${NC}"
echo -e "${GREEN}集群初始化成功!请妥善保存上面输出的 kubeadm join 命令。${NC}"
echo -e "${YELLOW}========================================================================${NC}"
export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
echo -e "${GREEN}==> 正在部署 Calico 网络插件...${NC}"
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
else
echo -e "${RED}集群初始化失败!请使用 'journalctl -xeu kubelet' 检查报错。${NC}"
fi
}
# 主路由逻辑
case "$1" in
base)
prepare_env
install_containerd
install_k8s_tools
;;
init-vip-master)
setup_vip "MASTER" 100
;;
init-vip-backup)
setup_vip "BACKUP" 90
;;
init-master)
init_first_master
;;
*)
echo -e "${YELLOW}用法: sudo $0 {base|init-vip-master|init-vip-backup|init-master}${NC}"
echo ""
echo "多 Master 节点高可用部署标准流程:"
echo "1. 所有节点准备环境: sudo ./install_k8s_ubuntu_final.sh base"
echo "2. Master01 设置为主 LB: sudo ./install_k8s_ubuntu_final.sh init-vip-master"
echo "3. 其它 Master 设置为备 LB: sudo ./install_k8s_ubuntu_final.sh init-vip-backup"
echo "4. Master01 初始化集群: sudo ./install_k8s_ubuntu_final.sh init-master"
echo "5. 复制输出的 join 命令,到其他 Master 和 Worker 节点上手动执行。"
exit 1
esac