更新 scripts/keepalived.sh

This commit is contained in:
joy 2025-10-30 14:05:06 +08:00
parent b03b1a0dda
commit b6b74903d9
1 changed files with 131 additions and 119 deletions

View File

@ -1,7 +1,21 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
# 初始化变量 # ========================== 全局配置 ==========================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
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; }
step() { echo -e "\n${BLUE}>> $1${NC}"; }
# 配置参数
ACTION="" ACTION=""
VIP="" VIP=""
PRIORITY=150 PRIORITY=150
@ -9,112 +23,86 @@ INTERFACE=""
KEEPALIVED_CONF="/etc/keepalived/keepalived.conf" KEEPALIVED_CONF="/etc/keepalived/keepalived.conf"
CHECK_SCRIPT="/usr/local/bin/check_haproxy.sh" CHECK_SCRIPT="/usr/local/bin/check_haproxy.sh"
# 打印帮助信息
# ========================== 帮助信息 ==========================
usage() { usage() {
echo "用法: $0 [操作] [选项]" cat << EOF
echo "操作:" Keepalived 高可用配置脚本适配K8s VIP管理
echo " --install 安装并配置keepalived" 功能:安装/卸载Keepalived配置虚拟IP(VIP)及HAProxy健康检查
echo " --uninstall 卸载keepalived并清理配置"
echo "安装选项:" 用法: $0 [操作] [选项]
echo " --vip <VIP> 必选虚拟IP格式:192.168.1.100/24"
echo " --priority <数值> 可选优先级默认150主节点设高" 操作:
echo "示例:" --install 安装并配置Keepalived
echo " 安装主节点: $0 --install --vip 192.168.1.100/24 --priority 150" --uninstall 卸载Keepalived及清理配置
echo " 安装备节点: $0 --install --vip 192.168.1.100/24 --priority 140"
echo " 卸载: $0 --uninstall" 安装选项:
--vip <VIP> 必选虚拟IP格式192.168.1.100/24
--priority <数值> 可选节点优先级默认150主节点建议150+备节点140-
示例:
主节点安装: $0 --install --vip 192.168.61.200/24 --priority 150
备节点安装: $0 --install --vip 192.168.61.200/24 --priority 140
卸载: $0 --uninstall
EOF
exit 1 exit 1
} }
# 解析参数
while [[ $# -gt 0 ]]; do
case "$1" in
--install|--uninstall)
ACTION="$1"
shift
;;
--vip)
VIP="$2"
shift 2
;;
--priority)
PRIORITY="$2"
shift 2
;;
*)
echo "错误:未知参数 $1"
usage
;;
esac
done
# 校验操作参数 # ========================== 工具函数 ==========================
if [[ -z "$ACTION" ]]; then # 获取默认网卡(非回环,第一个激活的网卡)
echo "错误:必须指定 --install 或 --uninstall"
usage
fi
# 检查root权限
if [[ $EUID -ne 0 ]]; then
echo "错误脚本必须以root权限运行使用sudo"
exit 1
fi
# 获取默认网卡
get_default_interface() { get_default_interface() {
INTERFACE=$(ip -br link show | grep -v LOOPBACK | awk '{print $1}' | head -n 1) INTERFACE=$(ip -br link show up | grep -v LOOPBACK | awk '{print $1}' | head -n1)
if [[ -z "$INTERFACE" ]]; then [[ -z "$INTERFACE" ]] && error "无法获取有效网卡,请检查网络接口状态"
echo "错误:无法获取默认网卡,请手动检查网络接口" info "自动获取网卡:$INTERFACE"
exit 1
fi
echo "使用默认网卡:$INTERFACE"
} }
# 安装keepalived
install_keepalived() {
# 校验安装参数
if [[ -z "$VIP" ]]; then
echo "错误:安装必须指定 --vip格式:IP/子网掩码)"
usage
fi
if ! [[ "$VIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]]; then
echo "错误VIP格式无效正确格式192.168.1.100/24"
exit 1
fi
# ========================== 安装逻辑 ==========================
install_keepalived() {
# 参数校验
[[ -z "$VIP" ]] && error "必须通过--vip指定虚拟IP格式IP/子网掩码如192.168.61.200/24"
[[ ! "$VIP" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]] && error "VIP格式无效正确格式192.168.61.200/24"
[[ ! "$PRIORITY" =~ ^[0-9]+$ ]] && error "优先级必须是整数如150"
step "开始安装Keepalived"
# 获取网卡 # 获取网卡
get_default_interface get_default_interface
# 安装软件 # 安装软件静默模式去除apt警告
echo "===== 开始安装keepalived =====" info "安装Keepalived软件包..."
apt update >/dev/null apt update -qq >/dev/null 2>&1
apt install -y keepalived >/dev/null || { echo "keepalived安装失败"; exit 1; } apt install -y -qq keepalived >/dev/null 2>&1 || error "Keepalived安装失败"
success "Keepalived软件包安装完成"
# 备份原有配置(若存在) # 备份原有配置
if [[ -f "$KEEPALIVED_CONF" ]]; then if [[ -f "$KEEPALIVED_CONF" ]]; then
mv "$KEEPALIVED_CONF" "${KEEPALIVED_CONF}.bak.$(date +%F_%H%M%S)" local backup="${KEEPALIVED_CONF}.bak.$(date +%F_%H%M%S)"
echo "已备份原有配置文件" mv "$KEEPALIVED_CONF" "$backup"
info "原有配置已备份至:$backup"
fi fi
# 创建健康检查脚本 # 创建健康检查脚本监控HAProxy状态
echo "创建健康检查脚本..." info "创建HAProxy健康检查脚本..."
cat > "$CHECK_SCRIPT" << 'EOF' cat > "$CHECK_SCRIPT" << 'EOF'
#!/bin/bash #!/bin/bash
if ! pgrep -x "haproxy" >/dev/null; then pgrep -x "haproxy" >/dev/null 2>&1 || { systemctl stop keepalived; exit 1; }
systemctl stop keepalived exit 0
exit 1
else
exit 0
fi
EOF EOF
chmod +x "$CHECK_SCRIPT" chmod +x "$CHECK_SCRIPT" || error "健康检查脚本权限设置失败"
success "健康检查脚本已创建:$CHECK_SCRIPT"
# 生成配置文件 # 生成配置文件
echo "生成keepalived配置..." info "生成Keepalived配置..."
local state="BACKUP"
[[ "$PRIORITY" -ge 150 ]] && state="MASTER" # 优先级≥150默认为主节点
cat > "$KEEPALIVED_CONF" << EOF cat > "$KEEPALIVED_CONF" << EOF
global_defs { global_defs {
router_id LVS_K8S_$(hostname) router_id LVS_K8S_$(hostname)
script_security 2 script_security 2
enable_script_security enable_script_security
} }
vrrp_script check_haproxy { vrrp_script check_haproxy {
@ -124,7 +112,7 @@ vrrp_script check_haproxy {
} }
vrrp_instance VI_1 { vrrp_instance VI_1 {
state $(if [[ $PRIORITY -ge 150 ]]; then echo "MASTER"; else echo "BACKUP"; fi) state $state
interface $INTERFACE interface $INTERFACE
virtual_router_id 51 virtual_router_id 51
priority $PRIORITY priority $PRIORITY
@ -141,64 +129,88 @@ vrrp_instance VI_1 {
} }
} }
EOF EOF
[[ -f "$KEEPALIVED_CONF" ]] || error "配置文件生成失败"
success "配置文件已生成:$KEEPALIVED_CONF"
# 启动服务 # 启动服务
systemctl enable keepalived info "启动并设置开机自启..."
systemctl start keepalived systemctl enable --now keepalived >/dev/null 2>&1 || error "Keepalived启动失败日志journalctl -u keepalived"
if systemctl is-active --quiet keepalived; then [[ "$(systemctl is-active keepalived)" == "active" ]] || error "Keepalived启动后状态异常"
echo "===== keepalived安装完成 ====="
echo "VIP$VIP" # 安装完成汇总
echo "优先级:$PRIORITY" echo -e "\n${GREEN}===== 安装完成 =====${NC}"
echo "网卡:$INTERFACE" echo " VIP: $VIP"
else echo " 节点角色: $state(优先级: $PRIORITY"
echo "错误keepalived启动失败请查看日志 journalctl -u keepalived" echo " 绑定网卡: $INTERFACE"
exit 1 echo " 健康检查: $CHECK_SCRIPT"
fi echo " 服务状态: 运行中"
} }
# 卸载keepalived
# ========================== 卸载逻辑 ==========================
uninstall_keepalived() { uninstall_keepalived() {
echo "===== 开始卸载keepalived =====" step "开始卸载Keepalived"
# 停止服务 # 停止服务
if systemctl is-active --quiet keepalived; then if systemctl is-active --quiet keepalived; then
systemctl stop keepalived info "停止Keepalived服务..."
echo "已停止keepalived服务" systemctl stop keepalived >/dev/null 2>&1 || info "服务停止失败,继续卸载"
success "服务已停止"
else
info "Keepalived未运行跳过停止步骤"
fi fi
# 卸载软件 # 卸载软件
if dpkg -l keepalived &>/dev/null; then if dpkg -l keepalived &>/dev/null; then
apt purge -y keepalived >/dev/null info "卸载软件包..."
apt autoremove -y >/dev/null apt purge -y -qq keepalived >/dev/null 2>&1 || error "软件包卸载失败"
echo "已卸载keepalived软件包" apt autoremove -y -qq >/dev/null 2>&1
success "软件包已卸载"
else else
echo "keepalived未安装跳过卸载" info "Keepalived未安装跳过卸载"
fi fi
# 清理配置文件(保留备份提示) # 清理配置
if [[ -d /etc/keepalived/ ]]; then if [[ -d /etc/keepalived/ ]]; then
mv /etc/keepalived/ "/etc/keepalived.bak.$(date +%F_%H%M%S)" local backup="/etc/keepalived.bak.$(date +%F_%H%M%S)"
echo "配置文件已备份至 /etc/keepalived.bak.xxx" mv /etc/keepalived/ "$backup"
success "配置目录已备份至:$backup"
fi fi
# 清理健康检查脚本 # 清理健康检查脚本
if [[ -f "$CHECK_SCRIPT" ]]; then if [[ -f "$CHECK_SCRIPT" ]]; then
rm -f "$CHECK_SCRIPT" rm -f "$CHECK_SCRIPT"
echo "已删除健康检查脚本" success "健康检查脚本已删除:$CHECK_SCRIPT"
fi fi
echo "===== keepalived卸载完成 =====" # 卸载完成
echo -e "\n${GREEN}===== 卸载完成 =====${NC}"
} }
# 执行操作
case "$ACTION" in # ========================== 主逻辑 ==========================
--install) main() {
install_keepalived # 解析参数
;; while [[ $# -gt 0 ]]; do
--uninstall) case "$1" in
uninstall_keepalived --install|--uninstall) ACTION="$1"; shift ;;
;; --vip) [[ $# -lt 2 ]] && error "--vip需指定IP/子网掩码"; VIP="$2"; shift 2 ;;
*) --priority) [[ $# -lt 2 ]] && error "--priority需指定数值"; PRIORITY="$2"; shift 2 ;;
usage *) error "未知参数:$1" ;;
;; esac
esac done
# 校验操作
[[ -z "$ACTION" ]] && error "必须指定--install安装或--uninstall卸载"
# 检查root权限
[[ $EUID -ne 0 ]] && error "请使用root权限运行sudo $0 ..."
# 执行操作
case "$ACTION" in
--install) install_keepalived ;;
--uninstall) uninstall_keepalived ;;
esac
}
main "$@"