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-master | 192.168.56.10 | control-plane |
| k8s-worker1 | 192.168.56.11 | worker |
| k8s-worker2 | 192.168.56.12 | worker |
说明:
控制平面节点负责 API Server、Scheduler、Controller Manager。
Worker 节点运行应用 Pod。
所有节点通过 Flannel 或 Calico 网络插件互通。
模拟场景可使用 Vagrant+VirtualBox 或多台物理机/VM。