讲解
kind(Kubernetes IN Docker)用最少的资源在本机跑一个真实集群:它把每个 Kubernetes 节点做成一个 Docker 容器,控制平面组件跑在容器里,对 kubectl 暴露标准 API。因为节点就是容器,创建和删除整个集群都是秒级到分钟级操作,玩坏了删掉重来零成本——这是它成为 Kubernetes 官方推荐的本地学习/测试工具的原因。同类工具还有 minikube(跑在虚拟机或容器里,功能全)、k3d(基于轻量发行版 k3s,启动更快),三者的 kubectl 体验完全一致。
kind 的基本命令极少:kind create cluster 建集群(--name 起名,--image 指定节点镜像,默认镜像与 kind 版本配套),kind get clusters 列出集群,kind delete cluster 拆除,kind get kubeconfig 导出配置。建集群时 kind 会自动把集群证书和地址写进 kubeconfig 并切换 context,之后 kubectl 就直接可用。一个实用细节是端口映射:Docker 容器里的端口默认不暴露到宿主机,想在浏览器或 curl 里访问集群里的 NodePort 服务,需要在建集群的配置文件里用 extraPortMappings 声明「宿主机端口 → 节点容器端口」的映射,这一步只能在创建时指定,事后补不了。
kind 集群不是玩具:它跑的是完整的 Kubernetes 代码,API 行为和云上托管集群(ACK、EKS、GKE)一致。差异主要在环境:默认单节点(没有多节点调度行为)、没有云厂商的 LoadBalancer 实现(LoadBalancer 类型 Service 会一直 pending,学习时用 NodePort 或 port-forward 代替)、存储用本地 provisioner(kind 自带 rancher.io/local-path,PVC 开箱即用)。知道这三点差异,本地学到的技能可以平移到任何真实集群。
示例
本教程的验证脚本已经用 kind 建好了集群 ohmydocs-verify,先看它的版本与集群列表:
kind version
kind get clusters
节点其实是 Docker 容器——一边是 Kubernetes 视角的节点列表,一边是 Docker 视角的「节点容器」:
kubectl get nodes -o wide
docker ps --filter name=ohmydocs-verify-control-plane --format '节点容器: {{.Names}} 镜像: {{.Image}} 状态: {{.Status}}'
自己动手时的建删命令(验证脚本独占 ohmydocs-verify 这个集群名,此处只看不执行):
# 仅示意:自己练习时创建/删除独立集群的命令(本脚本已占用 ohmydocs-verify 集群)
kind create cluster --name my-lab
kind delete cluster --name my-lab
创建带端口映射的集群需要一份配置文件,本教程集群实际使用的就是下面这份(宿主机 30080/30081/30443 映射到节点容器,供后面 NodePort 与 Ingress 章节验证):
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30080
hostPort: 30080
- containerPort: 30081
hostPort: 30081
- containerPort: 30443
hostPort: 30443
常见坑
- 建完集群 kubectl 连不上:kubeconfig 没写对或 context 没切换;用 kind create cluster --kubeconfig 指定文件,再用 KUBECONFIG 环境变量指向它,多集群时最干净。
- NodePort 服务 curl 不通:忘了 extraPortMappings 只能在 create 时配置;不重建集群的替代方案是 kubectl port-forward。
- 拉不动节点镜像:kindest/node 镜像有几百 MB,网络受限时先 docker pull 再建集群,或配代理/镜像加速。
- 把 kind 当生产方案:控制平面跑在单个容器里、没有高可用,它只用于学习、开发和 CI 测试。
小结
kind = 用 Docker 容器当节点的真实 Kubernetes;create/get/delete 三条命令管理整个集群生命周期;端口映射要建集群时声明;本地集群与云上集群 API 一致,差异只在 LB、存储和节点数。集群就绪,下一章系统过一遍 kubectl。