多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Ubuntu系统快速搭建Kubernetes本地集群:kind工具全流程指南

Ubuntu系统快速搭建Kubernetes本地集群:kind工具全流程指南 如果你需要在本地快速搭建一个 Kubernetes 集群用于开发、测试或学习但又不想折腾虚拟机或复杂的云环境那么 kind 是一个绝佳的选择。它是一个使用 Docker 容器作为“节点”来运行 Kubernetes 的工具让你能在几分钟内就拥有一个功能完整的 K8s 环境。对于开发者、运维工程师或正在学习 Kubernetes 的人来说kind 极大地降低了本地实验的门槛。本文将带你从零开始在 Ubuntu 系统上安装和配置 kind并完成一个完整的 Kubernetes 集群创建与验证流程。整个过程不涉及复杂的网络配置或昂贵的硬件只需要一台安装了 Docker 的 Ubuntu 机器。我们会重点关注 kind 的核心优势、安装部署的每一步操作、集群的创建与管理以及如何排查常见的启动问题。无论你是想测试应用部署、练习 Helm Chart还是验证 CI/CD 流水线kind 都能提供一个轻量且可靠的沙箱环境。1. 核心能力速览在深入操作之前我们先快速了解 kind 的核心特性这能帮你判断它是否适合你的场景。能力项说明项目类型本地 Kubernetes 集群部署工具核心原理使用 Docker 容器模拟 Kubernetes 节点Control Plane 和 Worker硬件门槛极低。主要依赖 Docker 和足够的内存/CPU 资源来运行容器化的节点。启动速度快。通常 1-3 分钟内即可完成一个基础集群的创建。主要功能创建单节点或多节点 K8s 集群、加载本地镜像到集群、支持 Kubeadm 配置网络支持集群内部容器网络互通并可通过端口映射暴露服务到宿主机。数据持久化默认非持久化可通过配置将宿主机目录挂载到节点容器。适合场景本地开发测试、CI/CD 集成测试、Kubernetes 学习与实验、快速验证应用部署清单简单来说kind 把 Kubernetes 的各个组件如 kube-apiserver, etcd都打包成 Docker 镜像然后通过 Docker 容器来运行它们。你得到的是一个完全符合标准的 Kubernetes 集群但它“生活”在你的 Docker 守护进程中。2. 适用场景与使用边界kind 并非用于生产环境理解它的适用边界能帮助你更好地利用它。它非常适合以下场景本地开发与调试在将应用部署到云上或正式集群之前在本地用 kind 快速验证 Deployment、Service、Ingress 等资源配置是否正确。持续集成CI在 GitLab CI、Jenkins 等流水线中可以快速启动一个临时的 kind 集群来运行自动化测试测试完成后销毁资源隔离性好。学习与教学对于 Kubernetes 新手kind 提供了零成本、可反复销毁重建的实验环境是学习 kubectl 命令、理解 Pod 调度、网络策略等的理想工具。项目原型验证需要测试 Helm Chart、Operator 或自定义资源定义CRD时可以快速搭建一个干净的测试环境。Kubernetes 版本测试可以很方便地创建不同版本的 Kubernetes 集群用于验证应用或工具的版本兼容性。它的局限性不适合的场景生产环境kind 集群的生命周期与 Docker 容器绑定不具备生产级的高可用性、持久化存储和高级网络功能。性能压测由于节点是容器其网络和存储 I/O 性能与物理机或虚拟机有差距不适合进行严格的性能基准测试。需要特定内核模块或硬件特性的场景例如某些需要特殊设备插件如 GPU、SR-IOV的工作负载无法在 kind 中运行。大规模集群模拟虽然支持多节点但创建数十个节点可能会耗尽宿主机资源且管理不便。它更适合小规模集群如 1个控制面 2个工作节点。安全与合规提醒kind 集群默认配置可能不适合直接暴露在公网。在 CI/CD 环境中使用时请注意清理包含敏感信息的镜像或配置。用于测试有网络访问需求的应用时确保其行为符合法律法规。3. 环境准备与前置条件在安装 kind 之前你需要确保 Ubuntu 系统满足以下基础条件。这是成功运行 kind 的关键。操作系统本文以Ubuntu 22.04 LTS为例其他如 20.04、24.04 等版本也基本适用。WSL2 中的 Ubuntu 同样支持是 Windows 用户的最佳选择。Docker这是 kind 的运行时依赖。你需要安装并正确配置 Docker 守护进程。版本要求Docker 18.09 或更高版本。建议安装当前稳定版。用户权限确保你的普通用户已加入docker用户组以便无需sudo即可执行docker命令。这能避免后续 kind 命令的权限问题。# 将当前用户加入 docker 组需要重新登录生效 sudo usermod -aG docker $USER资源要求内存建议宿主机至少拥有4GB可用内存。一个单节点集群控制平面和工作节点合一大约需要 1-2GB 内存。每增加一个工作节点需额外预留 500MB-1GB。CPU至少 2 核。更多的 CPU 核心能让集群运行更流畅。磁盘空间至少 10GB 可用空间用于存放 Docker 镜像和节点容器。网络确保宿主机可以正常访问互联网以下载 kind 二进制文件和 Kubernetes 镜像。验证 Docker 安装与配置在终端中执行以下命令确保 Docker 已就绪。# 检查 Docker 版本 docker --version # 运行一个测试容器验证 Docker 守护进程工作正常 docker run --rm hello-world如果hello-world容器能成功运行并输出欢迎信息说明 Docker 环境基本正常。如果遇到类似“Cannot connect to the Docker daemon”或“permission denied”的错误请先解决 Docker 的安装或权限问题。4. 安装 kind 二进制文件kind 的安装非常简单本质上就是下载一个独立的二进制文件并放到系统路径下。这里提供两种最常用的方法。4.1 方法一使用 curl 直接下载推荐这是最直接的方式。从 kind 的 GitHub 发布页面下载最新版本的二进制文件。# 下载最新的 kind 二进制文件适用于 Linux AMD64/Intel64 架构 curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64 # 为 kind 文件添加可执行权限 chmod x ./kind # 将 kind 移动到系统 PATH 目录例如 /usr/local/bin以便全局调用 sudo mv ./kind /usr/local/bin/说明https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64这个链接会自动重定向到最新的稳定版。如果你想安装特定版本可以去 GitHub Releases 页面查找对应的链接。4.2 方法二使用包管理器安装如果你习惯使用包管理器也可以通过apt来安装但仓库中的版本可能不是最新的。# 首先添加 kind 的软件源并更新 curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo “deb https://apt.kubernetes.io/ kubernetes-xenial main” | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update # 安装 kind (注意此源中的版本可能较旧) sudo apt-get install -y kind4.3 验证安装无论采用哪种方法安装完成后运行以下命令验证 kind 是否已正确安装。kind version如果安装成功你会看到类似kind v0.22.0 go1.21.0 linux/amd64的输出显示了 kind 的版本号。5. 创建你的第一个 Kubernetes 集群安装好 kind 后创建集群只需要一条命令。但理解命令背后的选项和过程更重要。5.1 基础命令创建默认集群最简单的命令会使用默认配置创建一个单节点的 Kubernetes 集群。这个节点既是控制平面Control Plane也充当工作节点Worker Node。kind create cluster执行这条命令后kind 会执行以下操作拉取运行 Kubernetes 所需的基础 Docker 镜像如kindest/node:v1.29.2。创建一个 Docker 容器并在其中启动 Kubernetes 控制平面组件kube-apiserver, etcd, kube-controller-manager, kube-scheduler。生成一个 kubeconfig 文件通常位于~/.kube/config并自动将当前上下文context切换到新创建的 kind 集群。安装 CoreDNS 和 kube-proxy 等核心插件。整个过程通常需要 1-3 分钟取决于你的网络速度和硬盘性能。当看到Creating cluster “kind” …和Set kubectl context to “kind-kind”的提示时说明集群创建成功。5.2 指定集群名称和 Kubernetes 版本你可以通过参数来自定义集群。# 创建一个名为 “my-cluster” 的集群 kind create cluster --name my-cluster # 创建指定 Kubernetes 版本的集群 (例如 1.27.3) kind create cluster --image kindest/node:v1.27.3使用--name可以管理多个 kind 集群。使用--image可以精确控制集群的 Kubernetes 版本。你可以在 kind 官方文档 找到所有支持的镜像标签。5.3 验证集群状态集群创建完成后使用kubectl命令来验证其状态。kubectl是与 Kubernetes 集群交互的命令行工具。kind 会自动配置kubectl的上下文。# 查看集群节点状态所有节点应显示为 “Ready” kubectl get nodes # 查看所有命名空间下的系统 Pod 状态所有 Pod 应显示为 “Running” 或 “Completed” kubectl get pods -A如果一切正常kubectl get nodes会显示一个名为my-cluster-control-plane如果你指定了名称或kind-control-plane默认名称的节点状态为Ready。6. 使用配置文件创建多节点集群默认的单节点集群适合大多数简单测试。但如果你想模拟更真实的多节点环境例如测试 Pod 在不同节点间的调度就需要使用配置文件。6.1 创建配置文件创建一个 YAML 文件例如kind-multi-node.yaml内容如下# kind-multi-node.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: # 控制平面节点 - role: control-plane # 工作节点 1 - role: worker # 工作节点 2 - role: worker这个配置定义了一个包含 1 个控制平面节点和 2 个工作节点的集群。6.2 使用配置文件创建集群使用--config参数指定配置文件来创建集群。kind create cluster --name multi-node-cluster --config kind-multi-node.yaml6.3 验证多节点集群创建完成后再次验证节点和 Pod。kubectl get nodes现在你应该能看到三个节点一个control-plane和两个worker状态都是Ready。# 可以尝试部署一个多副本的 Deployment观察 Pod 被调度到不同节点上 kubectl create deployment nginx --imagenginx --replicas3 kubectl get pods -o wide-o wide选项会显示 Pod 所在的具体节点你可以看到三个 Nginx Pod 被分配到了两个 worker 节点上。7. kind 的实用功能与技巧除了创建集群kind 还提供了一些非常实用的功能来提升本地开发测试的效率。7.1 将本地 Docker 镜像加载到集群中在开发过程中你经常需要将自己构建的应用程序镜像部署到 kind 集群中进行测试。由于 kind 的节点是 Docker 容器它们与宿主机共享同一个 Docker 守护进程但拥有独立的容器运行时环境。因此你需要使用kind load命令将镜像“加载”到集群的所有节点中。# 假设你已经在本地构建了一个镜像 my-app:v1 docker build -t my-app:v1 . # 将该镜像加载到名为 “kind” 的集群中如果集群名不是默认的请用 --name 指定 kind load docker-image my-app:v1 # 加载到特定名称的集群 kind load docker-image my-app:v1 --name my-cluster加载完成后你就可以在 Pod 的配置中直接使用my-app:v1这个镜像名了无需推送到远程仓库极大简化了本地开发流程。7.2 端口映射暴露服务到宿主机在 Kubernetes 中Service 的NodePort类型可以将服务暴露到集群每个节点的 IP 上。在 kind 中“节点”是容器其 IP 在宿主机网络内。为了能从宿主机甚至外部访问服务需要在创建集群时配置端口映射。修改之前的配置文件kind-multi-node.yaml# kind-multi-node-with-port.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane # 将控制平面节点的 80 端口映射到宿主机的 8080 端口 extraPortMappings: - containerPort: 80 hostPort: 8080 listenAddress: “127.0.0.1” # 可选只绑定到本地回环地址 protocol: tcp - role: worker - role: worker使用此配置创建集群后在集群内创建一个NodePort类型 Service 并绑定到 80 端口你就可以通过访问宿主机的http://127.0.0.1:8080来访问该服务了。7.3 文件挂载持久化存储默认情况下节点容器内的数据是非持久化的。你可以通过配置将宿主机目录挂载到节点容器内用于持久化存储或提供配置文件。# kind-with-mount.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraMounts: - hostPath: /path/on/your/host containerPath: /path/in/container # readOnly: true # 可选设置为只读挂载这样在 Pod 中如果使用了hostPath卷并指向/path/in/container数据实际上会保存在宿主机的/path/on/your/host目录下。8. 集群管理与故障排查8.1 常用管理命令# 列出所有 kind 集群 kind get clusters # 查看特定集群的详细信息 kind export kubeconfig --name my-cluster # 导出该集群的 kubeconfig kind describe cluster --name my-cluster # 删除一个集群 kind delete cluster --name my-cluster # 删除所有 kind 集群 kind delete clusters --all8.2 常见问题与排查方法在安装和使用 kind 过程中你可能会遇到一些问题。下表列出了常见问题及其解决方法。问题现象可能原因排查方式解决方案执行kind create cluster卡住或报错1. 网络问题无法拉取kindest/node镜像。2. Docker 守护进程未运行或权限不足。3. 宿主机资源内存不足。1. 运行docker pull kindest/node:v1.29.2测试镜像拉取。2. 运行docker ps测试 Docker 命令。3. 使用free -h检查内存。1. 配置 Docker 镜像加速器或使用代理。2. 启动 Docker 服务 (sudo systemctl start docker)并将用户加入docker组后重新登录。3. 关闭不必要的程序或增加虚拟机内存。kubectl get nodes显示节点NotReady1. 系统 Pod如 CNI 插件未能成功启动。2. 节点容器内部组件启动失败。1. 运行kubectl get pods -n kube-system查看系统 Pod 状态。2. 查看具体 Pod 的日志如kubectl logs -n kube-system pod-name。3. 查看节点容器日志docker logs node-container-id。1. 通常是镜像拉取问题。尝试删除集群重建 (kind delete cluster)。2. 检查 kind 配置确保没有端口冲突等配置错误。kind load docker-image失败1. 指定的集群不存在。2. 本地不存在该 Docker 镜像。1. 运行kind get clusters确认集群名。2. 运行docker images确认镜像存在。1. 使用--name参数指定正确的集群名。2. 先使用docker build或docker pull确保镜像存在。无法通过宿主机端口访问服务1. 创建集群时未配置extraPortMappings。2. Service 类型不是NodePort或LoadBalancer。3. 防火墙或安全组阻止了端口访问。1. 检查 kind 集群配置文件中是否定义了端口映射。2. 运行kubectl get svc确认 Service 类型和端口。3. 在宿主机上运行ss -tlnp | grep port检查端口是否监听。1. 使用正确的配置文件重建集群。2. 确保 Service 的nodePort与extraPortMappings中的containerPort一致。3. 在 Ubuntu 上检查ufw防火墙状态 (sudo ufw status)。WSL2 中运行 kind 非常慢WSL2 的虚拟硬盘VHD可能碎片化或性能不佳。检查 WSL2 磁盘使用情况。1. 在 PowerShell 中运行wsl --shutdown关闭 WSL2然后重启。2. 考虑将 WSL2 发行版移动到 SSD 硬盘。3. 在 WSL2 内部确保工作目录在 Linux 文件系统内如/home/username而不是挂载的 Windows 盘符如/mnt/c。高级排查如果遇到复杂问题可以增加kind命令的日志级别来获取更详细的信息。kind create cluster --name debug-cluster -v 5-v参数值越高输出的日志越详细。9. 集成与进阶使用kind 可以很好地与其他工具集成构建更强大的本地开发测试工作流。与 Helm 集成你可以直接在 kind 集群中安装 Helm 并部署 Charts用于测试复杂的应用。与 CI/CD 集成在 Jenkins、GitLab Runner 等 CI 代理中安装 Docker 和 kind在流水线中动态创建集群、运行测试、然后销毁实现完全隔离的集成测试环境。测试 Kubernetes 操作器Operatorkind 是开发和测试自定义 Kubernetes Operator 的绝佳平台因为你可以快速重建一个干净的集群。使用clusterctl创建集群 APICAPI管理集群kind 常被用作 Cluster API 的“管理集群”用于置备和管理其他工作负载集群。一个简单的 CI 脚本示例#!/bin/bash # 在 CI 中运行 Kubernetes 测试的示例 set -e # 创建测试集群 kind create cluster --name ci-test # 加载待测试的应用镜像 kind load docker-image my-app:ci-${CI_COMMIT_SHA} --name ci-test # 部署应用到集群 kubectl apply -f k8s/manifests/ # 运行端到端测试 ./run-e2e-tests.sh # 测试完成后删除集群 kind delete cluster --name ci-test10. 总结与最佳实践通过本文你应该已经掌握了在 Ubuntu 上安装 kind、创建单节点/多节点集群、加载本地镜像以及进行基本故障排查的全过程。kind 的核心价值在于其轻量、快速和标准兼容性它让本地 Kubernetes 体验变得前所未有的简单。最佳实践建议为不同项目使用不同集群名使用--name参数创建具有明确意义的集群名如project-a-dev,project-b-test避免混淆。善用配置文件将复杂的集群配置如多节点、端口映射、挂载保存为 YAML 文件纳入版本控制方便团队共享和复现环境。镜像加载是开发利器充分利用kind load docker-image命令避免在开发测试循环中频繁推送镜像到远程仓库。及时清理测试完成后使用kind delete cluster销毁集群释放宿主机资源。对于 CI 环境务必在流水线结束时加入清理步骤。结合 kubectl 别名和上下文当管理多个集群时使用kubectl config use-context来切换上下文或为不同集群设置 shell 别名。探索网络和存储方案对于需要测试特定网络策略如 Calico或有状态应用需要持久卷的场景可以研究 kind 如何集成这些 CNI 插件或 StorageClass 提供程序。kind 不仅是学习工具更是提升开发效率的利器。下次当你需要快速验证一个 K8s YAML 文件、测试 Helm Chart 或运行集成测试时不妨先花一分钟用 kind 搭个集群试试。
返回列表