Kubernetes学习指北之多节点集群(Multi Node Cluster)

一、 多节点集群(Multi Node Cluster)说明

真实生产环境的缩影,可以模拟调度、高可用、跨节点通信

特点

  • Master 节点负责管理集群

    • 多个 Worker 节点运行实际应用 Pod

    • Master 负责调度、管理和监控

  • 高可用性可扩展

    • 可以增加 Worker 节点提升容量

    • Master 可做 HA(高可用)部署

  • 真实调度场景

    • Kubernetes 会根据资源和策略,将 Pod 调度到不同节点
  • 网络复杂

    • Pod 网络跨节点,需要 CNI 插件(Flannel、Calico 等)支持

适用场景

  • 生产环境部署微服务

  • 测试调度策略、Pod 分布、Service 负载均衡

  • 实战演练集群管理和高可用

优点

  • 模拟真实生产环境

  • 可以横向扩展容器数量

  • Master 故障可配置高可用

缺点

  • 配置复杂,需要多台虚拟机或服务器

  • 网络和存储管理比单节点复杂

  • 资源占用高

二、 准备环境和工具

这里使用centos7环境 说明

sudo -i 建议用root账号操作

台节点都需要执行的操作,包括 master 和 worker:系统初始化、安装和配置容器运行时(containerd)、镜像源替换等操作

这里不再赘述,参照另一篇:Kubernetes学习指北之单节点集群

三、节点准备

每台节点上安装:

# 安装 kubeadm、kubelet、kubectl
yum install -y kubelet kubeadm kubectl

# 启动 kubelet
systemctl enable --now kubelet

# 关闭 swap(K8s 要求)
swapoff -a
sed -i '/swap/d' /etc/fstab

# 配置 sysctl
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

四、初始化控制平面节点(master)

master机器执行:

kubeadm init \
  --apiserver-advertise-address=192.168.56.10 \
  --pod-network-cidr=10.244.0.0/16 \
  --image-repository=registry.aliyuncs.com/google_containers

注意:

  • –pod-network-cidr 要与 Flannel 网络一致(默认 10.244.0.0/16)。

  • 初始化成功后 kubeadm 会输出 kubeadm join … 命令,用于 worker 节点加入集群。

初始化完成后:

# 配置 kubectl 使用
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

五、部署网络插件(Flannel)

master 节点

kubectl apply -f kube-flannel.yml

# 确保 Flannel Pod 运行:
kubectl get pods -n kube-flannel -w

六、worker 节点加入集群

在每个 worker 节点执行 kubeadm join(master 初始化后得到的命令):

kubeadm join 192.168.56.10:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

加入成功后,在 master 上查看节点:

kubectl get nodes

输出类似:

NAME          STATUS   ROLES           AGE
k8s-master    Ready    control-plane   5m
k8s-worker1   Ready    <none>          1m
k8s-worker2   Ready    <none>          1m

七、模拟部署应用

  • 多节点和单节点大部分 YAML 文件是可以共用的,根据用途和部署对象调整。一般可能需要修改 副本数(replicas)、节点选择器、存储卷(Storage:)

    • 副本数
      • 单机一般 replicas: 1
      • 多节点可以 replicas: 2 或更多,实现负载均衡
    • NodeSelector / Tolerations
      • 如果某些 Pod 只能跑在特定节点,需要加 nodeSelector 或 tolerations
    • Storage
      • 单机可以用 hostPath
      • 多节点建议用 PV+PVC,保证跨节点数据持久化
  • 在多节点集群中,Deployment 会根据调度策略自动把 Pod 分配到 worker 节点。

  • 部署示例:

# 部署
kubectl create namespace demo

kubectl apply -f laravel-deployment.yaml -n demo
kubectl apply -f laravel-service.yaml -n demo

# 查看 Pod 分布:
kubectl get pods -n demo -o wide

会看到 Pod 分布在不同的节点上。


使用虚拟机说明

Vagrantfile 多节点集群示例

Vagrant.configure("2") do |config|
  config.vm.box = "generic/centos7"

  # k8s 多节点集群
  # Master
  config.vm.define "master" do |master|
    master.vm.hostname = "k8s-master"
    master.vm.network "private_network", ip: "192.168.56.10"
    master.vm.provider "virtualbox" do |vb|
      vb.memory = 2048
      vb.cpus = 2
      vb.name = "vagrant-k8s-master"
    end
  end

  # Node1
  config.vm.define "node1" do |node|
    node.vm.hostname = "k8s-worker1"
    node.vm.network "private_network", ip: "192.168.56.11"
    node.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
      vb.cpus = 1
      vb.name = "vagrant-k8s-node1"
    end
  end

  # Node2 可选
  config.vm.define "node2" do |node|
    node.vm.hostname = "k8s-worker2"
    node.vm.network "private_network", ip: "192.168.56.12"
    node.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
      vb.cpus = 1
      vb.name = "vagrant-k8s-node2"
    end
  end
end

vagrant 命令

vagrant up

vagrant status k8s-single

vagrant ssh k8s-master -- -F NUL

vagrant halt k8s-master
# 删除虚拟机
vagrant destroy k8s-master

vagrant up 成功后环境如:

节点名称IP角色
k8s-master192.168.56.10control-plane
k8s-worker1192.168.56.11worker
k8s-worker2192.168.56.12worker

说明:

  • 控制平面节点负责 API Server、Scheduler、Controller Manager。

  • Worker 节点运行应用 Pod。

  • 所有节点通过 Flannel 或 Calico 网络插件互通。

  • 模拟场景可使用 Vagrant+VirtualBox 或多台物理机/VM。