添加 install_k8s/sudo ./install_k8s_ubuntu_v3.sh
This commit is contained in:
@@ -0,0 +1,227 @@
|
||||
#!/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 <<EOF | tee /etc/modules-load.d/k8s.conf
|
||||
overlay
|
||||
br_netfilter
|
||||
EOF
|
||||
modprobe overlay
|
||||
modprobe br_netfilter
|
||||
|
||||
# 【核心修复1】增加 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}"
|
||||
}
|
||||
|
||||
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 <<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}"
|
||||
}
|
||||
|
||||
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 <<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}"
|
||||
}
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user