更新 scripts/k8s-config-deploy.sh

ccc
This commit is contained in:
joy 2025-10-30 17:44:40 +08:00
parent 4ad3be715c
commit bccfc8fa0a
1 changed files with 67 additions and 73 deletions

View File

@ -6,6 +6,9 @@ TEMPLATE_URL="http://116.205.97.109/scripts/kubeadm-conf.yaml" # 固定模板
LOCAL_TEMPLATE="/tmp/k8s-template-$(date +%s).yaml" # 本地临时模板 LOCAL_TEMPLATE="/tmp/k8s-template-$(date +%s).yaml" # 本地临时模板
REMOTE_CONFIG_PATH="/opt/k8s-install-conf/kubeadm-conf.yaml" # 远程配置路径 REMOTE_CONFIG_PATH="/opt/k8s-install-conf/kubeadm-conf.yaml" # 远程配置路径
REMOTE_USER="root" # 默认远程用户 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 LOCALIP="" # 节点IP同时作为目标服务器IP
HOSTNAME="" # 节点主机名 HOSTNAME="" # 节点主机名
MASTER1_IP="" # 第1个MASTER01_IP替换值 MASTER1_IP="" # 第1个MASTER01_IP替换值
@ -72,21 +75,13 @@ parse_args() {
;; ;;
--help) --help)
echo "用法:$0 [必选参数] [可选参数]" echo "用法:$0 [必选参数] [可选参数]"
echo "功能下载模板→替换变量→拷贝到local-ip对应的服务器→远程执行命令" echo "功能下载模板→替换变量→拷贝到服务器→拉取镜像→自动打pause镜像标签"
echo "说明target-ip与local-ip相同无需单独指定"
echo "必选参数:" echo "必选参数:"
echo " --local-ip <IP> 节点IP同时作为目标服务器IP如192.168.61.10" echo " --local-ip <IP> 节点IP目标服务器IP| --hostname <名称> 节点主机名"
echo " --hostname <名称> 模板中替换的HOSTNAME如master-01" echo " --master1-ip <IP> 第1个MASTER01_IP | --master2-ip <IP> 第2个MASTER01_IP | --master3-ip <IP> 第3个MASTER01_IP"
echo " --master1-ip <IP> 第1个MASTER01_IP替换值如192.168.61.10" echo " --cluster-vip <IP> 集群VIP | --k8s-version <版本> K8s版本 | --cluster-port <端口> API端口"
echo " --master2-ip <IP> 第2个MASTER01_IP替换值如192.168.61.11" echo "可选参数:--remote-user <用户> 远程登录用户默认root"
echo " --master3-ip <IP> 第3个MASTER01_IP替换值如192.168.61.12"
echo " --cluster-vip <IP> 模板中替换的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 "示例:"
echo " 部署到master-01"
echo " $0 --local-ip 192.168.61.10 --hostname 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 " --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" echo " --cluster-vip 192.168.61.200 --k8s-version 1.30.5 --cluster-port 6443"
@ -99,23 +94,14 @@ parse_args() {
done done
# 校验必选参数 # 校验必选参数
local required_params=( local required_params=("LOCALIP" "HOSTNAME" "MASTER1_IP" "MASTER2_IP" "MASTER3_IP" "CLUSTER_VIP" "K8SVERSION" "CLUSTER_PORT")
"LOCALIP" "HOSTNAME" "MASTER1_IP" "MASTER2_IP" "MASTER3_IP"
"CLUSTER_VIP" "K8SVERSION" "CLUSTER_PORT"
)
for param in "${required_params[@]}"; do for param in "${required_params[@]}"; do
if [[ -z "${!param}" ]]; then [[ -z "${!param}" ]] && error "缺少必选参数:--${param,,}"
error "缺少必选参数:--${param,,}"
fi
done done
# 校验IP和端口格式 # 校验格式
if ! [[ "$LOCALIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then [[ ! "$LOCALIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && error "无效local-ip$LOCALIP"
error "无效的local-ip格式$LOCALIP" [[ ! "$CLUSTER_PORT" =~ ^[0-9]+$ || "$CLUSTER_PORT" -lt 1 || "$CLUSTER_PORT" -gt 65535 ]] && error "无效端口:$CLUSTER_PORT"
fi
if ! [[ "$CLUSTER_PORT" =~ ^[0-9]+$ ]] || [[ "$CLUSTER_PORT" -lt 1 ]] || [[ "$CLUSTER_PORT" -gt 65535 ]]; then
error "无效的端口:$CLUSTER_PORT"
fi
} }
@ -123,69 +109,77 @@ parse_args() {
# 步骤1下载模板 # 步骤1下载模板
download_template() { download_template() {
info "下载模板:$TEMPLATE_URL" info "下载模板:$TEMPLATE_URL"
if command -v wget &>/dev/null; then command -v wget &>/dev/null && wget -q -O "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || \
wget -q -O "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || error "wget下载失败" command -v curl &>/dev/null && curl -s -o "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || \
elif command -v curl &>/dev/null; then error "请安装wget或curl"
curl -s -o "$LOCAL_TEMPLATE" "$TEMPLATE_URL" || error "curl下载失败"
else
error "请安装wget或curl"
fi
[[ -f "$LOCAL_TEMPLATE" ]] || error "模板下载失败" [[ -f "$LOCAL_TEMPLATE" ]] || error "模板下载失败"
success "模板下载完成" success "模板下载完成"
} }
# 步骤2替换变量(核心逻辑不变) # 步骤2替换模板变量
replace_variables() { replace_variables() {
info "替换模板变量..." info "替换模板变量..."
# 基础变量替换 # 基础变量
sed -i "s/LOCALIP/$LOCALIP/g" "$LOCAL_TEMPLATE" sed -i "s/LOCALIP/$LOCALIP/g; s/HOSTNAME/$HOSTNAME/g; s/K8SVERSION/$K8SVERSION/g" "$LOCAL_TEMPLATE"
sed -i "s/HOSTNAME/$HOSTNAME/g" "$LOCAL_TEMPLATE" sed -i "s/CLUSTER_VIP/$CLUSTER_VIP/g; s/CLUSTER_PORT/$CLUSTER_PORT/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按顺序替换 # 3个MASTER01_IP按顺序替换
sed -i "0,/MASTER01_IP/s/MASTER01_IP/$MASTER1_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"
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 # 替换CLUSTER_VIP:CLUSTER_PORT
local vip_port="${CLUSTER_VIP}:${CLUSTER_PORT}" sed -i "s/CLUSTER_VIP:CLUSTER_PORT/${CLUSTER_VIP}:${CLUSTER_PORT}/g" "$LOCAL_TEMPLATE"
sed -i "s/CLUSTER_VIP:CLUSTER_PORT/$vip_port/g" "$LOCAL_TEMPLATE"
success "变量替换完成" success "变量替换完成"
} }
# 步骤3拷贝到目标服务器目标IP=local-ip # 步骤3拷贝到目标服务器
copy_to_remote() { 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 "远程目录创建失败" ssh -o StrictHostKeyChecking=no "$REMOTE_USER@$LOCALIP" "mkdir -p $(dirname "$REMOTE_CONFIG_PATH")" || error "远程目录创建失败"
# SCP传输 # SCP传输
scp -o StrictHostKeyChecking=no "$LOCAL_TEMPLATE" "$REMOTE_USER@$LOCALIP:$REMOTE_CONFIG_PATH" || error "文件传输失败" scp -o StrictHostKeyChecking=no "$LOCAL_TEMPLATE" "$REMOTE_USER@$LOCALIP:$REMOTE_CONFIG_PATH" || error "文件传输失败"
# 校验 # 校验
if ssh "$REMOTE_USER@$LOCALIP" "test -f $REMOTE_CONFIG_PATH"; then ssh "$REMOTE_USER@$LOCALIP" "test -f $REMOTE_CONFIG_PATH" || error "远程文件不存在"
success "文件拷贝成功" success "文件拷贝成功"
else
error "远程文件不存在请检查SSH免密"
fi
} }
# 步骤4远程执行命令拉取镜像 # 步骤4远程执行命令拉取镜像 + 自动打pause标签
execute_remote_commands() { execute_remote_commands() {
info "$LOCALIP执行远程命令..." info "$LOCALIP 执行远程操作..."
local remote_cmds=(
"kubeadm config images pull --config $REMOTE_CONFIG_PATH" # 拉取镜像 # 子步骤1拉取K8s镜像含pause镜像
"echo '远程配置文件路径:$REMOTE_CONFIG_PATH'" info "拉取K8s镜像kubeadm config images pull --config $REMOTE_CONFIG_PATH"
) ssh "$REMOTE_USER@$LOCALIP" "kubeadm config images pull --config $REMOTE_CONFIG_PATH" || error "镜像拉取失败"
for cmd in "${remote_cmds[@]}"; do success "K8s镜像拉取完成"
info "执行:$cmd"
ssh "$REMOTE_USER@$LOCALIP" "$cmd" || error "远程命令执行失败" # 子步骤2获取阿里云pause镜像版本核心逻辑
done info "获取阿里云pause镜像版本$PAUSE_ALI_REGISTRY"
success "远程命令执行完成" # 命令说明列出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() { cleanup() {
info "清理本地临时文件" info "清理本地临时文件$LOCAL_TEMPLATE"
rm -f "$LOCAL_TEMPLATE" || info "本地文件清理失败" rm -f "$LOCAL_TEMPLATE" || info "本地文件清理失败,可手动删除"
} }
@ -195,14 +189,14 @@ main() {
download_template download_template
replace_variables replace_variables
copy_to_remote copy_to_remote
execute_remote_commands # 可注释跳过 execute_remote_commands # 包含pause打标签逻辑
cleanup cleanup
echo -e "\n${GREEN}========================================" echo -e "\n${GREEN}========================================"
echo -e "部署完成!目标服务器:$LOCALIP" echo -e "全流程完成!目标服务器:$LOCALIP"
echo -e "配置文件:$REMOTE_CONFIG_PATH" echo -e "已完成1. 模板部署 2. 镜像拉取 3. pause镜像标签替换"
echo -e "下一步:$LOCALIP执行 kubeadm init/join" echo -e "下一步:执行 kubeadm init --config $REMOTE_CONFIG_PATH(主节点)或 join命令从节点"
echo -e "========================================" echo -e "========================================"
} }
main "$@" main "$@"