本文将手把手带你在一台物理机上用虚拟机搭建一个三节点 Kubernetes 集群。完成后你将拥有一个可运行生产负载的 K8s 环境。
1. 环境准备
1.1 节点规划
| 角色 | 主机名 | IP 地址 | 配置 |
|---|---|---|---|
| Master | k8s-master | 192.168.1.101 | 2C4G |
| Worker 1 | k8s-worker1 | 192.168.1.102 | 2C4G |
| Worker 2 | k8s-worker2 | 192.168.1.103 | 2C4G |
1.2 操作系统要求
- Ubuntu 22.04 LTS(推荐)或 20.04 LTS
- 最低 2 核 CPU / 4GB 内存(Master 节点)
- 每个节点固定的内网 IP
- 节点互通且能访问外网(拉取镜像)
2. 所有节点执行 — 基础环境配置
2.1 关闭 Swap
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
Kubelet 要求必须关闭 Swap,否则集群初始化会失败。
2.2 配置内核参数
cat <
2.3 配置 /etc/hosts
cat <
3. 所有节点执行 — 安装容器运行时 (containerd)
# 安装依赖
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg
# 添加 Docker 官方 GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
# 安装 containerd
sudo apt update
sudo apt install -y containerd.io
# 生成默认配置并修改
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改 SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
4. 所有节点执行 — 安装 kubeadm、kubelet、kubectl
# 添加 Kubernetes APT 仓库
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -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:/v1.30/deb//' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装组件
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
5. Master 节点 — 初始化集群
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.1.101 \
--cri-socket=unix:///run/containerd/containerd.sock
初始化成功后,保存输出的 kubeadm join 命令,后续 Worker 节点要用。
5.1 配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6. 安装网络插件 (Flannel)
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
等待所有 Pod 运行正常:
kubectl get pods -n kube-system
kubectl get nodes
7. Worker 节点 — 加入集群
在每台 Worker 上执行 kubeadm init 时输出的 join 命令:
sudo kubeadm join 192.168.1.101:6443 --token <换出来的token> \
--discovery-token-ca-cert-hash sha256:<换出来的hash>
Token 默认 24 小时过期。若已过期,在 Master 上执行 kubeadm token create --print-join-command 生成新的。
8. 验证集群
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# k8s-master Ready control-plane 5m v1.30.x
# k8s-worker1 Ready 2m v1.30.x
# k8s-worker2 Ready 2m v1.30.x
kubectl get pods -A
# 所有 Pod 应为 Running 或 Completed 状态
9. 常见问题排查
| 现象 | 原因 | 解决方案 |
|---|---|---|
| 节点 NotReady | 网络插件未安装或异常 | 检查 flannel Pod 日志:kubectl logs -n kube-system -l app=flannel |
| kubeadm init 超时 | 镜像拉不到或网络不通 | 检查/etc/hosts 和防火墙配置 |
| Pod CrashLoopBackOff | 资源不足或配置错误 | kubectl describe pod 查看事件 |
| kubectl 连接拒绝 | admin.conf 未配置 | 重新执行步骤 5.1 |