From bccfc8fa0a3e72190ad63619e39f894709b70c48 Mon Sep 17 00:00:00 2001 From: joy Date: Thu, 30 Oct 2025 17:44:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20scripts/k8s-config-deploy.?= =?UTF-8?q?sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ccc --- scripts/k8s-config-deploy.sh | 140 +++++++++++++++++------------------ 1 file changed, 67 insertions(+), 73 deletions(-) diff --git a/scripts/k8s-config-deploy.sh b/scripts/k8s-config-deploy.sh index a2b5059..fd2a850 100644 --- a/scripts/k8s-config-deploy.sh +++ b/scripts/k8s-config-deploy.sh @@ -6,6 +6,9 @@ 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" # 默认远程用户 +# pause镜像相关配置 +PAUSE_ALI_REGISTRY="registry.cn-hangzhou.aliyuncs.com/google_containers/pause" # 阿里云pause镜像 +PAUSE_TARGET_REGISTRY="registry.k8s.io/pause" # 目标pause镜像(替换后) # ========================== 工具函数 ========================== @@ -20,7 +23,7 @@ error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } # ========================== 参数解析(简化版) ========================== -# 核心变量(仅保留必要参数,target-ip = local-ip) +# 核心变量(target-ip = local-ip) LOCALIP="" # 节点IP(同时作为目标服务器IP) HOSTNAME="" # 节点主机名 MASTER1_IP="" # 第1个MASTER01_IP替换值 @@ -72,21 +75,13 @@ parse_args() { ;; --help) echo "用法:$0 [必选参数] [可选参数]" - echo "功能:下载模板→替换变量→拷贝到local-ip对应的服务器→远程执行命令" - echo "说明:target-ip与local-ip相同,无需单独指定" + echo "功能:下载模板→替换变量→拷贝到服务器→拉取镜像→自动打pause镜像标签" 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 " --local-ip 节点IP(目标服务器IP)| --hostname <名称> 节点主机名" + echo " --master1-ip 第1个MASTER01_IP | --master2-ip 第2个MASTER01_IP | --master3-ip 第3个MASTER01_IP" + echo " --cluster-vip 集群VIP | --k8s-version <版本> K8s版本 | --cluster-port <端口> API端口" + 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" @@ -99,23 +94,14 @@ parse_args() { done # 校验必选参数 - local required_params=( - "LOCALIP" "HOSTNAME" "MASTER1_IP" "MASTER2_IP" "MASTER3_IP" - "CLUSTER_VIP" "K8SVERSION" "CLUSTER_PORT" - ) + 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 + [[ -z "${!param}" ]] && error "缺少必选参数:--${param,,}" 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 + # 校验格式 + [[ ! "$LOCALIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && error "无效local-ip:$LOCALIP" + [[ ! "$CLUSTER_PORT" =~ ^[0-9]+$ || "$CLUSTER_PORT" -lt 1 || "$CLUSTER_PORT" -gt 65535 ]] && error "无效端口:$CLUSTER_PORT" } @@ -123,69 +109,77 @@ parse_args() { # 步骤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 + command -v wget &>/dev/null && wget -q -O "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || \ + command -v curl &>/dev/null && curl -s -o "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || \ + error "请安装wget或curl" [[ -f "$LOCAL_TEMPLATE" ]] || error "模板下载失败" success "模板下载完成" } -# 步骤2:替换变量(核心逻辑不变) +# 步骤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" + # 基础变量 + sed -i "s/LOCALIP/$LOCALIP/g; s/HOSTNAME/$HOSTNAME/g; s/K8SVERSION/$K8SVERSION/g" "$LOCAL_TEMPLATE" + sed -i "s/CLUSTER_VIP/$CLUSTER_VIP/g; 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" + sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER1_IP/; 0,/MASTER01_IP/s/MASTER01_IP/$MASTER2_IP/; 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" + sed -i "s/CLUSTER_VIP:CLUSTER_PORT/${CLUSTER_VIP}:${CLUSTER_PORT}/g" "$LOCAL_TEMPLATE" success "变量替换完成" } -# 步骤3:拷贝到目标服务器(目标IP=local-ip) +# 步骤3:拷贝到目标服务器 copy_to_remote() { - info "拷贝文件到目标服务器:$REMOTE_USER@$LOCALIP:$REMOTE_CONFIG_PATH" + 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 + ssh "$REMOTE_USER@$LOCALIP" "test -f $REMOTE_CONFIG_PATH" || error "远程文件不存在" + success "文件拷贝成功" } -# 步骤4:远程执行命令(拉取镜像等) +# 步骤4:远程执行命令(拉取镜像 + 自动打pause标签) 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 "远程命令执行完成" + info "在 $LOCALIP 执行远程操作..." + + # 子步骤1:拉取K8s镜像(含pause镜像) + info "拉取K8s镜像:kubeadm config images pull --config $REMOTE_CONFIG_PATH" + ssh "$REMOTE_USER@$LOCALIP" "kubeadm config images pull --config $REMOTE_CONFIG_PATH" || error "镜像拉取失败" + success "K8s镜像拉取完成" + + # 子步骤2:获取阿里云pause镜像版本(核心逻辑) + info "获取阿里云pause镜像版本:$PAUSE_ALI_REGISTRY" + # 命令说明:列出k8s.io命名空间的镜像 → 过滤阿里云pause → 提取版本号(格式:镜像名:版本 → 取:后的内容) + local pause_version + pause_version=$(ssh "$REMOTE_USER@$LOCALIP" "nerdctl -n k8s.io images --format '{{.Repository}}:{{.Tag}}' | grep '$PAUSE_ALI_REGISTRY' | awk -F: '{print \$2}' | head -n1") + + # 校验版本是否获取到 + if [[ -z "$pause_version" ]]; then + error "未找到阿里云pause镜像($PAUSE_ALI_REGISTRY),请检查镜像拉取是否成功" + fi + success "获取到pause镜像版本:$pause_version" + + # 子步骤3:执行nerdctl tag命令(替换仓库地址) + local ali_pause_full="${PAUSE_ALI_REGISTRY}:${pause_version}" + local target_pause_full="${PAUSE_TARGET_REGISTRY}:${pause_version}" + info "执行打标签命令:nerdctl -n k8s.io tag $ali_pause_full $target_pause_full" + + ssh "$REMOTE_USER@$LOCALIP" "nerdctl -n k8s.io tag $ali_pause_full $target_pause_full" || error "pause镜像打标签失败" + success "pause镜像标签创建完成($target_pause_full)" + + # 子步骤4:验证标签是否创建成功 + ssh "$REMOTE_USER@$LOCALIP" "nerdctl -n k8s.io images | grep '$PAUSE_TARGET_REGISTRY:$pause_version'" &>/dev/null || \ + error "标签验证失败,未找到 $PAUSE_TARGET_REGISTRY:$pause_version" + success "pause镜像标签验证成功" } -# 步骤5:清理本地文件 +# 步骤5:清理本地临时文件 cleanup() { - info "清理本地临时文件" - rm -f "$LOCAL_TEMPLATE" || info "本地文件清理失败" + info "清理本地临时文件:$LOCAL_TEMPLATE" + rm -f "$LOCAL_TEMPLATE" || info "本地文件清理失败,可手动删除" } @@ -195,14 +189,14 @@ main() { download_template replace_variables copy_to_remote - execute_remote_commands # 可注释跳过 + execute_remote_commands # 包含pause打标签逻辑 cleanup echo -e "\n${GREEN}========================================" - echo -e "部署完成!目标服务器:$LOCALIP" - echo -e "配置文件:$REMOTE_CONFIG_PATH" - echo -e "下一步:在$LOCALIP执行 kubeadm init/join" + echo -e "全流程完成!目标服务器:$LOCALIP" + echo -e "已完成:1. 模板部署 2. 镜像拉取 3. pause镜像标签替换" + echo -e "下一步:执行 kubeadm init --config $REMOTE_CONFIG_PATH(主节点)或 join命令(从节点)" echo -e "========================================" } -main "$@" +main "$@" \ No newline at end of file