install-k8s-control-plane.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. K8S_MINOR="${K8S_MINOR:-v1.31}"
  4. POD_CIDR="${POD_CIDR:-192.168.0.0/16}"
  5. CALICO_VERSION="${CALICO_VERSION:-v3.27.0}"
  6. if [[ "${EUID}" -eq 0 ]]; then
  7. SUDO=""
  8. TARGET_USER="${SUDO_USER:-root}"
  9. else
  10. SUDO="sudo"
  11. TARGET_USER="${SUDO_USER:-$USER}"
  12. fi
  13. TARGET_HOME="$(getent passwd "${TARGET_USER}" | cut -d: -f6)"
  14. [[ -n "${TARGET_HOME}" ]] || { echo "无法获取用户 ${TARGET_USER} 的 home"; exit 1; }
  15. echo "[1/7] 关闭 swap"
  16. ${SUDO} swapoff -a || true
  17. ${SUDO} sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab || true
  18. echo "[2/7] 配置内核参数"
  19. cat <<'EOF' | ${SUDO} tee /etc/modules-load.d/k8s.conf >/dev/null
  20. overlay
  21. br_netfilter
  22. EOF
  23. ${SUDO} modprobe overlay || true
  24. ${SUDO} modprobe br_netfilter || true
  25. cat <<'EOF' | ${SUDO} tee /etc/sysctl.d/k8s.conf >/dev/null
  26. net.bridge.bridge-nf-call-iptables = 1
  27. net.bridge.bridge-nf-call-ip6tables = 1
  28. net.ipv4.ip_forward = 1
  29. EOF
  30. ${SUDO} sysctl --system >/dev/null || true
  31. echo "[3/7] 安装并配置 containerd"
  32. ${SUDO} apt-get update -y
  33. if ! command -v containerd >/dev/null 2>&1; then
  34. # 优先 containerd.io(避免与 docker-ce 冲突),失败再回退 containerd
  35. ${SUDO} apt-get install -y containerd.io || ${SUDO} apt-get install -y containerd
  36. fi
  37. ${SUDO} mkdir -p /etc/containerd
  38. containerd config default | ${SUDO} tee /etc/containerd/config.toml >/dev/null
  39. ${SUDO} sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
  40. ${SUDO} systemctl restart containerd
  41. ${SUDO} systemctl enable containerd >/dev/null
  42. echo "[4/7] 安装 kubeadm/kubelet/kubectl (${K8S_MINOR})"
  43. ${SUDO} mkdir -p /etc/apt/keyrings
  44. curl -fsSL "https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/deb/Release.key" \
  45. | ${SUDO} gpg --dearmor --batch --yes -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  46. echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/deb/ /" \
  47. | ${SUDO} tee /etc/apt/sources.list.d/kubernetes.list >/dev/null
  48. ${SUDO} apt-get update -y
  49. ${SUDO} apt-get install -y kubelet kubeadm kubectl
  50. ${SUDO} apt-mark hold kubelet kubeadm kubectl >/dev/null
  51. ${SUDO} systemctl enable --now kubelet >/dev/null
  52. echo "[5/7] 初始化控制平面"
  53. if [[ ! -f /etc/kubernetes/admin.conf ]]; then
  54. ${SUDO} kubeadm init --pod-network-cidr="${POD_CIDR}"
  55. else
  56. echo "已检测到 /etc/kubernetes/admin.conf,跳过 kubeadm init"
  57. fi
  58. echo "[6/7] 配置 kubeconfig"
  59. ${SUDO} mkdir -p "${TARGET_HOME}/.kube"
  60. ${SUDO} cp -f /etc/kubernetes/admin.conf "${TARGET_HOME}/.kube/config"
  61. ${SUDO} chown -R "${TARGET_USER}:${TARGET_USER}" "${TARGET_HOME}/.kube"
  62. export KUBECONFIG="${TARGET_HOME}/.kube/config"
  63. echo "[7/7] 安装 CNI(Calico ${CALICO_VERSION})"
  64. kubectl apply -f "https://raw.githubusercontent.com/projectcalico/calico/${CALICO_VERSION}/manifests/calico.yaml"
  65. # 单机模式允许业务 Pod 调度到控制平面
  66. kubectl taint nodes --all node-role.kubernetes.io/control-plane- >/dev/null 2>&1 || true
  67. kubectl taint nodes --all node-role.kubernetes.io/master- >/dev/null 2>&1 || true
  68. kubectl get nodes -o wide
  69. echo
  70. echo "K8s 控制平面安装完成。"
  71. echo "当前 kubeconfig: ${KUBECONFIG}"