| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #!/usr/bin/env bash
- set -euo pipefail
- K8S_MINOR="${K8S_MINOR:-v1.31}"
- POD_CIDR="${POD_CIDR:-192.168.0.0/16}"
- CALICO_VERSION="${CALICO_VERSION:-v3.27.0}"
- if [[ "${EUID}" -eq 0 ]]; then
- SUDO=""
- TARGET_USER="${SUDO_USER:-root}"
- else
- SUDO="sudo"
- TARGET_USER="${SUDO_USER:-$USER}"
- fi
- TARGET_HOME="$(getent passwd "${TARGET_USER}" | cut -d: -f6)"
- [[ -n "${TARGET_HOME}" ]] || { echo "无法获取用户 ${TARGET_USER} 的 home"; exit 1; }
- echo "[1/7] 关闭 swap"
- ${SUDO} swapoff -a || true
- ${SUDO} sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab || true
- echo "[2/7] 配置内核参数"
- cat <<'EOF' | ${SUDO} tee /etc/modules-load.d/k8s.conf >/dev/null
- overlay
- br_netfilter
- EOF
- ${SUDO} modprobe overlay || true
- ${SUDO} modprobe br_netfilter || true
- cat <<'EOF' | ${SUDO} tee /etc/sysctl.d/k8s.conf >/dev/null
- net.bridge.bridge-nf-call-iptables = 1
- net.bridge.bridge-nf-call-ip6tables = 1
- net.ipv4.ip_forward = 1
- EOF
- ${SUDO} sysctl --system >/dev/null || true
- echo "[3/7] 安装并配置 containerd"
- ${SUDO} apt-get update -y
- if ! command -v containerd >/dev/null 2>&1; then
- # 优先 containerd.io(避免与 docker-ce 冲突),失败再回退 containerd
- ${SUDO} apt-get install -y containerd.io || ${SUDO} apt-get install -y containerd
- fi
- ${SUDO} mkdir -p /etc/containerd
- containerd config default | ${SUDO} tee /etc/containerd/config.toml >/dev/null
- ${SUDO} sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
- ${SUDO} systemctl restart containerd
- ${SUDO} systemctl enable containerd >/dev/null
- echo "[4/7] 安装 kubeadm/kubelet/kubectl (${K8S_MINOR})"
- ${SUDO} mkdir -p /etc/apt/keyrings
- curl -fsSL "https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/deb/Release.key" \
- | ${SUDO} gpg --dearmor --batch --yes -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
- echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${K8S_MINOR}/deb/ /" \
- | ${SUDO} tee /etc/apt/sources.list.d/kubernetes.list >/dev/null
- ${SUDO} apt-get update -y
- ${SUDO} apt-get install -y kubelet kubeadm kubectl
- ${SUDO} apt-mark hold kubelet kubeadm kubectl >/dev/null
- ${SUDO} systemctl enable --now kubelet >/dev/null
- echo "[5/7] 初始化控制平面"
- if [[ ! -f /etc/kubernetes/admin.conf ]]; then
- ${SUDO} kubeadm init --pod-network-cidr="${POD_CIDR}"
- else
- echo "已检测到 /etc/kubernetes/admin.conf,跳过 kubeadm init"
- fi
- echo "[6/7] 配置 kubeconfig"
- ${SUDO} mkdir -p "${TARGET_HOME}/.kube"
- ${SUDO} cp -f /etc/kubernetes/admin.conf "${TARGET_HOME}/.kube/config"
- ${SUDO} chown -R "${TARGET_USER}:${TARGET_USER}" "${TARGET_HOME}/.kube"
- export KUBECONFIG="${TARGET_HOME}/.kube/config"
- echo "[7/7] 安装 CNI(Calico ${CALICO_VERSION})"
- kubectl apply -f "https://raw.githubusercontent.com/projectcalico/calico/${CALICO_VERSION}/manifests/calico.yaml"
- # 单机模式允许业务 Pod 调度到控制平面
- kubectl taint nodes --all node-role.kubernetes.io/control-plane- >/dev/null 2>&1 || true
- kubectl taint nodes --all node-role.kubernetes.io/master- >/dev/null 2>&1 || true
- kubectl get nodes -o wide
- echo
- echo "K8s 控制平面安装完成。"
- echo "当前 kubeconfig: ${KUBECONFIG}"
|