From c3803595e4ce2b3df09acb08f94dc53d9173f5ba Mon Sep 17 00:00:00 2001 From: joy Date: Thu, 30 Oct 2025 17:25:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20scripts/k8s-config-deploy.?= =?UTF-8?q?sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/k8s-config-deploy.sh | 208 +++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 scripts/k8s-config-deploy.sh diff --git a/scripts/k8s-config-deploy.sh b/scripts/k8s-config-deploy.sh new file mode 100644 index 0000000..a2b5059 --- /dev/null +++ b/scripts/k8s-config-deploy.sh @@ -0,0 +1,208 @@ +#!/bin/bash +set -euo pipefail + +# ========================== 固定配置 ========================== +TEMPLATE_URL="http://116.205.97.109/scripts/kubeadm-conf.yaml" # 固定模板地址 +LOCAL_TEMPLATE="/tmp/k8s-template-$(date +%s).yaml" # 本地临时模板 +REMOTE_CONFIG_PATH="/opt/k8s-install-conf/kubeadm-conf.yaml" # 远程配置路径 +REMOTE_USER="root" # 默认远程用户 + + +# ========================== 工具函数 ========================== +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +info() { echo -e "${YELLOW}[INFO]${NC} $1"; } +success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } +error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } + + +# ========================== 参数解析(简化版) ========================== +# 核心变量(仅保留必要参数,target-ip = local-ip) +LOCALIP="" # 节点IP(同时作为目标服务器IP) +HOSTNAME="" # 节点主机名 +MASTER1_IP="" # 第1个MASTER01_IP替换值 +MASTER2_IP="" # 第2个MASTER01_IP替换值 +MASTER3_IP="" # 第3个MASTER01_IP替换值 +CLUSTER_VIP="" # 集群VIP +K8SVERSION="" # K8s版本 +CLUSTER_PORT="" # API端口 + + +parse_args() { + while [[ $# -gt 0 ]]; do + case "$1" in + --local-ip) + LOCALIP="$2" + shift 2 + ;; + --hostname) + HOSTNAME="$2" + shift 2 + ;; + --master1-ip) + MASTER1_IP="$2" + shift 2 + ;; + --master2-ip) + MASTER2_IP="$2" + shift 2 + ;; + --master3-ip) + MASTER3_IP="$2" + shift 2 + ;; + --cluster-vip) + CLUSTER_VIP="$2" + shift 2 + ;; + --k8s-version) + K8SVERSION="$2" + shift 2 + ;; + --cluster-port) + CLUSTER_PORT="$2" + shift 2 + ;; + --remote-user) + REMOTE_USER="$2" + shift 2 + ;; + --help) + echo "用法:$0 [必选参数] [可选参数]" + echo "功能:下载模板→替换变量→拷贝到local-ip对应的服务器→远程执行命令" + echo "说明:target-ip与local-ip相同,无需单独指定" + echo "必选参数:" + echo " --local-ip 节点IP(同时作为目标服务器IP,如192.168.61.10)" + echo " --hostname <名称> 模板中替换的HOSTNAME(如master-01)" + echo " --master1-ip 第1个MASTER01_IP替换值(如192.168.61.10)" + echo " --master2-ip 第2个MASTER01_IP替换值(如192.168.61.11)" + echo " --master3-ip 第3个MASTER01_IP替换值(如192.168.61.12)" + echo " --cluster-vip 模板中替换的CLUSTER_VIP(如192.168.61.200)" + echo " --k8s-version <版本> 模板中替换的K8SVERSION(如1.30.5)" + echo " --cluster-port <端口> 模板中替换的CLUSTER_PORT(如6443)" + echo "可选参数:" + echo " --remote-user <用户> 远程登录用户(默认root)" + echo "示例:" + echo " 部署到master-01:" + echo " $0 --local-ip 192.168.61.10 --hostname master-01 \\" + echo " --master1-ip 192.168.61.10 --master2-ip 192.168.61.11 --master3-ip 192.168.61.12 \\" + echo " --cluster-vip 192.168.61.200 --k8s-version 1.30.5 --cluster-port 6443" + exit 0 + ;; + *) + error "未知参数:$1(执行$0 --help查看用法)" + ;; + esac + done + + # 校验必选参数 + local required_params=( + "LOCALIP" "HOSTNAME" "MASTER1_IP" "MASTER2_IP" "MASTER3_IP" + "CLUSTER_VIP" "K8SVERSION" "CLUSTER_PORT" + ) + for param in "${required_params[@]}"; do + if [[ -z "${!param}" ]]; then + error "缺少必选参数:--${param,,}" + fi + done + + # 校验IP和端口格式 + if ! [[ "$LOCALIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + error "无效的local-ip格式:$LOCALIP" + fi + if ! [[ "$CLUSTER_PORT" =~ ^[0-9]+$ ]] || [[ "$CLUSTER_PORT" -lt 1 ]] || [[ "$CLUSTER_PORT" -gt 65535 ]]; then + error "无效的端口:$CLUSTER_PORT" + fi +} + + +# ========================== 核心步骤 ========================== +# 步骤1:下载模板 +download_template() { + info "下载模板:$TEMPLATE_URL" + if command -v wget &>/dev/null; then + wget -q -O "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || error "wget下载失败" + elif command -v curl &>/dev/null; then + curl -s -o "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || error "curl下载失败" + else + error "请安装wget或curl" + fi + [[ -f "$LOCAL_TEMPLATE" ]] || error "模板下载失败" + success "模板下载完成" +} + +# 步骤2:替换变量(核心逻辑不变) +replace_variables() { + info "替换模板变量..." + # 基础变量替换 + sed -i "s/LOCALIP/$LOCALIP/g" "$LOCAL_TEMPLATE" + sed -i "s/HOSTNAME/$HOSTNAME/g" "$LOCAL_TEMPLATE" + sed -i "s/K8SVERSION/$K8SVERSION/g" "$LOCAL_TEMPLATE" + sed -i "s/CLUSTER_VIP/$CLUSTER_VIP/g" "$LOCAL_TEMPLATE" + sed -i "s/CLUSTER_PORT/$CLUSTER_PORT/g" "$LOCAL_TEMPLATE" + # 3个MASTER01_IP按顺序替换 + sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER1_IP/" "$LOCAL_TEMPLATE" + sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER2_IP/" "$LOCAL_TEMPLATE" + sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER3_IP/" "$LOCAL_TEMPLATE" + # 替换CLUSTER_VIP:CLUSTER_PORT + local vip_port="${CLUSTER_VIP}:${CLUSTER_PORT}" + sed -i "s/CLUSTER_VIP:CLUSTER_PORT/$vip_port/g" "$LOCAL_TEMPLATE" + success "变量替换完成" +} + +# 步骤3:拷贝到目标服务器(目标IP=local-ip) +copy_to_remote() { + info "拷贝文件到目标服务器:$REMOTE_USER@$LOCALIP:$REMOTE_CONFIG_PATH" + # 远程创建目录 + ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$LOCALIP" "mkdir -p $(dirname "$REMOTE_CONFIG_PATH")" || error "远程目录创建失败" + # SCP传输 + scp -o StrictHostKeyChecking=no "$LOCAL_TEMPLATE" "$REMOTE_USER@$LOCALIP:$REMOTE_CONFIG_PATH" || error "文件传输失败" + # 校验 + if ssh "$REMOTE_USER@$LOCALIP" "test -f $REMOTE_CONFIG_PATH"; then + success "文件拷贝成功" + else + error "远程文件不存在,请检查SSH免密" + fi +} + +# 步骤4:远程执行命令(拉取镜像等) +execute_remote_commands() { + info "在$LOCALIP执行远程命令..." + local remote_cmds=( + "kubeadm config images pull --config $REMOTE_CONFIG_PATH" # 拉取镜像 + "echo '远程配置文件路径:$REMOTE_CONFIG_PATH'" + ) + for cmd in "${remote_cmds[@]}"; do + info "执行:$cmd" + ssh "$REMOTE_USER@$LOCALIP" "$cmd" || error "远程命令执行失败" + done + success "远程命令执行完成" +} + +# 步骤5:清理本地文件 +cleanup() { + info "清理本地临时文件" + rm -f "$LOCAL_TEMPLATE" || info "本地文件清理失败" +} + + +# ========================== 主流程 ========================== +main() { + parse_args "$@" + download_template + replace_variables + copy_to_remote + execute_remote_commands # 可注释跳过 + cleanup + + echo -e "\n${GREEN}========================================" + echo -e "部署完成!目标服务器:$LOCALIP" + echo -e "配置文件:$REMOTE_CONFIG_PATH" + echo -e "下一步:在$LOCALIP执行 kubeadm init/join" + echo -e "========================================" +} + +main "$@"