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

190 lines
5.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -euo pipefail
# 校验是否为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
# 定义目标目录
target_dir="/opt/k8s-install-conf"
# 校验kubeadm-conf.yaml是否存在
if [ ! -f "/opt/k8s-install-conf/kubeadm-conf.yaml" ]; then
echo "错误:当前目录未找到 kubeadm-conf.yaml 配置文件"
exit 1
fi
# -------------------------- 第一步初始化第一台Master节点 --------------------------
echo "=== 开始初始化第一台Master节点 ==="
# 执行kubeadm初始化带证书上传
echo "执行 kubeadm init 初始化集群..."
kubeadm init --config ${target_dir}/kubeadm-conf.yaml --upload-certs
# 配置当前用户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"
echo "=== 第一台Master节点初始化完成 ==="
# -------------------------- 第二步:生成添加节点的脚本 --------------------------
echo "=== 开始生成添加节点脚本 ==="
# 创建目标目录
mkdir -p "$target_dir"
# 生成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)
# 校验参数生成结果
if [ -z "$CERT_KEY" ] || [ -z "$JOIN_CMD_BASE" ]; then
echo "错误:生成集群加入参数失败"
exit 1
fi
# 生成添加Master节点的脚本包含kubeconfig配置
echo "生成 $target_dir/add_master.sh ..."
cat > "$target_dir/add_master.sh" <<EOF
#!/bin/bash
set -euo pipefail
# 执行Master节点加入
$JOIN_CMD_BASE --control-plane --certificate-key $CERT_KEY
# 配置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
echo "Master节点加入集群并配置完成"
EOF
# 生成添加Node节点的脚本
echo "生成 $target_dir/add_node.sh ..."
cat > "$target_dir/add_node.sh" <<EOF
#!/bin/bash
set -euo pipefail
# 执行Node节点加入
$JOIN_CMD_BASE
echo "Node节点加入集群完成"
EOF
# 赋予脚本执行权限
chmod +x "$target_dir/add_master.sh" "$target_dir/add_node.sh"
echo "=== 添加节点脚本生成完成 ==="
# -------------------------- 第三步:定义通用工具函数 --------------------------
# 免密登录验证函数
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
}
# 拷贝脚本到远程节点函数
copy_script() {
local ip="$1"
local script_path="$2"
echo "拷贝脚本到 $ip ..."
scp -o StrictHostKeyChecking=no "$script_path" "$ip:/tmp/"
}
# 远程执行脚本函数
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"
}
# -------------------------- 第四步处理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
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
fi
# -------------------------- 第六步:执行结果提示 --------------------------
echo -e "\n=== 所有节点处理完成 ==="
echo "验证集群节点状态命令kubectl get nodes"
echo "验证控制平面组件状态命令kubectl get pods -n kube-system -l component=kube-apiserver,kube-controller-manager,kube-scheduler"