#!/bin/bash
# ======================================================
# Kubernetes 集群通用配置脚本 (Ubuntu 22.04) - VIP修正版
# 新增：自动配置Hosts解析（含VIP）
# 执行：sudo ./k8s-common-setup.sh
# ======================================================

set -e # 遇到错误自动退出

# ====================== 配置参数 ======================
# >>> 根据实际环境修改这些值 <<<
VIP="10.0.0.150"          # 虚拟IP（必须独立！）
DOMAIN="k8s.lab"          # 域名后缀
MASTER_IPS=("10.0.0.101" "10.0.0.102" "10.0.0.103")
NODE_IPS=("10.0.0.104" "10.0.0.105" "10.0.0.106")
# =====================================================

echo "✅ ==== 开始Kubernetes通用配置 ===="

# 1. 基础系统配置
echo "🛠  1. 系统基础配置中..."
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

sudo timedatectl set-timezone Asia/Shanghai
sudo apt update -qq
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release ntpdate

# 2. 主机名设置（自动识别节点类型）
CURRENT_IP=$(hostname -I | awk '{print $1}')

if [[ " ${MASTER_IPS[@]} " =~ " ${CURRENT_IP} " ]]; then
    INDEX=$(printf '%s\n' "${MASTER_IPS[@]}" | grep -n "^${CURRENT_IP}$" | cut -d: -f1)
    HOSTNAME="master${INDEX}.${DOMAIN}"
    sudo hostnamectl set-hostname "$HOSTNAME"
    echo "  设置为控制节点: $HOSTNAME"
elif [[ " ${NODE_IPS[@]} " =~ " ${CURRENT_IP} " ]]; then
    INDEX=$(printf '%s\n' "${NODE_IPS[@]}" | grep -n "^${CURRENT_IP}$" | cut -d: -f1)
    HOSTNAME="node${INDEX}.${DOMAIN}"
    sudo hostnamectl set-hostname "$HOSTNAME"
    echo "  设置为工作节点: $HOSTNAME"
else
    echo "⚠️  警告：当前IP ${CURRENT_IP} 不在节点列表中!"
    HOSTNAME=$(hostname)
fi

# 3. 内核优化
echo "🔧 2. 内核参数优化中..."
sudo tee /etc/modules-load.d/k8s.conf > /dev/null <<EOF
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
nf_conntrack
EOF

sudo modprobe br_netfilter
sudo modprobe ip_vs

sudo tee /etc/sysctl.d/k8s.conf > /dev/null <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system > /dev/null

# ====================== Hosts文件配置 ======================
echo "📡 3. 配置主机解析..."

# 备份原hosts
sudo cp /etc/hosts /etc/hosts.bak

# 创建新hosts文件
sudo tee /etc/hosts > /dev/null <<EOF
127.0.0.1   localhost
127.0.1.1   $HOSTNAME

# Kubernetes Cluster
$VIP kubeapi.$DOMAIN
EOF

# 添加Master节点
for i in "${!MASTER_IPS[@]}"; do
    echo "${MASTER_IPS[$i]} master$((i+1)).$DOMAIN" | sudo tee -a /etc/hosts > /dev/null
done

# 添加Node节点
for i in "${!NODE_IPS[@]}"; do
    echo "${NODE_IPS[$i]} node$((i+1)).$DOMAIN" | sudo tee -a /etc/hosts > /dev/null
done

echo "  当前主机解析配置："
grep -v '^#\|^$' /etc/hosts | sed 's/^/   /'

# 4. 时间同步
echo "⏰ 4. 配置时间同步..."
sudo ntpdate ntp.aliyun.com
sudo timedatectl set-ntp true

# 5. 安装Docker
echo "🐳 5. 安装Docker容器运行时..."
# 添加Docker源（使用阿里云镜像加速）
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg  | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update -qq
sudo apt install -y docker-ce docker-ce-cli containerd.io

# Docker配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com "],
  "log-driver": "json-file",
  "log-opts": {"max-size": "100m"}
}
EOF

sudo systemctl restart docker
docker run --rm hello-world > /dev/null && echo "   Docker测试成功!" || echo "   Docker测试失败!"

# 6. 安装cri-dockerd
echo "🔌 6. 安装cri-dockerd适配器..."
# 使用最新版本（检查 https://github.com/Mirantis/cri-dockerd/releases/ ）
wget -q https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.12/cri-dockerd_0.3.12.0-0.ubuntu-jammy_amd64.deb 
sudo dpkg -i cri-dockerd_0.3.12.0-0.ubuntu-jammy_amd64.deb

# 修改配置使用国内镜像
sudo sed -i 's|ExecStart=.*|ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9|' /lib/systemd/system/cri-docker.service

sudo systemctl daemon-reload
sudo systemctl enable cri-docker --now

echo "✅ ==== 通用配置已完成! ===="
echo "VIP地址: $VIP (kubeapi.$DOMAIN)"
echo "节点列表:"
printf "  Master: %s\n" "${MASTER_IPS[@]}"
printf "  Worker: %s\n" "${NODE_IPS[@]}"
echo "下一步操作:"
echo "1. 在所有节点安装kubeadm/kubelet/kubectl"
echo "2. 在master1节点执行kubeadm init"
echo "3. 在其他节点执行kubeadm join"