Files
devstar/docs/kubernetes/k8s-step1-prepare-env.sh

110 lines
2.9 KiB
Bash

#!/bin/bash
set -e
# Kubernetes 环境准备脚本
# 功能: 在所有节点准备 Kubernetes 运行环境
echo "==== Kubernetes 环境准备 ===="
# 定义节点列表
NODES=("172.17.0.15:master" "172.17.0.43:node1" "172.17.0.34:node2")
# 本机 IP 与 SSH 选项
LOCAL_IP=$(ip route get 1 | awk '{print $7; exit}')
SSH_OPTS='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes'
# SSH 私钥(可用环境变量 SSH_KEY 覆盖),存在则自动携带
SSH_KEY_PATH=${SSH_KEY:-$HOME/.ssh/id_rsa}
[ -f "$SSH_KEY_PATH" ] && SSH_ID="-i $SSH_KEY_PATH" || SSH_ID=""
# 函数:在所有节点执行命令
execute_on_all_nodes() {
local command="$1"
local description="$2"
echo "==== $description ===="
for node in "${NODES[@]}"; do
IFS=':' read -r ip hostname <<< "$node"
echo "$hostname ($ip) 执行: $command"
if [ "$ip" = "$LOCAL_IP" ] || [ "$hostname" = "master" ]; then
bash -lc "$command"
else
ssh $SSH_OPTS $SSH_ID ubuntu@$ip "$command"
fi
done
echo ""
}
# 函数:传输文件到所有节点
copy_to_all_nodes() {
local file="$1"
echo "==== 传输文件 $file 到所有节点 ===="
for node in "${NODES[@]}"; do
IFS=':' read -r ip hostname <<< "$node"
echo "传输到 $hostname ($ip)"
if [ "$ip" = "$LOCAL_IP" ] || [ "$hostname" = "master" ]; then
cp -f "$file" ~/
else
scp $SSH_OPTS $SSH_ID "$file" ubuntu@$ip:~/
fi
done
echo ""
}
# 创建环境准备脚本
cat > k8s-prepare-env.sh << 'EOF_OUTER'
#!/bin/bash
set -e
echo "==== Kubernetes 环境准备 ===="
# 1. 更新系统包
echo "更新系统包..."
sudo apt update && sudo apt upgrade -y
# 2. 安装必要的工具
echo "安装必要工具..."
sudo apt install -y curl wget gnupg lsb-release ca-certificates apt-transport-https software-properties-common
# 3. 禁用 swap
echo "禁用 swap..."
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 4. 配置内核参数
echo "配置内核参数..."
cat <<EOF_MODULES | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF_MODULES
sudo modprobe overlay
sudo modprobe br_netfilter
# 5. 配置 sysctl 参数
echo "配置 sysctl 参数..."
cat <<EOF_SYSCTL | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF_SYSCTL
sudo sysctl --system
# 6. 配置防火墙
echo "配置防火墙..."
sudo ufw --force disable || true
# 按你的要求,不在节点上修改 /etc/hosts
echo "==== 环境准备完成 ===="
echo "当前主机名: $(hostname)"
echo "当前 IP: $(ip route get 1 | awk '{print $7; exit}')"
echo "Swap 状态: $(swapon --show | wc -l) 个 swap 分区"
EOF_OUTER
chmod +x k8s-prepare-env.sh
copy_to_all_nodes k8s-prepare-env.sh
execute_on_all_nodes "./k8s-prepare-env.sh" "环境准备"
echo "==== 环境准备完成 ===="