diff --git a/scripts/k8s-cluster-deploy.sh b/scripts/k8s-cluster-deploy.sh index ab73fb8..5d44f1e 100644 --- a/scripts/k8s-cluster-deploy.sh +++ b/scripts/k8s-cluster-deploy.sh @@ -1,90 +1,187 @@ #!/bin/bash set -euo pipefail -# 校验是否为root用户执行 -if [ "$(id -u)" -ne 0 ]; then - echo "错误:脚本需以root权限执行" - exit 1 -fi - -# 初始化参数变量 +# -------------------------- 全局变量定义 -------------------------- master_ips="" node_ips="" - -# 解析命令行参数 -while [[ $# -gt 0 ]]; do - case "$1" in - --master-ips) - master_ips="$2" - shift 2 - ;; - --node-ips) - node_ips="$2" - 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" - echo "使用方式:$0 --master-ips 192.168.61.131,192.168.61.132 --node-ips 192.168.61.134" - exit 1 -fi - -# 定义目标目录 target_dir="/opt/k8s-install-conf" +CERT_KEY="" +JOIN_CMD_BASE="" -# 校验kubeadm-conf.yaml是否存在 -if [ ! -f "/opt/k8s-install-conf/kubeadm-conf.yaml" ]; then - echo "错误:当前目录未找到 kubeadm-conf.yaml 配置文件" - exit 1 -fi +# -------------------------- 基础工具函数 -------------------------- +# 打印分隔符 +print_separator() { + echo "========================================================================" +} +# 打印子分隔符 +print_sub_separator() { + echo "------------------------------------------------------------------------" +} -# -------------------------- 第一步:初始化第一台Master节点 -------------------------- -echo "=== 开始初始化第一台Master节点 ===" +# 自动等待5秒(替代手动确认) +auto_wait() { + echo "等待5秒后继续下一步..." + sleep 5 + echo +} -# 执行kubeadm初始化(带证书上传) -echo "执行 kubeadm init 初始化集群..." -kubeadm init --config ${target_dir}/kubeadm-conf.yaml --upload-certs +# -------------------------- 步骤函数:参数解析与校验 -------------------------- +parse_and_validate_args() { + print_separator + echo "【步骤1/7】解析命令行参数与前置校验" + print_sub_separator -# 配置当前用户kubeconfig -echo "配置当前用户kubeconfig..." -mkdir -p "$HOME/.kube" -cp -i /etc/kubernetes/admin.conf "$HOME/.kube/config" -chown "$(id -u):$(id -g)" "$HOME/.kube/config" -export KUBECONFIG=/etc/kubernetes/admin.conf -# 将环境变量写入profile,永久生效 -echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> "$HOME/.profile" + # 解析参数(支持 --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 -echo "=== 第一台Master节点初始化完成 ===" + # 校验参数完整性 + if [ -z "$master_ips" ] && [ -z "$node_ips" ]; then + echo "错误:必须指定 --master-ips 或 --node-ips" + exit 1 + fi -# -------------------------- 第二步:生成添加节点的脚本 -------------------------- -echo "=== 开始生成添加节点脚本 ===" + # 校验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配置文件" -# 创建目标目录 -mkdir -p "$target_dir" + # 校验root权限 + echo "校验执行权限..." + if [ "$(id -u)" -ne 0 ]; then + echo "错误:脚本需以root权限执行" + exit 1 + fi + echo "✓ root权限校验通过" -# 生成certificate-key和基础join命令 -echo "生成集群加入所需参数..." -CERT_KEY=$(kubeadm init phase upload-certs --upload-certs 2>/dev/null | grep -E '^[0-9a-f]{64,}$') -JOIN_CMD_BASE=$(kubeadm token create --print-join-command 2>/dev/null) + print_separator + auto_wait +} -# 校验参数生成结果 -if [ -z "$CERT_KEY" ] || [ -z "$JOIN_CMD_BASE" ]; then - echo "错误:生成集群加入参数失败" - exit 1 -fi +# -------------------------- 步骤函数:初始化第一台Master -------------------------- +init_first_master() { + print_separator + echo "【步骤2/7】初始化第一台Master节点" + print_sub_separator -# 生成添加Master节点的脚本(包含kubeconfig配置) -echo "生成 $target_dir/add_master.sh ..." -cat > "$target_dir/add_master.sh" <> $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 "生成 $target_dir/add_node.sh ..." -cat > "$target_dir/add_node.sh" < "$target_dir/add_node.sh" <