Files
devstar/docs/kubernetes/install-kubectl-nodes.sh

99 lines
2.8 KiB
Bash
Raw Normal View History

#!/bin/bash
set -e
# 为 node1 和 node2 安装 kubectl 脚本
# 功能: 从 master 传输 kubectl 二进制文件到其他节点
echo "==== 为 node1 和 node2 安装 kubectl ===="
# 定义节点列表
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_node() {
local ip="$1"
local hostname="$2"
local command="$3"
local description="$4"
echo "==== $description on $hostname ($ip) ===="
if [ "$ip" = "$LOCAL_IP" ] || [ "$hostname" = "master" ]; then
bash -lc "$command"
else
ssh $SSH_OPTS $SSH_ID ubuntu@$ip "$command"
fi
echo ""
}
# 函数:传输文件到指定节点
copy_to_node() {
local ip="$1"
local hostname="$2"
local file="$3"
echo "传输 $file$hostname ($ip)"
if [ "$ip" = "$LOCAL_IP" ] || [ "$hostname" = "master" ]; then
cp -f "$file" ~/
else
scp $SSH_OPTS $SSH_ID "$file" ubuntu@$ip:~/
fi
}
# 创建 kubectl 安装脚本
cat > kubectl-install.sh << 'EOF_INSTALL'
#!/bin/bash
set -e
echo "==== 安装 kubectl ===="
# 1. 检查是否已安装
if command -v kubectl &> /dev/null; then
echo "kubectl 已安装,版本: $(kubectl version --client 2>/dev/null | grep 'Client Version' || echo 'unknown')"
echo "跳过安装"
exit 0
fi
# 2. 安装 kubectl
echo "安装 kubectl..."
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl
# 添加 Kubernetes 官方 GPG key
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 添加 Kubernetes apt 仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新包列表并安装 kubectl
sudo apt update
sudo apt install -y kubectl
# 3. 验证安装
echo "验证 kubectl 安装..."
kubectl version --client
echo "==== kubectl 安装完成 ===="
EOF_INSTALL
chmod +x kubectl-install.sh
# 为 node1 和 node2 安装 kubectl
for node in "${NODES[@]}"; do
IFS=':' read -r ip hostname <<< "$node"
if [ "$hostname" != "master" ]; then
copy_to_node "$ip" "$hostname" "kubectl-install.sh"
execute_on_node "$ip" "$hostname" "./kubectl-install.sh" "安装 kubectl"
fi
done
# 清理临时文件
rm -f kubectl-install.sh
echo "==== 所有节点 kubectl 安装完成 ===="