150 lines
4.2 KiB
Bash
150 lines
4.2 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
set -e
|
||
|
|
|
||
|
|
# Kubernetes 组件安装脚本
|
||
|
|
# 功能: 在所有节点安装 kubelet, kubeadm, kubectl
|
||
|
|
|
||
|
|
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 ""
|
||
|
|
}
|
||
|
|
|
||
|
|
# 创建 Kubernetes 组件安装脚本
|
||
|
|
cat > k8s-install-components.sh << 'EOF_OUTER'
|
||
|
|
#!/bin/bash
|
||
|
|
set -e
|
||
|
|
|
||
|
|
echo "==== 安装 Kubernetes 组件 ===="
|
||
|
|
|
||
|
|
# 1. 添加 Kubernetes 仓库
|
||
|
|
echo "添加 Kubernetes 仓库 (pkgs.k8s.io v1.32)..."
|
||
|
|
# 确保 keyrings 目录存在并可读
|
||
|
|
sudo install -m 0755 -d /etc/apt/keyrings
|
||
|
|
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
||
|
|
sudo chmod a+r /etc/apt/keyrings/kubernetes-apt-keyring.gpg
|
||
|
|
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 >/dev/null
|
||
|
|
|
||
|
|
# 2. 更新包列表
|
||
|
|
echo "更新包列表..."
|
||
|
|
sudo apt update
|
||
|
|
|
||
|
|
# 3. 安装 Kubernetes 组件(使用 v1.32 通道的最新补丁版本)
|
||
|
|
echo "安装 Kubernetes 组件..."
|
||
|
|
sudo apt install -y kubelet kubeadm kubectl
|
||
|
|
|
||
|
|
# 4. 锁定版本防止自动更新
|
||
|
|
echo "锁定 Kubernetes 版本..."
|
||
|
|
sudo apt-mark hold kubelet kubeadm kubectl
|
||
|
|
|
||
|
|
# 5. 配置 kubelet
|
||
|
|
echo "配置 kubelet..."
|
||
|
|
sudo mkdir -p /var/lib/kubelet
|
||
|
|
cat <<EOF_KUBELET | sudo tee /var/lib/kubelet/config.yaml
|
||
|
|
apiVersion: kubelet.config.k8s.io/v1beta1
|
||
|
|
kind: KubeletConfiguration
|
||
|
|
authentication:
|
||
|
|
anonymous:
|
||
|
|
enabled: false
|
||
|
|
webhook:
|
||
|
|
enabled: true
|
||
|
|
x509:
|
||
|
|
clientCAFile: /etc/kubernetes/pki/ca.crt
|
||
|
|
authorization:
|
||
|
|
mode: Webhook
|
||
|
|
clusterDomain: cluster.local
|
||
|
|
clusterDNS:
|
||
|
|
- 10.96.0.10
|
||
|
|
containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock
|
||
|
|
cgroupDriver: systemd
|
||
|
|
failSwapOn: false
|
||
|
|
hairpinMode: promiscuous-bridge
|
||
|
|
healthzBindAddress: 127.0.0.1
|
||
|
|
healthzPort: 10248
|
||
|
|
httpCheckFrequency: 20s
|
||
|
|
imageMinimumGCAge: 2m0s
|
||
|
|
imageGCHighThresholdPercent: 85
|
||
|
|
imageGCLowThresholdPercent: 80
|
||
|
|
iptablesDropBit: 15
|
||
|
|
iptablesMasqueradeBit: 15
|
||
|
|
kubeAPIBurst: 10
|
||
|
|
kubeAPIQPS: 5
|
||
|
|
makeIPTablesUtilChains: true
|
||
|
|
maxOpenFiles: 1000000
|
||
|
|
maxPods: 110
|
||
|
|
nodeStatusUpdateFrequency: 10s
|
||
|
|
oomScoreAdj: -999
|
||
|
|
podCIDR: 10.244.0.0/16
|
||
|
|
registryBurst: 10
|
||
|
|
registryPullQPS: 5
|
||
|
|
resolvConf: /etc/resolv.conf
|
||
|
|
rotateCertificates: true
|
||
|
|
runtimeRequestTimeout: 2m0s
|
||
|
|
serializeImagePulls: true
|
||
|
|
serverTLSBootstrap: true
|
||
|
|
streamingConnectionIdleTimeout: 4h0m0s
|
||
|
|
syncFrequency: 1m0s
|
||
|
|
volumeStatsAggPeriod: 1m0s
|
||
|
|
EOF_KUBELET
|
||
|
|
|
||
|
|
# 6. 启动 kubelet
|
||
|
|
echo "启动 kubelet..."
|
||
|
|
sudo systemctl daemon-reload
|
||
|
|
sudo systemctl enable kubelet
|
||
|
|
sudo systemctl start kubelet
|
||
|
|
|
||
|
|
# 7. 验证安装
|
||
|
|
echo "==== 验证 Kubernetes 组件安装 ===="
|
||
|
|
kubelet --version
|
||
|
|
kubeadm version
|
||
|
|
kubectl version --client
|
||
|
|
|
||
|
|
echo "==== Kubernetes 组件安装完成 ===="
|
||
|
|
EOF_OUTER
|
||
|
|
|
||
|
|
chmod +x k8s-install-components.sh
|
||
|
|
copy_to_all_nodes k8s-install-components.sh
|
||
|
|
execute_on_all_nodes "./k8s-install-components.sh" "安装 Kubernetes 组件"
|
||
|
|
|
||
|
|
echo "==== Kubernetes 组件安装完成 ===="
|