diff --git a/install_k8s/install_k8s_ubuntu-final.sh b/install_k8s/install_k8s_ubuntu-final.sh new file mode 100644 index 0000000..ee7515a --- /dev/null +++ b/install_k8s/install_k8s_ubuntu-final.sh @@ -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 < 系统环境初始化完成。${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 < 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 < 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 \ No newline at end of file