Files
devstar/docs/kubernetes/k8s-step3-install-components.sh

150 lines
4.2 KiB
Bash
Raw Normal View History

#!/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 组件安装完成 ===="