1. 项目背景与核心价值
三节点Kubernetes集群是生产环境中最常见的部署架构之一,它完美平衡了高可用性和资源消耗。相比单节点开发环境,三节点配置能够实现:
- 控制平面组件(API Server、Controller Manager、Scheduler)的冗余部署
- etcd集群的奇数节点仲裁机制
- 工作负载的跨节点调度容灾
而使用Kind(Kubernetes in Docker)搭建这种集群,则是一种轻量级的本地开发测试方案。它通过容器化控制平面组件,实现了:
- 快速启动和销毁集群(秒级操作)
- 不依赖虚拟机或云资源
- 完美复刻多节点拓扑结构
我在实际工作中发现,这种方案特别适合以下场景:
- CI/CD流水线中的集成测试
- 新版本K8s的功能验证
- 应用部署编排的演练环境
2. 环境准备与工具链
2.1 基础软件要求
确保宿主机已安装:
- Docker 20.10+(需支持cgroup v2)
- kubectl 1.24+(匹配目标K8s版本)
- kind v0.17+(新版本对多节点支持更好)
验证命令:
bash复制docker --version
kubectl version --client
kind version
2.2 网络规划建议
虽然Kind默认使用docker网络,但建议提前规划:
- 节点间通信:172.18.0.0/16
- Service CIDR:10.96.0.0/12
- Pod CIDR:10.244.0.0/16
注意:生产环境需确保这些网段不与现有网络冲突
3. 集群配置文件详解
创建kind-cluster.yaml配置文件:
yaml复制kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 6443
hostPort: 16443
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
networking:
disableDefaultCNI: true
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
关键配置说明:
- 三个control-plane节点构成高可用控制平面
- 三个worker节点用于运行工作负载
- 6443端口映射方便外部kubectl访问
- 禁用默认CNI以便安装Calico等插件
4. 集群创建与验证
4.1 启动集群
bash复制kind create cluster --config kind-cluster.yaml --name three-node-cluster
4.2 检查节点状态
bash复制kubectl get nodes -o wide
预期输出应显示6个节点(3个control-plane,3个worker),状态均为Ready。
4.3 验证高可用
bash复制# 查看etcd成员
kubectl -n kube-system exec etcd-three-node-cluster-control-plane -- \
etcdctl member list --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
5. 网络插件安装
由于禁用了默认CNI,需要手动安装网络插件:
bash复制kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
验证网络健康:
bash复制kubectl -n kube-system rollout status daemonset/calico-node
6. 生产级调优建议
6.1 资源分配
修改kind配置增加资源限制:
yaml复制nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: JoinConfiguration
nodeRegistration:
kubeletExtraArgs:
system-reserved: "cpu=500m,memory=500Mi"
kube-reserved: "cpu=500m,memory=500Mi"
6.2 持久化存储
挂载主机目录作为持久卷:
yaml复制nodes:
- role: worker
extraMounts:
- hostPath: /mnt/data
containerPath: /data
7. 典型问题排查
7.1 节点NotReady
常见原因:
-
网络插件未正确安装
bash复制
kubectl describe node <node-name>查看Conditions中的NetworkUnavailable
-
镜像拉取失败
bash复制
journalctl -u kubelet -n 100
7.2 etcd选举问题
当control-plane节点异常时:
bash复制kubectl -n kube-system logs etcd-three-node-cluster-control-plane2
检查是否有"leader changed"相关日志
8. 高级使用技巧
8.1 负载均衡模拟
使用MetalLB模拟LoadBalancer:
bash复制kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
8.2 集群快照
导出集群状态:
bash复制kind export kubeconfig --name three-node-cluster
kubectl get all -A -o yaml > cluster-snapshot.yaml
实际使用中发现,这种三节点集群可以完美模拟以下生产场景:
- 滚动更新时的pod迁移
- 节点故障时的自愈过程
- 控制平面组件的leader选举
- 网络策略的跨节点测试