1. 项目概述
最近在折腾Kubernetes集群搭建,发现用Kind(Kubernetes in Docker)来构建本地开发环境简直不要太方便。今天就来分享一个实战案例:如何用Kind快速搭建一个三节点的K8s集群。这个方案特别适合开发测试场景,5分钟就能拉起一个完整的集群,而且资源占用极低,在我的MacBook Pro上跑起来毫无压力。
Kind不同于Minikube等工具,它直接使用Docker容器作为Kubernetes节点,不需要虚拟机,启动速度快,配置简单。三节点配置(1个master+2个worker)可以模拟真实生产环境,方便测试部署策略、服务发现等特性。下面我会详细拆解整个搭建过程,包括你可能遇到的坑和优化技巧。
2. 环境准备与工具安装
2.1 基础环境要求
首先确保你的开发机满足以下条件:
- 64位操作系统(Linux/macOS/Windows WSL2)
- 已安装Docker引擎(建议20.10+版本)
- 至少4GB可用内存(三节点建议8GB+)
- 磁盘空间10GB以上
注意:Windows用户强烈建议使用WSL2环境,原生Docker Desktop对多容器支持不够稳定。我在Windows 11 + WSL2 Ubuntu 20.04环境下测试通过。
2.2 安装Kind和kubectl
bash复制# 安装Kind(Mac/Linux)
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/
# 安装kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
验证安装:
bash复制kind version
kubectl version --client
3. 集群配置文件详解
3.1 三节点集群配置
创建kind-config.yaml文件:
yaml复制kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 80
protocol: TCP
- role: worker
- role: worker
关键配置说明:
extraPortMappings:将容器端口30000映射到主机80端口,方便后续Ingress测试- 默认每个节点使用最新K8s版本,如需指定版本可添加
image: kindest/node:v1.24.0
3.2 高级网络配置
如果需要自定义网络(比如Calico CNI),可以这样扩展配置:
yaml复制networking:
disableDefaultCNI: true
podSubnet: "192.168.0.0/16"
4. 集群创建与验证
4.1 创建集群
bash复制kind create cluster --name three-node-cluster --config kind-config.yaml
创建过程大约需要2-5分钟,取决于网络速度。成功后会输出类似信息:
code复制Creating cluster "three-node-cluster" ...
✓ Ensuring node image (kindest/node:v1.24.0) 🖼
✓ Preparing nodes 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-three-node-cluster"
4.2 验证集群状态
bash复制kubectl cluster-info
kubectl get nodes -o wide
正常应该看到3个节点(1个control-plane,2个worker),状态均为Ready:
code复制NAME STATUS ROLES AGE VERSION
three-node-cluster-control-plane Ready control-plane 2m v1.24.0
three-node-cluster-worker Ready <none> 2m v1.24.0
three-node-cluster-worker2 Ready <none> 2m v1.24.0
5. 集群操作实战
5.1 部署测试应用
创建一个nginx deployment和服务:
yaml复制apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30000
selector:
app: nginx
应用配置:
bash复制kubectl apply -f nginx.yaml
5.2 访问服务
由于我们在kind-config.yaml中配置了端口映射,现在可以直接通过主机IP访问:
bash复制curl http://localhost
或者在集群内部通过服务名访问:
bash复制kubectl run -it --rm --image=curlimages/curl curl -- sh
curl http://nginx
exit
6. 常见问题排查
6.1 节点NotReady问题
如果节点状态不是Ready,通常原因有:
- 镜像拉取失败:尝试
docker pull kindest/node:v1.24.0 - 资源不足:检查内存是否足够,建议
docker system prune清理资源 - CNI插件问题:尝试重新安装
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
6.2 端口映射失效
如果主机端口无法访问:
- 检查kind-config.yaml的extraPortMappings配置
- 确认服务类型为NodePort且nodePort匹配
- 查看docker ps确认端口映射正确:
bash复制docker ps --format "table {{.Names}}\t{{.Ports}}"
7. 性能优化技巧
7.1 镜像预加载
Kind支持在创建集群时预加载镜像,大幅加快后续部署速度:
bash复制kind load docker-image nginx:alpine --name three-node-cluster
7.2 资源限制调整
默认每个节点使用2CPU和4GB内存,可以通过docker配置调整:
yaml复制nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: JoinConfiguration
nodeRegistration:
kubeletExtraArgs:
system-reserved: "cpu=500m,memory=500Mi"
kube-reserved: "cpu=500m,memory=500Mi"
7.3 持久化存储配置
默认情况下Kind使用emptyDir,重启后数据会丢失。可以配置hostPath持久化:
yaml复制nodes:
- role: control-plane
extraMounts:
- hostPath: /path/on/host
containerPath: /data
8. 集群管理与维护
8.1 快速删除集群
bash复制kind delete cluster --name three-node-cluster
8.2 导出集群配置
bash复制kind export kubeconfig --name three-node-cluster
8.3 多集群管理
可以同时创建多个集群,通过--name区分:
bash复制kind create cluster --name dev-cluster
kind create cluster --name test-cluster
kubectl config use-context kind-dev-cluster
9. 生产环境注意事项
虽然Kind非常适合开发和测试,但在生产环境使用时需要注意:
- 数据持久化:默认配置下数据不会持久化,需要额外配置
- 高可用:Kind不提供真正的HA控制平面
- 性能:Docker容器性能与物理机/VM有差异
- 网络:某些网络插件可能需要额外配置
对于生产环境,建议考虑使用kubeadm、kops或托管K8s服务。