#!/bin/bash set -euo pipefail # -------------------------- 全局变量定义 -------------------------- master_ips="" node_ips="" target_dir="/opt/k8s-install-conf" CERT_KEY="" JOIN_CMD_BASE="" # -------------------------- 基础工具函数 -------------------------- # 打印分隔符 print_separator() { echo "========================================================================" } # 打印子分隔符 print_sub_separator() { echo "------------------------------------------------------------------------" } # 自动等待5秒(替代手动确认) auto_wait() { echo "等待5秒后继续下一步..." sleep 5 echo } # -------------------------- 步骤函数:参数解析与校验 -------------------------- parse_and_validate_args() { print_separator echo "【步骤1/7】解析命令行参数与前置校验" print_sub_separator # 解析参数(支持 --master-ips=xxx 和 --master-ips xxx 两种格式) while [[ $# -gt 0 ]]; do case "$1" in --master-ips=*) master_ips="${1#*=}" echo "已指定Master节点IP列表:$master_ips" shift 1 ;; --master-ips) master_ips="$2" echo "已指定Master节点IP列表:$master_ips" shift 2 ;; --node-ips=*) node_ips="${1#*=}" echo "已指定Node节点IP列表:$node_ips" shift 1 ;; --node-ips) node_ips="$2" echo "已指定Node节点IP列表:$node_ips" shift 2 ;; *) echo "错误:未知参数 $1" echo "使用方式:$0 --master-ips=192.168.61.131,192.168.61.132 --node-ips=192.168.61.134" exit 1 ;; esac done # 校验参数完整性 if [ -z "$master_ips" ] && [ -z "$node_ips" ]; then echo "错误:必须指定 --master-ips 或 --node-ips" exit 1 fi # 校验kubeadm-conf.yaml文件 echo "校验kubeadm-conf.yaml配置文件..." if [ ! -f "${target_dir}/kubeadm-conf.yaml" ]; then echo "错误:当前目录未找到 kubeadm-conf.yaml 配置文件" exit 1 fi echo "✓ 已找到kubeadm-conf.yaml配置文件" # 校验root权限 echo "校验执行权限..." if [ "$(id -u)" -ne 0 ]; then echo "错误:脚本需以root权限执行" exit 1 fi echo "✓ root权限校验通过" print_separator auto_wait } # -------------------------- 步骤函数:初始化第一台Master -------------------------- init_first_master() { print_separator echo "【步骤2/7】初始化第一台Master节点" print_sub_separator # 执行kubeadm init echo "执行集群初始化命令:kubeadm init --config ${target_dir}/kubeadm-conf.yaml --upload-certs" kubeadm init --config ${target_dir}/kubeadm-conf.yaml --upload-certs echo "✓ kubeadm init 执行完成" print_sub_separator # 配置kubeconfig echo "配置当前用户kubeconfig..." echo "命令1:mkdir -p $HOME/.kube" mkdir -p "$HOME/.kube" echo "命令2:cp -i /etc/kubernetes/admin.conf $HOME/.kube/config" cp -i /etc/kubernetes/admin.conf "$HOME/.kube/config" echo "命令3:chown $(id -u):$(id -g) $HOME/.kube/config" chown "$(id -u):$(id -g)" "$HOME/.kube/config" echo "命令4:export KUBECONFIG=/etc/kubernetes/admin.conf" export KUBECONFIG=/etc/kubernetes/admin.conf echo "命令5:echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> $HOME/.profile" echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> "$HOME/.profile" echo "✓ kubeconfig配置完成(已永久写入环境变量)" print_separator auto_wait } # -------------------------- 步骤函数:安装Calico网络插件 -------------------------- install_calico() { print_separator echo "【步骤3/7】安装Calico网络插件" print_sub_separator # 创建目标目录 echo "创建配置文件目录:mkdir -p $target_dir" mkdir -p "$target_dir" echo "✓ 目录创建成功" print_sub_separator # 下载Calico配置 echo "下载Calico配置文件:wget -q -c -O $target_dir/calico.yaml http://116.205.97.109/scripts/calico.yaml --show-progress" wget -q -c -O "$target_dir/calico.yaml" http://116.205.97.109/scripts/calico.yaml --show-progress echo "✓ Calico配置文件下载完成" print_sub_separator # 应用Calico配置 echo "部署Calico网络插件:kubectl apply -f $target_dir/calico.yaml" kubectl apply -f "$target_dir/calico.yaml" echo "✓ Calico配置已提交至集群" print_sub_separator # 查看节点状态 echo "当前节点状态(网络插件部署中,状态可能为NotReady):" kubectl get node echo echo "提示:Calico组件需2-5分钟部署完成,请耐心等待" echo "部署完成后可执行:kubectl get node 验证节点状态(目标状态为Ready)" print_separator auto_wait } # -------------------------- 步骤函数:生成节点加入脚本 -------------------------- generate_join_scripts() { print_separator echo "【步骤4/7】生成Master/Node节点加入脚本" print_sub_separator # 生成证书密钥和基础加入命令 echo "生成集群加入核心参数..." echo "命令1:kubeadm init phase upload-certs --upload-certs(刷新证书)" CERT_KEY=$(kubeadm init phase upload-certs --upload-certs 2>/dev/null | grep -E '^[0-9a-f]{64,}$') if [ -z "$CERT_KEY" ]; then echo "错误:生成certificate-key失败" exit 1 fi echo "✓ certificate-key 生成完成" echo "命令2:kubeadm token create --print-join-command(生成基础加入命令)" JOIN_CMD_BASE=$(kubeadm token create --print-join-command 2>/dev/null) if [ -z "$JOIN_CMD_BASE" ]; then echo "错误:生成join命令失败" exit 1 fi echo "✓ 基础join命令(含token+CA哈希)生成完成" print_sub_separator # 生成Master加入脚本 echo "生成Master节点加入脚本:$target_dir/add_master.sh" cat > "$target_dir/add_master.sh" <> \$HOME/.profile echo "Master节点加入集群并配置完成" EOF echo "✓ add_master.sh 生成完成" print_sub_separator # 生成Node加入脚本 echo "生成Node节点加入脚本:$target_dir/add_node.sh" cat > "$target_dir/add_node.sh" <