ansible-devops/scripts/k8s-cluster-deploy.sh

190 lines
5.8 KiB
Bash
Raw Normal View History

#!/bin/bash
set -euo pipefail
2025-11-08 10:56:00 +08:00
# 校验是否为root用户执行
if [ "$(id -u)" -ne 0 ]; then
echo "错误脚本需以root权限执行"
exit 1
fi
# 初始化参数变量
master_ips=""
node_ips=""
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case "$1" in
--master-ips)
master_ips="$2"
shift 2
;;
--node-ips)
node_ips="$2"
shift 2
;;
*)
echo "错误:未知参数 $1"
echo "使用方式:$0 --master-ips 192.168.61.131,192.168.61.132 --node-ips 192.168.61.134"
exit 1
;;
esac
done
# 校验参数是否完整
if [ -z "$master_ips" ] && [ -z "$node_ips" ]; then
echo "错误:必须指定 --master-ips 或 --node-ips"
echo "使用方式:$0 --master-ips 192.168.61.131,192.168.61.132 --node-ips 192.168.61.134"
exit 1
fi
2025-11-08 10:56:00 +08:00
# 定义目标目录
target_dir="/opt/k8s-install-conf"
2025-11-08 10:56:00 +08:00
# 校验kubeadm-conf.yaml是否存在
if [ ! -f "/opt/k8s-install-conf/kubeadm-conf.yaml" ]; then
echo "错误:当前目录未找到 kubeadm-conf.yaml 配置文件"
exit 1
2025-11-08 10:56:00 +08:00
fi
2025-11-08 10:56:00 +08:00
# -------------------------- 第一步初始化第一台Master节点 --------------------------
echo "=== 开始初始化第一台Master节点 ==="
2025-11-08 10:56:00 +08:00
# 执行kubeadm初始化带证书上传
echo "执行 kubeadm init 初始化集群..."
kubeadm init --config ${target_dir}/kubeadm-conf.yaml --upload-certs
2025-11-08 10:56:00 +08:00
# 配置当前用户kubeconfig
echo "配置当前用户kubeconfig..."
mkdir -p "$HOME/.kube"
cp -i /etc/kubernetes/admin.conf "$HOME/.kube/config"
chown "$(id -u):$(id -g)" "$HOME/.kube/config"
export KUBECONFIG=/etc/kubernetes/admin.conf
# 将环境变量写入profile永久生效
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> "$HOME/.profile"
2025-11-08 10:56:00 +08:00
echo "=== 第一台Master节点初始化完成 ==="
2025-11-08 10:56:00 +08:00
# -------------------------- 第二步:生成添加节点的脚本 --------------------------
echo "=== 开始生成添加节点脚本 ==="
2025-11-08 10:56:00 +08:00
# 创建目标目录
mkdir -p "$target_dir"
2025-11-08 10:56:00 +08:00
# 生成certificate-key和基础join命令
echo "生成集群加入所需参数..."
CERT_KEY=$(kubeadm init phase upload-certs --upload-certs 2>/dev/null | grep -E '^[0-9a-f]{64,}$')
JOIN_CMD_BASE=$(kubeadm token create --print-join-command 2>/dev/null)
2025-11-08 10:56:00 +08:00
# 校验参数生成结果
if [ -z "$CERT_KEY" ] || [ -z "$JOIN_CMD_BASE" ]; then
echo "错误:生成集群加入参数失败"
exit 1
fi
2025-11-08 10:56:00 +08:00
# 生成添加Master节点的脚本包含kubeconfig配置
echo "生成 $target_dir/add_master.sh ..."
cat > "$target_dir/add_master.sh" <<EOF
#!/bin/bash
set -euo pipefail
2025-11-08 10:56:00 +08:00
# 执行Master节点加入
$JOIN_CMD_BASE --control-plane --certificate-key $CERT_KEY
2025-11-08 10:56:00 +08:00
# 配置kubeconfig
mkdir -p \$HOME/.kube
cp -i /etc/kubernetes/admin.conf \$HOME/.kube/config
chown \$(id -u):\$(id -g) \$HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> \$HOME/.profile
2025-11-08 10:56:00 +08:00
echo "Master节点加入集群并配置完成"
EOF
2025-11-08 10:56:00 +08:00
# 生成添加Node节点的脚本
echo "生成 $target_dir/add_node.sh ..."
cat > "$target_dir/add_node.sh" <<EOF
#!/bin/bash
set -euo pipefail
2025-11-08 10:56:00 +08:00
# 执行Node节点加入
$JOIN_CMD_BASE
2025-11-08 10:56:00 +08:00
echo "Node节点加入集群完成"
EOF
2025-11-08 10:56:00 +08:00
# 赋予脚本执行权限
chmod +x "$target_dir/add_master.sh" "$target_dir/add_node.sh"
2025-11-08 10:56:00 +08:00
echo "=== 添加节点脚本生成完成 ==="
2025-11-08 10:56:00 +08:00
# -------------------------- 第三步:定义通用工具函数 --------------------------
# 免密登录验证函数
check_ssh_auth() {
local ip="$1"
echo "验证 $ip 免密登录..."
if ! ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 "$ip" "echo 'auth_ok'"; then
echo "错误:$ip 免密登录失败请先配置SSH免密登录"
exit 1
fi
}
2025-11-08 10:56:00 +08:00
# 拷贝脚本到远程节点函数
copy_script() {
local ip="$1"
local script_path="$2"
echo "拷贝脚本到 $ip ..."
scp -o StrictHostKeyChecking=no "$script_path" "$ip:/tmp/"
}
2025-11-08 10:56:00 +08:00
# 远程执行脚本函数
run_remote_script() {
local ip="$1"
local script_name="$2"
echo "$ip 执行 $script_name ..."
ssh -o StrictHostKeyChecking=no "$ip" "bash /tmp/$script_name"
# 执行完成后删除远程临时脚本
ssh -o StrictHostKeyChecking=no "$ip" "rm -f /tmp/$script_name"
}
2025-11-08 10:56:00 +08:00
# -------------------------- 第四步处理Master节点加入 --------------------------
if [ -n "$master_ips" ]; then
echo -e "\n=== 开始处理Master节点加入 ==="
# 分割IP列表处理逗号分隔去除空格
IFS=',' read -ra master_ip_arr <<< "$(echo "$master_ips" | tr -d ' ')"
for ip in "${master_ip_arr[@]}"; do
echo -e "\n--- 处理Master节点$ip ---"
# 验证免密
check_ssh_auth "$ip"
# 拷贝脚本
copy_script "$ip" "$target_dir/add_master.sh"
# 远程执行
run_remote_script "$ip" "add_master.sh"
echo "--- Master节点 $ip 处理完成 ---"
done
2025-11-08 10:56:00 +08:00
fi
# -------------------------- 第五步处理Node节点加入 --------------------------
if [ -n "$node_ips" ]; then
echo -e "\n=== 开始处理Node节点加入 ==="
# 分割IP列表处理逗号分隔去除空格
IFS=',' read -ra node_ip_arr <<< "$(echo "$node_ips" | tr -d ' ')"
for ip in "${node_ip_arr[@]}"; do
echo -e "\n--- 处理Node节点$ip ---"
# 验证免密
check_ssh_auth "$ip"
# 拷贝脚本
copy_script "$ip" "$target_dir/add_node.sh"
# 远程执行
run_remote_script "$ip" "add_node.sh"
echo "--- Node节点 $ip 处理完成 ---"
done
2025-11-08 10:56:00 +08:00
fi
2025-11-08 10:56:00 +08:00
# -------------------------- 第六步:执行结果提示 --------------------------
echo -e "\n=== 所有节点处理完成 ==="
echo "验证集群节点状态命令kubectl get nodes"
echo "验证控制平面组件状态命令kubectl get pods -n kube-system -l component=kube-apiserver,kube-controller-manager,kube-scheduler"