ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu上使用Kind快速搭建本地Kubernetes开发环境

Ubuntu上使用Kind快速搭建本地Kubernetes开发环境 如果你在 Ubuntu 上尝试搭建一个 Kubernetes 集群用于本地开发或测试大概率会经历这样的心路历程从满怀信心地准备 kubeadm、配置网络插件、处理证书到被各种初始化错误、节点 NotReady、网络不通等问题反复折磨最终发现半天时间过去了集群还没跑起来。本地开发环境需要的是快速、轻量、可反复销毁重建而不是一个需要精心维护的“迷你生产环境”。这正是kind (Kubernetes IN Docker)要解决的核心痛点。它不是一个功能阉割的“玩具”而是一个将 Kubernetes 节点直接运行在 Docker 容器里的精巧工具。这意味着你可以在几秒钟内用一个简单的命令启动一个完全符合 CNCF 认证的、多节点的 Kubernetes 集群。所有组件API Server、etcd、Controller Manager 等都作为容器运行与宿主机高度隔离清理起来也只是一条kind delete cluster的事。本文将带你从零开始在 Ubuntu 系统上完成 kind 的安装与核心使用。但更重要的是我会帮你理清三个关键判断kind 的真正优势它解决的不仅是“安装快”更是“环境一致性”和“资源隔离”问题特别适合 CI/CD 流水线和多版本 K8s 测试。与 Minikube、k3s 的本质区别kind 是“容器化集群”而 Minikube 是“虚拟机单节点”k3s 是“轻量级发行版”适用场景截然不同。实际使用中的“坑”与最佳实践包括镜像拉取、网络配置、存储挂载以及如何与本地开发工具如 Helm、Skaffold顺畅集成。读完本文你将能熟练使用 kind 搭建一个可用于微服务开发、Operator 测试或学习 Kubernetes 的本地沙箱环境并掌握高效管理它的方法。1. 为什么是 kind重新理解本地 K8s 集群的选型在深入安装步骤之前我们必须先回答一个问题在 Minikube、microk8s、k3s、Docker Desktop Kubernetes 等诸多本地方案中为什么 kind 值得你额外关注传统的本地 Kubernetes 搭建如 kubeadm或 Minikube基于 VM存在几个固有痛点资源消耗大需要为每个节点分配完整的虚拟机资源。启动速度慢系统启动、组件初始化耗时较长。环境清理麻烦残留的配置、证书、网络接口不易彻底清除。与宿主机开发体验割裂在宿主机编辑代码在 VM 内运行服务调试链路长。kind 采用了一种“递归容器化”的思路它用 Docker 容器来模拟 Kubernetes 的节点包括控制平面和工作节点。这带来了几个颠覆性优势极致的轻量与速度节点本身就是容器创建和销毁几乎瞬间完成。这对于需要频繁创建集群的 CI 场景至关重要。完美的环境一致性你的集群定义节点数量、镜像、Kubernetes 版本可以通过一个 YAML 配置文件kind-config.yaml进行版本控制在任何装有 Docker 的机器上都能复现出一模一样的集群。天然的隔离性每个 kind 集群都在独立的容器网络命名空间中运行多个集群之间互不干扰非常适合测试不同的 K8s 版本或网络策略。对 Docker 生态的无缝集成你可以直接使用本地构建的 Docker 镜像无需推送到外部仓库。kind 提供了kind load docker-image命令能将宿主机镜像直接加载到集群节点容器中极大简化了本地开发循环。那么谁最适合使用 kindKubernetes 开发者/贡献者需要测试新功能或修复 Bug。CI/CD 工程师需要在流水线中快速创建临时集群进行集成测试。应用开发者开发需要在 K8s 环境中运行的微服务或 Operator。学习者希望有一个干净、可反复重置的沙箱来学习 K8s 概念。如果你的需求是一个高度模拟生产环境、需要特定操作系统或内核模块的集群那么 kind 可能不是最佳选择。但对于绝大多数开发、测试和学习场景kind 在效率和易用性上具有明显优势。2. 核心概念与前置条件梳理在开始动手前我们先明确几个关键概念和必须满足的条件。2.1 kind 的核心组件与工作原理kind 二进制文件一个用 Go 编写的命令行工具负责解析你的集群配置并通过调用 Docker API 来创建和管理容器化的 K8s 节点。节点容器每个 Kubernetes 节点无论是控制平面还是工作节点都运行在一个独立的 Docker 容器里。这个容器内部运行着一个经过特殊配置的 Linux 系统通常是基于kindest/node镜像其中包含了kubeadm、kubelet、containerd等所有必要的 K8s 组件。负载均衡器容器当创建多控制平面高可用集群时kind 会自动创建一个额外的容器作为负载均衡器将请求分发到多个 API Server 实例。集群配置一个 YAML 文件用于定义集群的拓扑结构如节点数量、角色、Kubernetes 版本、镜像仓库、特性门控等。2.2 必须满足的前置条件kind 的依赖非常简单核心只有一条一个能够正常工作的 Docker 环境。操作系统本文以Ubuntu 22.04 LTS为例其他版本如 20.04, 24.04步骤类似。理论上任何能运行 Docker 的 Linux 发行版或 macOS/Windows通过 WSL2都可以。Docker这是 kind 的运行时环境。你必须先安装并启动 Docker Daemon并且当前用户需要拥有执行docker命令的权限通常需要加入docker用户组。网络与资源确保宿主机可以访问互联网以下载 kind 二进制文件和kindest/node镜像。为 Docker 分配足够的资源。建议至少为 Docker 分配 4GB 内存和 2个 CPU 核心以确保多节点集群能稳定运行。你可以在 Docker Desktop 的设置中调整或在 Linux 上通过修改/etc/docker/daemon.json配置。3. 环境准备在 Ubuntu 上安装与配置 Docker如果你的 Ubuntu 系统已经安装了 Docker 并可以正常使用运行docker version和docker run hello-world成功可以跳过本节。3.1 卸载旧版本 Docker可选为避免冲突建议先清理系统上可能存在的旧版本 Docker。sudo apt-get remove docker docker-engine docker.io containerd runc3.2 安装 Docker 官方仓库和依赖更新软件包索引并安装必要的工具sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release添加 Docker 的官方 GPG 密钥sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg设置稳定版仓库echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null3.3 安装 Docker Engine再次更新索引并安装最新版 Dockersudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin启动 Docker 服务并设置开机自启sudo systemctl start docker sudo systemctl enable docker非常重要将当前用户加入 docker 组这样就不需要每次都使用sudo来执行 docker 命令sudo usermod -aG docker $USER执行此命令后你需要完全退出当前终端会话关闭所有终端窗口然后重新登录才能使组权限生效。3.4 验证 Docker 安装重新登录后运行以下命令验证 Docker 是否安装成功且当前用户有权限# 检查 Docker 版本确认客户端和服务器端都能正常通信 docker version # 运行一个测试容器 docker run --rm hello-world如果看到 “Hello from Docker!” 等欢迎信息说明 Docker 环境已就绪。4. 安装 kind 二进制文件kind 的安装非常直接就是下载一个静态编译的二进制文件放到系统路径下。4.1 下载最新稳定版的 kind你可以从 kind 的 GitHub Releases 页面下载。以下命令下载适用于 Linux AMD64/ARM64 架构的最新版本# 对于 AMD64 (x86_64) 架构 curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64 # 对于 ARM64 (例如 Apple Silicon Mac 的 Linux 虚拟机或树莓派) 架构 # curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-arm64注意latest链接总是指向最新的稳定版。如果你需要特定版本可以去 GitHub Releases 页面查找对应的下载链接。4.2 赋予执行权限并移动到系统路径chmod x ./kind sudo mv ./kind /usr/local/bin/4.3 验证 kind 安装kind version如果安装成功会输出类似kind v0.22.0 go1.21.0 linux/amd64的信息。5. 创建你的第一个 kind 集群现在激动人心的部分来了。我们将用最简单的命令创建一个单控制平面、单工作节点的集群。5.1 使用默认配置创建集群kind create cluster这个命令会执行以下操作检查本地是否存在名为kind的 Docker 网络如果没有则创建。从 Docker Hub 拉取默认的kindest/node镜像对应一个特定的 Kubernetes 版本如 v1.28.0。启动一个容器作为控制平面节点。在该节点容器内部使用kubeadm初始化一个 Kubernetes 集群。生成一个kubeconfig文件并合并到你的~/.kube/config中将kubectl的上下文切换到新创建的集群集群名默认为kind。整个过程大约需要 1-2 分钟取决于你的网络速度和机器性能。完成后你会看到类似下面的输出Creating cluster kind ... ✓ Ensuring node image (kindest/node:v1.28.0) ✓ Preparing nodes ✓ Writing configuration ✓ Starting control-plane ️ ✓ Installing CNI ✓ Installing StorageClass Set kubectl context to kind-kind You can now use your cluster with: kubectl cluster-info --context kind-kind5.2 验证集群状态使用kubectl检查集群节点和核心组件状态。如果你的系统没有kubectl需要先安装sudo apt-get install -y kubectl或通过其他方式。# 查看集群信息 kubectl cluster-info --context kind-kind # 查看所有节点状态应显示一个 control-plane 节点状态为 Ready kubectl get nodes # 查看所有命名空间下的 Pod系统组件 kubectl get pods -A如果一切正常kubectl get nodes的输出中节点的STATUS应为Ready。至此一个功能完整的 Kubernetes 集群已经在你的 Docker 容器中运行起来了。6. 深入集群配置定制你的 kind 集群默认配置适合快速体验但实际开发中我们往往需要定制。kind 的强大之处在于其灵活的集群配置文件。6.1 创建一个多节点集群创建一个包含 1 个控制平面和 2 个工作节点的集群。首先创建一个名为kind-config-multi.yaml的配置文件# kind-config-multi.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane - role: worker - role: worker然后使用该配置文件创建集群kind create cluster --name multi-node-cluster --config kind-config-multi.yaml创建完成后使用kubectl get nodes查看应该能看到三个节点。6.2 指定 Kubernetes 版本kind 通过不同的kindest/node镜像标签来支持不同的 K8s 版本。你可以在创建集群时指定版本。# 查看 kind 支持哪些 Kubernetes 版本镜像 kind version --all # 创建一个运行 Kubernetes v1.27.3 的集群 kind create cluster --name k8s-1-27 --image kindest/node:v1.27.36.3 配置本地镜像仓库与镜像预加载这是 kind 用于本地开发最实用的功能之一。场景你在宿主机上用 Docker 构建了一个应用镜像my-app:latest希望能在 kind 集群中直接使用而不需要推送到远程仓库。方法一使用kind load docker-image# 1. 在宿主机构建镜像 docker build -t my-app:latest . # 2. 将镜像加载到名为 kind 的默认集群的所有节点中 kind load docker-image my-app:latest # 如果集群有特定名称需要指定 # kind load docker-image my-app:latest --name multi-node-cluster加载后你就可以在集群的 Pod 配置中直接使用image: my-app:latest了。方法二通过配置文件映射宿主机的 Docker Daemon这种方法允许集群内的容器直接使用宿主机 Docker 缓存的镜像但配置稍复杂通常用于 CI 环境。这里不展开kind 官方文档有详细说明。6.4 端口映射与存储卷有时你需要将集群内的服务暴露到宿主机或者将宿主机的目录挂载到节点容器中。# kind-config-with-ports-and-volumes.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane # 将容器内的 80 端口映射到宿主机的 8080 端口 extraPortMappings: - containerPort: 80 hostPort: 8080 protocol: TCP # 将宿主机的 /home/user/data 目录挂载到容器的 /data 路径 extraMounts: - hostPath: /home/user/data containerPath: /data创建集群后如果你在集群内部署一个监听 80 端口的 Service类型为 NodePort 或 LoadBalancer就可以通过宿主机的localhost:8080进行访问。7. 核心操作与日常使用7.1 管理多个集群kind 支持同时创建和管理多个集群通过--name参数区分。# 创建两个不同配置的集群 kind create cluster --name dev kind create cluster --name test --config test-config.yaml # 查看所有集群 kind get clusters # 切换 kubectl 上下文到特定集群 kubectl cluster-info --context kind-dev # 或者使用 kind 提供的命令导出配置 kind export kubeconfig --name dev # 删除特定集群 kind delete cluster --name test7.2 与 kubectl 和 Helm 协同工作kind 集群与标准的 Kubernetes 集群完全兼容。你可以像操作任何远程集群一样使用kubectl、helm、kustomize等工具。# 部署一个 Nginx Deployment kubectl create deployment nginx --imagenginx:alpine # 暴露为 NodePort Service kubectl expose deployment nginx --port80 --typeNodePort # 安装 Helm Chart helm repo add bitnami https://charts.bitnami.com/bitnami helm install my-redis bitnami/redis7.3 查看集群日志与调试如果集群创建失败或组件异常可以查看节点容器的日志。# 查看名为 kind 的集群的控制平面节点容器日志 docker logs kind-control-plane # 进入节点容器进行调试不推荐常规使用但调试时很有用 docker exec -it kind-control-plane bash # 在容器内你可以查看 kubelet 日志journalctl -u kubelet8. 常见问题与排查思路在 Ubuntu 上使用 kind 时你可能会遇到以下典型问题。问题现象可能原因排查方式解决方案kind create cluster失败提示failed to pull image网络问题无法从 Docker Hub 拉取kindest/node镜像。1. 运行docker pull kindest/node:v1.28.0测试。2. 检查 Docker Daemon 是否运行 (systemctl status docker)。1. 配置 Docker 国内镜像加速器。2. 确保网络连通性。kubectl get nodes显示节点NotReady容器网络插件 (CNI) 未成功安装或 Pod 网段冲突。1.kubectl get pods -n kube-system查看corednsPod 是否处于Pending状态。2.docker logs kind-control-plane查看 kubelet 日志。1. 最常见原因是端口或网段冲突。尝试使用不同的集群配置修改podSubnet或serviceSubnet。2. 彻底删除旧集群重试kind delete cluster。kind load docker-image失败提示no such cluster未指定集群名称而当前活跃的上下文不是 kind 创建的集群。kind get clusters查看集群列表kubectl config current-context查看当前上下文。使用--name参数明确指定集群kind load docker-image my-image:tag --name cluster-name。宿主机无法通过localhost:port访问集群内服务端口映射配置错误或 Service 类型不是NodePort/LoadBalancer。1. 检查 kind 配置中的extraPortMappings。2. 检查 Service 类型和端口kubectl get svc。1. 确保hostPort在宿主机上未被占用。2. 创建 Service 时指定type: NodePortkind 的负载均衡器会处理映射。Docker 命令需要sudo当前用户不在docker用户组。运行groups $USER查看用户所属组。执行sudo usermod -aG docker $USER并重新登录终端。集群创建成功但kubectl命令无响应或报错kubeconfig配置问题或 API Server 未就绪。1. 检查~/.kube/config文件内容。2.kubectl cluster-info查看 API Server 地址是否可达。1. 使用kind export kubeconfig --name cluster-name重新生成配置。2. 等待片刻API Server 可能仍在启动。9. 生产级开发最佳实践虽然 kind 主要用于本地开发和测试但遵循一些最佳实践能让你的体验更顺畅。配置文件版本化将你的kind-config.yaml文件纳入 Git 版本控制。这样团队每个成员都能创建出完全一致的集群环境。使用特定的 Kubernetes 版本在配置文件中通过image字段固定 K8s 版本避免因latest标签变化导致环境不一致。资源限制在 Docker 的资源配置中为 kind 集群预留足够的内存和 CPU。一个多节点集群可能轻松消耗 4GB 以上内存。镜像预加载优化在 CI 流水线中可以考虑先构建一个包含了所有基础依赖镜像的定制kindest/node镜像以加速集群创建。与 Skaffold/Tilt 集成这些本地开发工具与 kind 是绝配。它们可以监视代码变化自动重新构建镜像、加载到 kind 集群并更新部署实现“热重载”开发体验。清理策略养成用完即删的习惯。kind delete cluster可以瞬间清理所有资源保持宿主机环境整洁。对于长期不用的集群也应定期删除以释放磁盘空间节点容器镜像和层缓存会占用空间。10. 总结与延伸通过本文你不仅学会了在 Ubuntu 上安装和使用 kind更重要的是理解了它作为“容器化 Kubernetes”工具的独特定位和价值。它用 Docker 的轻量和隔离性完美解决了本地 K8s 环境“搭建繁琐、清理困难、资源浪费”的核心痛点。你的下一步可以沿着这几个方向深入探索高级配置研究 kind 配置文件中关于网络networking、特性门控featureGates、API Server 额外参数等高级选项。集成 CI/CD尝试在 GitHub Actions 或 GitLab CI 中编写一个流水线使用 kind 创建临时集群来运行你的应用集成测试。开发 Kubernetes Operatorkind 是测试 Operator 的利器。你可以快速创建一个集群部署你的 Operator例如使用operator-sdk并观察其协调逻辑。学习多集群管理用 kind 快速创建多个集群模拟多集群场景练习使用kubefed或cilium-clustermesh等工具。记住kind 是你探索 Kubernetes 世界的安全沙箱。大胆地去创建、破坏和重建它这是掌握容器编排技术最高效的方式之一。建议将本文中的关键命令和配置文件收藏它们将成为你本地开发工具箱中不可或缺的一部分。
返回列表