更新 install_k8s/install_k8s_ubuntu-final.sh
This commit is contained in:
@@ -1,29 +1,25 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
# Kubernetes (K8s) 高可用集群自动化脚本 (Ubuntu 专用 V5 完美防弹版)
|
# Kubernetes (K8s) 高可用集群自动化脚本 (Ubuntu 终极可用版)
|
||||||
# 包含: 基础环境、组件安装、HAProxy+Keepalived VIP、K8s 初始化
|
|
||||||
# 修复: Containerd 2.x 兼容性、HAProxy 离线绑定崩溃、Crictl 警告
|
|
||||||
# 核心升级: 完美解决重复执行时的 apt-mark hold 包锁定死锁问题
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
# ================= 变量配置区 (执行前务必修改) =================
|
# ================= 变量配置区 (执行前请核对以下 IP) =================
|
||||||
K8S_VERSION="1.28.2-*"
|
K8S_VERSION="1.28.2-*"
|
||||||
POD_SUBNET="10.244.0.0/16"
|
POD_SUBNET="10.244.0.0/16"
|
||||||
SERVICE_SUBNET="10.96.0.0/12"
|
SERVICE_SUBNET="10.96.0.0/12"
|
||||||
|
|
||||||
# 1. 高可用 VIP 配置
|
# 1. 高可用 VIP 配置 (你的 Keepalived 虚拟IP)
|
||||||
VIP="192.168.40.100"
|
VIP="192.168.40.100"
|
||||||
VIP_PORT="16443"
|
VIP_PORT="16443"
|
||||||
|
|
||||||
# 自动获取当前机器的主网卡名称,避免 Keepalived 绑定失败
|
# 自动获取当前机器的主网卡名称
|
||||||
VIP_INTERFACE=$(ip route | grep default | awk '{print $5}' | head -n 1)
|
VIP_INTERFACE=$(ip route | grep default | awk '{print $5}' | head -n 1)
|
||||||
|
|
||||||
# 2. Master 节点真实 IP 列表
|
# 2. 你的三台 Master 节点真实 IP
|
||||||
MASTER01_IP="192.168.40.10"
|
MASTER01_IP="192.168.40.10"
|
||||||
MASTER02_IP="192.168.40.11"
|
MASTER02_IP="192.168.40.11"
|
||||||
MASTER03_IP="192.168.40.12"
|
MASTER03_IP="192.168.40.12"
|
||||||
|
|
||||||
# 控制平面入口地址
|
|
||||||
CONTROL_PLANE_ENDPOINT="${VIP}:${VIP_PORT}"
|
CONTROL_PLANE_ENDPOINT="${VIP}:${VIP_PORT}"
|
||||||
# ===============================================================
|
# ===============================================================
|
||||||
|
|
||||||
@@ -31,127 +27,116 @@ RED='\033[0;31m'
|
|||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[0;33m'
|
YELLOW='\033[0;33m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
if [ "$EUID" -ne 0 ]; then
|
||||||
echo -e "${RED}请使用 root 权限运行此脚本!(sudo -i 或者 sudo ./script.sh)${NC}"
|
echo -e "${RED}请使用 root 权限运行此脚本!(sudo -i 或者 sudo ./script.sh)${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 1. 基础环境
|
|
||||||
function prepare_env() {
|
function prepare_env() {
|
||||||
echo -e "${GREEN}==> 开始初始化系统环境 (Ubuntu)...${NC}"
|
echo -e "${GREEN}==> 1. 开始初始化系统环境 (Ubuntu)...${NC}"
|
||||||
# 关闭防火墙
|
ufw disable 2>/dev/null
|
||||||
ufw disable
|
systemctl stop ufw 2>/dev/null && systemctl disable ufw 2>/dev/null
|
||||||
systemctl stop ufw && systemctl disable ufw
|
|
||||||
|
|
||||||
# 关闭 Swap
|
|
||||||
swapoff -a
|
swapoff -a
|
||||||
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
|
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
|
||||||
|
|
||||||
# 加载内核模块
|
cat <<EOF | tee /etc/modules-load.d/k8s.conf > /dev/null
|
||||||
cat <<EOF | tee /etc/modules-load.d/k8s.conf
|
|
||||||
overlay
|
overlay
|
||||||
br_netfilter
|
br_netfilter
|
||||||
EOF
|
EOF
|
||||||
modprobe overlay
|
modprobe overlay
|
||||||
modprobe br_netfilter
|
modprobe br_netfilter
|
||||||
|
|
||||||
# 增加 ip_nonlocal_bind,允许 HAProxy 绑定还未漂移过来的 VIP
|
# 【关键防坑】ip_nonlocal_bind 允许 HAProxy 强行绑定还未飘过来的 VIP
|
||||||
cat <<EOF | tee /etc/sysctl.d/k8s.conf
|
cat <<EOF | tee /etc/sysctl.d/k8s.conf > /dev/null
|
||||||
net.bridge.bridge-nf-call-iptables = 1
|
net.bridge.bridge-nf-call-iptables = 1
|
||||||
net.bridge.bridge-nf-call-ip6tables = 1
|
net.bridge.bridge-nf-call-ip6tables = 1
|
||||||
net.ipv4.ip_forward = 1
|
net.ipv4.ip_forward = 1
|
||||||
net.ipv4.ip_nonlocal_bind = 1
|
net.ipv4.ip_nonlocal_bind = 1
|
||||||
EOF
|
EOF
|
||||||
sysctl --system
|
sysctl --system > /dev/null
|
||||||
echo -e "${GREEN}==> 系统环境初始化完成。${NC}"
|
echo -e "${GREEN}==> 系统环境准备完毕。${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 2. 安装并锁定 Containerd 1.6.x
|
|
||||||
function install_containerd() {
|
function install_containerd() {
|
||||||
echo -e "${GREEN}==> 开始安装 Containerd (强制降级并锁定 1.6.x 稳定版)...${NC}"
|
echo -e "${GREEN}==> 2. 开始安装 Containerd (锁定 1.6.x 避开 2.x 的断层坑)...${NC}"
|
||||||
|
|
||||||
# 【核心修复】:强制解除之前的包锁定,防止卸载和重装失败
|
# 强行解锁并清理之前可能残留的坏包
|
||||||
apt-mark unhold containerd containerd.io 2>/dev/null || true
|
apt-mark unhold containerd containerd.io 2>/dev/null || true
|
||||||
|
apt-get purge -y --allow-change-held-packages containerd containerd.io 2>/dev/null || true
|
||||||
# 清理可能存在的旧版本或不兼容的 2.x 版本 (加入允许修改 hold 包的参数以防万一)
|
apt-get autoremove -y > /dev/null
|
||||||
apt-get purge -y --allow-change-held-packages containerd containerd.io
|
|
||||||
apt-get autoremove -y
|
|
||||||
rm -rf /etc/containerd/ /var/run/containerd/ /run/containerd/
|
rm -rf /etc/containerd/ /var/run/containerd/ /run/containerd/
|
||||||
|
|
||||||
apt-get update -y
|
apt-get update -y > /dev/null
|
||||||
apt-get install -y apt-transport-https ca-certificates curl software-properties-common gpg
|
apt-get install -y apt-transport-https ca-certificates curl software-properties-common gpg
|
||||||
|
|
||||||
# 配置阿里云 Docker 官方源
|
# 配置官方 Docker 源
|
||||||
install -m 0755 -d /etc/apt/keyrings
|
install -m 0755 -d /etc/apt/keyrings
|
||||||
rm -f /etc/apt/keyrings/docker.gpg
|
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
|
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
|
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
|
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
|
apt-get update -y > /dev/null
|
||||||
|
|
||||||
# 动态获取 1.6.x 系列的最新版本号并强制安装
|
# 动态抓取 1.6.x 稳定版,防止 2.x 导致 kubeadm 崩溃
|
||||||
local VER=$(apt-cache madison containerd.io | grep ' 1.6.' | head -n 1 | awk -F '|' '{print $2}' | tr -d ' ')
|
local VER=$(apt-cache madison containerd.io | grep ' 1.6.' | head -n 1 | awk -F '|' '{print $2}' | tr -d ' ')
|
||||||
if [ -z "$VER" ]; then
|
if [ -z "$VER" ]; then
|
||||||
echo -e "${RED}无法找到 containerd.io 1.6.x 版本,请检查网络源!${NC}"
|
echo -e "${RED}无法找到 containerd.io 1.6.x 版本,请检查网络!${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo -e "${YELLOW}匹配到稳定版本: ${VER}${NC}"
|
|
||||||
apt-get install -y --allow-downgrades --allow-change-held-packages containerd.io=$VER
|
apt-get install -y --allow-downgrades --allow-change-held-packages containerd.io=$VER
|
||||||
|
apt-mark hold containerd.io > /dev/null
|
||||||
# 锁定版本,防止无人值守更新将其升级到 2.x
|
|
||||||
apt-mark hold containerd.io
|
|
||||||
|
|
||||||
# 生成 1.6.x 兼容的默认配置
|
# 【终极防坑】生成配置后,暴杀 disabled_plugins 屏蔽项,防止 CRI 插件装死
|
||||||
mkdir -p /etc/containerd
|
mkdir -p /etc/containerd
|
||||||
containerd config default | tee /etc/containerd/config.toml > /dev/null
|
containerd config default | tee /etc/containerd/config.toml > /dev/null
|
||||||
|
sed -i '/disabled_plugins/d' /etc/containerd/config.toml
|
||||||
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /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
|
sed -i 's#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
|
||||||
|
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable --now containerd
|
systemctl restart containerd
|
||||||
|
systemctl enable containerd
|
||||||
|
|
||||||
# 配置 crictl,消除 socket 警告
|
# 消除 crictl 警告
|
||||||
cat <<EOF | tee /etc/crictl.yaml
|
cat <<EOF | tee /etc/crictl.yaml > /dev/null
|
||||||
runtime-endpoint: unix:///run/containerd/containerd.sock
|
runtime-endpoint: unix:///run/containerd/containerd.sock
|
||||||
image-endpoint: unix:///run/containerd/containerd.sock
|
image-endpoint: unix:///run/containerd/containerd.sock
|
||||||
timeout: 10
|
timeout: 10
|
||||||
debug: false
|
debug: false
|
||||||
EOF
|
EOF
|
||||||
echo -e "${GREEN}==> Containerd 安装配置完成。${NC}"
|
echo -e "${GREEN}==> Containerd (1.6.x) 安装配置完毕。${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 3. 安装 K8s 组件
|
|
||||||
function install_k8s_tools() {
|
function install_k8s_tools() {
|
||||||
echo -e "${GREEN}==> 开始安装 kubeadm, kubelet, kubectl (使用阿里云新版 APT 源)...${NC}"
|
echo -e "${GREEN}==> 3. 开始安装 kubeadm, kubelet, kubectl...${NC}"
|
||||||
|
|
||||||
# 【核心修复】:强制解除 K8s 组件的包锁定
|
|
||||||
apt-mark unhold kubelet kubeadm kubectl 2>/dev/null || true
|
apt-mark unhold kubelet kubeadm kubectl 2>/dev/null || true
|
||||||
|
|
||||||
mkdir -p /etc/apt/keyrings
|
mkdir -p /etc/apt/keyrings
|
||||||
rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
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
|
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
|
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 > /dev/null
|
||||||
|
|
||||||
apt-get update -y
|
apt-get update -y > /dev/null
|
||||||
apt-get install -y --allow-downgrades --allow-change-held-packages kubelet kubeadm kubectl
|
apt-get install -y --allow-downgrades --allow-change-held-packages kubelet kubeadm kubectl
|
||||||
apt-mark hold kubelet kubeadm kubectl
|
apt-mark hold kubelet kubeadm kubectl > /dev/null
|
||||||
|
|
||||||
systemctl enable --now kubelet
|
systemctl enable --now kubelet
|
||||||
echo -e "${GREEN}==> Kubernetes 组件安装完成。${NC}"
|
echo -e "${GREEN}==> K8s 核心组件安装完毕。${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 4. 配置负载均衡 (HAProxy + Keepalived)
|
|
||||||
function setup_vip() {
|
function setup_vip() {
|
||||||
local STATE=$1
|
local STATE=$1
|
||||||
local PRIORITY=$2
|
local PRIORITY=$2
|
||||||
|
|
||||||
echo -e "${GREEN}==> 开始配置 HAProxy 和 Keepalived (绑定的网卡: ${VIP_INTERFACE})...${NC}"
|
echo -e "${GREEN}==> 开始部署高可用 HAProxy & Keepalived (网卡: ${VIP_INTERFACE})...${NC}"
|
||||||
apt-get install -y haproxy keepalived
|
apt-get install -y haproxy keepalived
|
||||||
|
|
||||||
cat <<EOF | tee /etc/haproxy/haproxy.cfg
|
cat <<EOF | tee /etc/haproxy/haproxy.cfg > /dev/null
|
||||||
global
|
global
|
||||||
log /dev/log local0
|
log /dev/log local0
|
||||||
log /dev/log local1 notice
|
log /dev/log local1 notice
|
||||||
@@ -179,7 +164,7 @@ backend kubernetes-master
|
|||||||
server master03 ${MASTER03_IP}:6443 check
|
server master03 ${MASTER03_IP}:6443 check
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat <<EOF | tee /etc/keepalived/keepalived.conf
|
cat <<EOF | tee /etc/keepalived/keepalived.conf > /dev/null
|
||||||
! Configuration File for keepalived
|
! Configuration File for keepalived
|
||||||
global_defs {
|
global_defs {
|
||||||
router_id LVS_DEVEL
|
router_id LVS_DEVEL
|
||||||
@@ -212,24 +197,21 @@ EOF
|
|||||||
|
|
||||||
systemctl restart haproxy keepalived
|
systemctl restart haproxy keepalived
|
||||||
systemctl enable haproxy keepalived
|
systemctl enable haproxy keepalived
|
||||||
echo -e "${GREEN}==> HAProxy 和 Keepalived 配置完成 (角色: ${STATE})。${NC}"
|
echo -e "${GREEN}==> 负载均衡组件部署完毕 (当前角色: ${STATE})。${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 5. 初始化第一个 Master 节点
|
|
||||||
function init_first_master() {
|
function init_first_master() {
|
||||||
echo -e "${YELLOW}==> 正在清理可能残留的 K8s 脏数据...${NC}"
|
echo -e "${YELLOW}==> 正在清理历史脏数据,确保纯净初始化...${NC}"
|
||||||
kubeadm reset -f
|
kubeadm reset -f > /dev/null 2>&1
|
||||||
rm -rf /etc/cni/net.d
|
rm -rf /etc/cni/net.d $HOME/.kube/config
|
||||||
rm -rf $HOME/.kube/config
|
ip link delete cni0 2>/dev/null || true
|
||||||
|
ip link delete flannel.1 2>/dev/null || true
|
||||||
|
|
||||||
echo -e "${GREEN}==> 检查 VIP 是否存活...${NC}"
|
echo -e "${GREEN}==> 验证基础服务健康状态...${NC}"
|
||||||
ping -c 3 ${VIP} || { echo -e "${RED}警告: 无法 ping 通 VIP ${VIP},请确保 Keepalived 正常启动且无 IP 冲突!${NC}"; exit 1; }
|
ping -c 3 ${VIP} > /dev/null 2>&1 || { echo -e "${RED}致命错误: VIP (${VIP}) 无法连通,Keepalived未生效或存在IP冲突!${NC}"; exit 1; }
|
||||||
|
crictl ps > /dev/null 2>&1 || { echo -e "${RED}致命错误: Containerd 通道未就绪 (CRI报错),请检查状态!${NC}"; exit 1; }
|
||||||
|
|
||||||
echo -e "${GREEN}==> 检查 Containerd 存活状态...${NC}"
|
echo -e "${GREEN}==> 开始初始化 Master01 集群...${NC}"
|
||||||
crictl ps > /dev/null || { echo -e "${RED}警告: 无法连接 containerd,请检查服务状态!${NC}"; exit 1; }
|
|
||||||
|
|
||||||
echo -e "${GREEN}==> 开始初始化第一个 Master 节点...${NC}"
|
|
||||||
|
|
||||||
kubeadm init \
|
kubeadm init \
|
||||||
--control-plane-endpoint="${CONTROL_PLANE_ENDPOINT}" \
|
--control-plane-endpoint="${CONTROL_PLANE_ENDPOINT}" \
|
||||||
--upload-certs \
|
--upload-certs \
|
||||||
@@ -240,7 +222,7 @@ function init_first_master() {
|
|||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo -e "${YELLOW}========================================================================${NC}"
|
echo -e "${YELLOW}========================================================================${NC}"
|
||||||
echo -e "${GREEN}集群初始化成功!请妥善保存上面输出的 kubeadm join 命令。${NC}"
|
echo -e "${GREEN}恭喜!集群初始化成功!请务必复制好上方的 kubeadm join 命令。${NC}"
|
||||||
echo -e "${YELLOW}========================================================================${NC}"
|
echo -e "${YELLOW}========================================================================${NC}"
|
||||||
|
|
||||||
export KUBECONFIG=/etc/kubernetes/admin.conf
|
export KUBECONFIG=/etc/kubernetes/admin.conf
|
||||||
@@ -251,11 +233,11 @@ function init_first_master() {
|
|||||||
echo -e "${GREEN}==> 正在部署 Calico 网络插件...${NC}"
|
echo -e "${GREEN}==> 正在部署 Calico 网络插件...${NC}"
|
||||||
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
|
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
|
||||||
else
|
else
|
||||||
echo -e "${RED}集群初始化失败!请使用 'journalctl -xeu kubelet' 检查报错。${NC}"
|
echo -e "${RED}初始化彻底失败!请检查上方输出。${NC}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 主路由逻辑
|
# =============== 路由逻辑 ===============
|
||||||
case "$1" in
|
case "$1" in
|
||||||
base)
|
base)
|
||||||
prepare_env
|
prepare_env
|
||||||
@@ -272,6 +254,10 @@ case "$1" in
|
|||||||
init_first_master
|
init_first_master
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo -e "${YELLOW}用法: sudo $0 {base|init-vip-master|init-vip-backup|init-master}${NC}"
|
echo -e "${YELLOW}用法说明 (sudo ./install_k8s.sh <命令>):${NC}"
|
||||||
|
echo " base - 所有机器(包括Node)加集群前【必跑】,装依赖排雷"
|
||||||
|
echo " init-vip-master - Master01执行,配置主负载均衡"
|
||||||
|
echo " init-vip-backup - Master02/03执行,配置备用负载均衡"
|
||||||
|
echo " init-master - 仅Master01执行,进行最后的K8s集群初始化"
|
||||||
exit 1
|
exit 1
|
||||||
esac
|
esac
|
||||||
Reference in New Issue
Block a user