本文将手把手带你在一台物理机上用虚拟机搭建一个三节点 Kubernetes 集群。完成后你将拥有一个可运行生产负载的 K8s 环境。

1. 环境准备

1.1 节点规划

角色主机名IP 地址配置
Masterk8s-master192.168.1.1012C4G
Worker 1k8s-worker1192.168.1.1022C4G
Worker 2k8s-worker2192.168.1.1032C4G

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

10. 后续步骤