#!/bin/bash # --------------------------------------------------------- # Kubernetes (K8s) 高可用集群自动化脚本 (Ubuntu 专用 V3 修复版) # 修复: HAProxy 绑定 VIP 崩溃问题、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.1.100" VIP_PORT="16443" # 自动获取当前机器的主网卡名称 (如 ens33, eth0),避免 Keepalived 绑定失败 VIP_INTERFACE=$(ip route | grep default | awk '{print $5}') # 2. Master 节点真实 IP 列表 MASTER01_IP="192.168.1.11" MASTER02_IP="192.168.1.12" MASTER03_IP="192.168.1.13" # 控制平面入口地址 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 权限运行此脚本!${NC}" exit 1 fi function prepare_env() { echo -e "${GREEN}==> 开始初始化系统环境 (Ubuntu)...${NC}" ufw disable systemctl stop ufw && systemctl disable ufw swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab cat < 系统环境初始化完成。${NC}" } function install_containerd() { echo -e "${GREEN}==> 开始安装 Containerd...${NC}" apt-get update -y apt-get install -y apt-transport-https ca-certificates curl software-properties-common containerd mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml 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 # 【核心修复2】配置 crictl,消除警告 cat < Containerd 安装配置完成。${NC}" } function install_k8s_tools() { echo -e "${GREEN}==> 开始安装 kubeadm, kubelet, kubectl...${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}" } function setup_vip() { local STATE=$1 local PRIORITY=$2 echo -e "${GREEN}==> 开始配置 HAProxy 和 Keepalived (网卡: ${VIP_INTERFACE})...${NC}" apt-get install -y haproxy keepalived cat < HAProxy 和 Keepalived 配置完成 (角色: ${STATE})。${NC}" } 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}" 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 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}" exit 1 esac