From dbbdb55d301ece69f45a82dc7b71683da0894427 Mon Sep 17 00:00:00 2001 From: joy Date: Fri, 31 Oct 2025 00:34:55 +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 aaaaa --- scripts/k8s-config-deploy.sh | 243 +++++++++++------------------------ 1 file changed, 77 insertions(+), 166 deletions(-) diff --git a/scripts/k8s-config-deploy.sh b/scripts/k8s-config-deploy.sh index fd2a850..fb1d3ac 100644 --- a/scripts/k8s-config-deploy.sh +++ b/scripts/k8s-config-deploy.sh @@ -1,202 +1,113 @@ #!/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" # 默认远程用户 -# pause镜像相关配置 -PAUSE_ALI_REGISTRY="registry.cn-hangzhou.aliyuncs.com/google_containers/pause" # 阿里云pause镜像 -PAUSE_TARGET_REGISTRY="registry.k8s.io/pause" # 目标pause镜像(替换后) +# 核心配置(三主节点+模板存/opt/) +TEMPLATE_URL="http://116.205.97.109/scripts/kubeadm-conf.yaml" +LOCAL_TEMPLATE="/opt/kubeadm-conf.yaml" +PAUSE_ALI_REG="registry.cn-hangzhou.aliyuncs.com/google_containers/pause" +PAUSE_TARGET_REG="registry.k8s.io/pause" +NERDCTL_CMD="nerdctl -n k8s.io" +# 三主节点参数 +LOCALIP="" +HOSTNAME="" +K8SVERSION="" +CLUSTER_VIP="" +CLUSTER_PORT="" +MASTER01_IP="" +MASTER02_IP="" +MASTER03_IP="" -# ========================== 工具函数 ========================== -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端口 - +# 日志函数 +info() { echo -e "\033[1;33m[INFO] $1\033[0m"; } +success() { echo -e "\033[0;32m[SUCCESS] $1\033[0m"; } +error() { echo -e "\033[0;31m[ERROR] $1\033[0m" >&2; exit 1; } +# 1. 解析三主节点参数 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 "功能:下载模板→替换变量→拷贝到服务器→拉取镜像→自动打pause镜像标签" - echo "必选参数:" - 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 " $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" + [[ "$1" =~ ^--([a-z0-9-]+)=(.*)$ ]] || error "参数格式:--key=value(例--master2-ip=192.168.61.132)" + local key="${BASH_REMATCH[1]}" + local val="${BASH_REMATCH[2]}" + case "$key" in + local-ip) LOCALIP="$val" ;; + hostname) HOSTNAME="$val" ;; + k8s-version) K8SVERSION="$val" ;; + cluster-vip) CLUSTER_VIP="$val" ;; + cluster-port) CLUSTER_PORT="$val" ;; + master1-ip) MASTER01_IP="$val" ;; + master2-ip) MASTER02_IP="$val" ;; + master3-ip) MASTER03_IP="$val" ;; + help) + echo "三主节点用法:$0 --local-ip=IP --hostname=名 --k8s-version=版 --cluster-vip=IP --cluster-port=端口 --master1-ip=IP --master2-ip=IP --master3-ip=IP" exit 0 ;; - *) - error "未知参数:$1(执行$0 --help查看用法)" - ;; + *) error "未知参数:--$key" ;; esac + shift 1 done - - # 校验必选参数 - local required_params=("LOCALIP" "HOSTNAME" "MASTER1_IP" "MASTER2_IP" "MASTER3_IP" "CLUSTER_VIP" "K8SVERSION" "CLUSTER_PORT") - for param in "${required_params[@]}"; do - [[ -z "${!param}" ]] && error "缺少必选参数:--${param,,}" - done - - # 校验格式 - [[ ! "$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" + # 必选参数校验 + [[ -z "$LOCALIP" || -z "$HOSTNAME" || -z "$K8SVERSION" || -z "$CLUSTER_VIP" || -z "$CLUSTER_PORT" || -z "$MASTER01_IP" ]] && \ + error "缺必选参数!至少需要--local-ip --hostname --k8s-version --cluster-vip --cluster-port --master1-ip" + # 可选参数默认值 + [[ -z "$MASTER02_IP" ]] && MASTER02_IP="$MASTER01_IP" + [[ -z "$MASTER03_IP" ]] && MASTER03_IP="$MASTER01_IP" + # 参数预览 + info "三主节点确认:$MASTER01_IP(主1) | $MASTER02_IP(主2) | $MASTER03_IP(主3)" } - -# ========================== 核心步骤 ========================== -# 步骤1:下载模板 +# 2. 下载模板(修复wget参数:--retry→--tries) download_template() { - info "下载模板:$TEMPLATE_URL" - 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 "模板下载完成" + info "下载模板到$LOCAL_TEMPLATE" + [[ -w "$(dirname "$LOCAL_TEMPLATE")" ]] || error "/opt/无写入权限" + # 修复:wget无--retry,用--tries=3(重试3次)+ --retry-connrefused(连接拒绝时重试) + wget -q -O "$LOCAL_TEMPLATE" \ + --tries=3 \ + --retry-connrefused \ + --waitretry=2 \ + "$TEMPLATE_URL" || error "模板下载失败(检查网络)" + [[ -s "$LOCAL_TEMPLATE" ]] || error "模板为空" + success "模板保存到:$LOCAL_TEMPLATE" } -# 步骤2:替换模板变量 +# 3. 替换三主节点变量 replace_variables() { - info "替换模板变量..." - # 基础变量 + info "替换模板变量(含三主节点IP)" 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/; 0,/MASTER01_IP/s/MASTER01_IP/$MASTER2_IP/; 0,/MASTER01_IP/s/MASTER01_IP/$MASTER3_IP/" "$LOCAL_TEMPLATE" - # 替换CLUSTER_VIP:CLUSTER_PORT + sed -i "s/MASTER01_IP/$MASTER01_IP/g; s/MASTER02_IP/$MASTER02_IP/g; s/MASTER03_IP/$MASTER03_IP/g" "$LOCAL_TEMPLATE" sed -i "s/CLUSTER_VIP:CLUSTER_PORT/${CLUSTER_VIP}:${CLUSTER_PORT}/g" "$LOCAL_TEMPLATE" success "变量替换完成" } -# 步骤3:拷贝到目标服务器 -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 "文件传输失败" - # 校验 - ssh "$REMOTE_USER@$LOCALIP" "test -f $REMOTE_CONFIG_PATH" || error "远程文件不存在" - success "文件拷贝成功" +# 4. 拉取K8s镜像 +pull_images() { + info "拉取K8s镜像(配置:$LOCAL_TEMPLATE)" + kubeadm config images pull --config "$LOCAL_TEMPLATE" || error "镜像拉取失败" + success "镜像拉取完成" } -# 步骤4:远程执行命令(拉取镜像 + 自动打pause标签) -execute_remote_commands() { - 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. nerdctl打pause标签 +tag_pause() { + local pause_version=$($NERDCTL_CMD images | grep -v "none" | grep "$PAUSE_ALI_REG" | awk '{print $2}' | head -n1) + [[ -z "$pause_version" ]] && error "未找到pause镜像" + info "pause版本:$pause_version" + $NERDCTL_CMD tag "$PAUSE_ALI_REG:$pause_version" "$PAUSE_TARGET_REG:$pause_version" || error "Tag失败" + success "pause Tag完成" } -# 步骤5:清理本地临时文件 -cleanup() { - info "清理本地临时文件:$LOCAL_TEMPLATE" - rm -f "$LOCAL_TEMPLATE" || info "本地文件清理失败,可手动删除" -} - - -# ========================== 主流程 ========================== +# 主流程 main() { + echo -e "\033[1;33m=== 三主节点K8s模板脚本(修复版) ===\033[0m\n" parse_args "$@" download_template replace_variables - copy_to_remote - execute_remote_commands # 包含pause打标签逻辑 - cleanup + pull_images + tag_pause - echo -e "\n${GREEN}========================================" - echo -e "全流程完成!目标服务器:$LOCALIP" - echo -e "已完成:1. 模板部署 2. 镜像拉取 3. pause镜像标签替换" - echo -e "下一步:执行 kubeadm init --config $REMOTE_CONFIG_PATH(主节点)或 join命令(从节点)" - echo -e "========================================" + echo -e "\n\033[0;32m=== 所有操作完成!===" + echo -e "模板路径:$LOCAL_TEMPLATE" + echo -e "初始化命令:kubeadm init --config $LOCAL_TEMPLATE\033[0m" } main "$@" \ No newline at end of file