Ubuntu系统上使用kind快速搭建本地Kubernetes开发测试环境

📅 2026/8/23 9:39:11
Ubuntu系统上使用kind快速搭建本地Kubernetes开发测试环境
在本地快速搭建一个轻量级的 Kubernetes 集群进行开发测试是很多云原生开发者的刚需。相比 minikube 或 k3skind 凭借其“Kubernetes in Docker”的设计理念实现了秒级集群创建和销毁资源占用极低尤其适合 CI/CD 流水线和日常功能验证。本文将手把手带你完成在 Ubuntu 系统上安装和配置 kind 的全过程涵盖从 Docker 环境准备、kind 安装、集群创建、到常用操作和故障排查确保你能够顺利搭建属于自己的本地 K8s 沙箱环境。1. 背景与核心概念在深入安装步骤之前我们有必要理解 kind 是什么以及它解决了什么问题。1.1 什么是 kindkind 是一个使用 Docker 容器作为“节点”来运行本地 Kubernetes 集群的工具。它的名字是 “Kubernetes IN Docker” 的缩写。kind 的主要目标是成为 Kubernetes 自身集成测试和开发的工具但其轻量、快速的特点也让它成为了个人学习和项目开发的绝佳选择。核心原理kind 将 Kubernetes 的各个组件如 kube-apiserver, kube-controller-manager, etcd都打包运行在 Docker 容器中。每个容器模拟一个 Kubernetes 节点可以是控制平面节点也可以是工作节点。因此你无需虚拟机也无需复杂的系统配置仅凭 Docker 就能获得一个功能完整的 K8s 集群。1.2 kind 解决了什么问题环境一致性开发、测试环境与生产环境的 Kubernetes 版本、配置可以高度一致避免“在我机器上好好的”问题。资源高效相比启动完整的虚拟机Docker 容器更加轻量启动速度快对宿主机资源CPU、内存消耗小。快速迭代可以瞬间创建一个全新的集群进行测试测试完成后一键删除非常适合做破坏性实验或快速验证新功能。CI/CD 友好在自动化流水线中可以轻松地动态创建和销毁 Kubernetes 集群用于集成测试。1.3 kind 与 minikube、k3s 的简单对比minikube通常会在本地启动一个虚拟机如 VirtualBox然后在虚拟机内部运行一个单节点集群。功能全面但相对较重启动较慢。k3s一个经过轻量级认证的 Kubernetes 发行版可以直接在主机上以进程形式运行。它非常轻量适合边缘计算和资源受限环境但安装过程涉及更多系统级配置。kind完全基于 Docker无需虚拟机集群由多个容器构成。它最突出的优点是创建/销毁速度极快且完全隔离是进行 Kubernetes 本身开发或功能测试的首选。对于大多数开发者和测试人员而言如果你已经熟悉 Docker并且需要一个干净、快速、可随意丢弃的 Kubernetes 环境kind 通常是更优的选择。2. 环境准备与版本说明在安装 kind 之前我们需要确保基础环境就绪。本节将详细说明所需的软硬件环境。2.1 系统要求操作系统本文以Ubuntu 22.04 LTS为例进行演示。该步骤同样适用于 Ubuntu 20.04、Debian 等主流 Linux 发行版。对于 Windows/macOS 用户可以通过 WSL2 或直接使用 kind 的对应安装包但本文聚焦于原生 Ubuntu 环境。硬件资源建议至少为 Docker 分配 2-4 GB 内存和 2 个 CPU 核心。运行一个多节点的 kind 集群会需要更多资源。权限安装和操作 Docker 以及 kind 通常需要sudo权限或直接使用root用户。后续操作中我们会使用sudo。2.2 核心依赖Dockerkind 的基石是 Docker。你必须先安装并正确配置 Docker。重要提示请确保安装的是 Docker Engine社区版或企业版而不是docker.io这个古老的 Ubuntu 仓库版本。我们将使用 Docker 官方提供的安装脚本或仓库。卸载旧版本可选但推荐 如果你的系统上存在旧的 Docker 版本可以先进行卸载。sudo apt-get remove docker docker-engine docker.io containerd runc安装依赖工具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设置 Docker 稳定版仓库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/null安装 Docker Enginesudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin验证 Docker 安装 运行一个 hello-world 镜像来测试 Docker 是否安装成功。sudo docker run hello-world如果看到 “Hello from Docker!” 等欢迎信息说明 Docker 已正确安装并运行。可选但重要将当前用户加入 docker 组 为了避免每次运行docker命令都需要sudo可以将你的用户加入docker组。sudo usermod -aG docker $USER注意执行此命令后你需要完全注销并重新登录或者重启系统才能使组权限生效。之后你就可以直接使用docker命令而不加sudo了。2.3 版本说明本文撰写时使用的环境版本如下但实际操作中请以最新稳定版为准Ubuntu: 22.04 LTSDocker: 24.0.xkind: v0.20.0Kubernetes: 通过 kind 默认安装通常为较新的稳定版如 1.27, 1.28版本兼容性kind 项目会紧密跟随 Kubernetes 版本发布。安装 kind 后你可以指定创建特定版本的 Kubernetes 集群。如果遇到问题请查阅 kind 官方文档的发布说明。3. 安装 kind 的多种方式kind 本身是一个单独的 Go 二进制文件安装非常简单。这里介绍三种主流安装方法。3.1 方式一使用 curl 下载二进制文件推荐这是最直接、最通用的方法适用于任何 Linux 发行版。从 kind 的 GitHub Release 页面下载最新的二进制文件。# 下载 kind 二进制文件 (请检查官网获取最新版本号以下 v0.20.0 为例) curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64赋予二进制文件可执行权限。chmod x ./kind将 kind 移动到系统 PATH 路径下例如/usr/local/bin。sudo mv ./kind /usr/local/bin/kind验证安装。kind version如果安装成功你会看到类似kind v0.20.0 go1.20.4 linux/amd64的输出。3.2 方式二使用包管理器安装如果你使用的是 Ubuntu 且偏好包管理器可以通过snap安装但可能不是最新版。sudo snap install kind --classic安装后同样使用kind version验证。3.3 方式三从源码构建适用于开发者如果你想体验最新特性或为项目做贡献可以从源码构建。# 确保已安装 Go (版本 1.17) git clone https://github.com/kubernetes-sigs/kind.git cd kind make build sudo cp bin/kind /usr/local/bin/建议对于大多数用户方式一curl下载是最佳选择它能确保你获得官方发布的最新稳定版本。4. 创建你的第一个 Kubernetes 集群安装好 kind 后创建集群只需一条命令。但我们先了解一些基本概念和配置。4.1 默认集群创建最简单的命令将使用默认配置创建一个单控制平面的集群。kind create cluster这条命令会拉取默认的节点镜像如kindest/node:v1.27.3。创建一个 Docker 容器作为 Kubernetes 控制平面节点。在容器内部部署完整的 Kubernetes 组件。生成一个 kubeconfig 文件并自动配置你的kubectl命令行工具如果已安装指向这个新集群。执行成功后你会看到类似下面的输出Creating cluster kind ... ✓ Ensuring node image (kindest/node:v1.27.3) ✓ 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-kind4.2 指定集群名称默认创建的集群名为kind。你可以通过--name标志指定不同的名字这对于管理多个集群非常有用。kind create cluster --name my-cluster创建后你的 kubeconfig 上下文会变为kind-my-cluster。4.3 指定 Kubernetes 版本kind 支持创建特定版本的 Kubernetes 集群。你需要使用一个包含该版本标签的节点镜像。首先查看 kind 支持哪些版本镜像kind version # 输出会列出支持的镜像标签或者你可以去 Docker Hub 查看 kindest/node 的 tags # 创建指定版本的集群 kind create cluster --image kindest/node:v1.26.64.4 使用配置文件创建多节点集群kind 的强大之处在于可以通过一个 YAML 配置文件来定义复杂的集群拓扑结构。创建配置文件新建一个文件例如multi-node-cluster.yaml。# multi-node-cluster.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: # 一个控制平面节点 - role: control-plane # 三个工作节点 - role: worker - role: worker - role: worker这个配置定义了一个包含 1 个控制平面节点和 3 个工作节点的集群。使用配置文件创建集群kind create cluster --config multi-node-cluster.yaml --name multi-node-demo验证节点集群创建完成后使用kubectl查看节点状态。kubectl get nodes --context kind-multi-node-demo你应该能看到 4 个节点并且状态都是Ready。4.5 验证集群状态无论以何种方式创建集群都可以使用以下命令验证检查集群信息kubectl cluster-info --context kind-kind # 如果集群名为默认的 kind查看所有节点kubectl get nodes查看所有 Pod系统命名空间kubectl get pods -A你应该能看到coredns,local-path-provisioner,kindnet等系统 Pod 都在运行。至此一个功能完整的本地 Kubernetes 集群就已经运行在你的 Ubuntu 机器上了。5. 与集群交互kubectl 的安装与配置要管理 Kubernetes 集群你需要kubectl命令行工具。kind 在创建集群时会自动为你配置 kubeconfig但你仍需安装kubectl本身。5.1 安装 kubectl在 Ubuntu 上可以使用官方脚本或包管理器安装。使用 curl 安装最新稳定版curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl使用 apt 安装版本可能稍旧sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg echo deb [signed-by/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ / | sudo tee /etc/apt/sources.list.d/kubernetes.list /dev/null sudo apt-get update sudo apt-get install -y kubectl安装后验证kubectl version --client --short5.2 kind 如何管理 kubeconfigkind 创建集群后会在~/.kube/config文件中添加一个新的上下文context。你可以通过以下命令查看和管理kubectl config get-contexts: 列出所有上下文。kubectl config use-context kind-kind: 切换到名为kind-kind的上下文即你刚创建的集群。kubectl config current-context: 显示当前使用的上下文。kind 的配置是独立的不会影响你已有的其他集群如 Minikube、EKS 等的配置。6. 核心操作与进阶配置掌握了创建集群的基础后我们来看一些日常开发中高频使用的操作和配置技巧。6.1 将本地镜像加载到 kind 集群在本地开发 Docker 镜像后你需要将其推送到集群内的节点才能使用。由于 kind 集群运行在容器内你无法直接使用宿主机的docker.io/your-image:tag。kind 提供了kind load命令来解决这个问题。假设你已经在本地构建了一个镜像my-app:v1.0。# 将本地镜像加载到名为 kind 的默认集群 kind load docker-image my-app:v1.0 --name kind # 如果你有多个集群需要指定集群名 kind load docker-image my-app:v1.0 --name my-cluster加载后你就可以在集群的 Pod 配置中直接使用my-app:v1.0这个镜像名了。6.2 端口映射有时你需要从宿主机访问集群内 Service 的 NodePort或者需要将集群内服务的端口暴露到宿主机。可以在 kind 的配置文件中通过extraPortMappings实现。# cluster-with-ports.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane # 端口映射配置 extraPortMappings: # 将宿主机的 80 端口映射到容器的 30080 端口 - containerPort: 30080 hostPort: 80 listenAddress: 0.0.0.0 # 可选默认为 0.0.0.0 protocol: tcp # 再映射一个 443 - 30443 - containerPort: 30443 hostPort: 443 protocol: tcp创建集群后你在集群内创建一个 NodePort 类型 Service并将其端口设置为30080那么你就可以通过宿主机的http://localhost:80访问该服务了。6.3 文件挂载与持久化存储默认情况下kind 使用local-path-provisioner作为 StorageClass为 Pod 提供动态的本地持久卷。这对于测试来说通常足够了。如果你需要将宿主机的目录挂载到集群节点中也可以在配置文件中通过extraMounts实现。# cluster-with-mounts.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 # 可选默认为 false (可读写)6.4 删除集群当你完成测试需要清理资源时删除集群非常简单。# 删除默认集群 kind delete cluster # 删除指定名称的集群 kind delete cluster --name my-cluster删除操作会停止并移除所有相关的 Docker 容器并从你的 kubeconfig 中移除对应的上下文。这是一个不可逆的操作请确保你不再需要集群中的数据。7. 常见问题与排查思路在使用 kind 的过程中你可能会遇到一些问题。下面列出了一些常见问题及其解决方法。问题现象常见原因解决思路kind create cluster失败提示docker命令未找到或权限不足1. Docker 未安装。2. Docker 服务未启动。3. 当前用户不在docker组。1. 参照本文第 2.2 节安装 Docker。2. 运行sudo systemctl start docker并sudo systemctl enable docker。3. 执行sudo usermod -aG docker $USER后注销并重新登录。创建集群时卡在Ensuring node image或下载镜像超时网络问题无法从 Docker Hub 拉取kindest/node镜像。1. 检查网络连接。2. 可以尝试预先手动拉取镜像docker pull kindest/node:v1.27.3替换为你需要的版本。3. 对于国内用户可以配置 Docker 镜像加速器。kubectl get nodes显示节点NotReady集群网络插件CNI未成功安装或 Pod 网络有问题。1. 等待几分钟kind 会自动安装 CNI。2. 查看kubectl describe node node-name获取详细信息。3. 查看kubectl get pods -n kube-system确认kindnet或cni相关 Pod 是否运行正常。执行kubectl命令提示The connection to the server localhost:8080 was refusedkubectl没有找到正确的 kubeconfig 或上下文未设置。1. 确认~/.kube/config文件存在且包含 kind 集群的配置。2. 运行kubectl config get-contexts查看并切换到正确的上下文kubectl config use-context kind-kind。3. 检查KUBECONFIG环境变量是否指向了其他文件。无法从宿主机访问集群内的服务NodePort1. Service 的type不是NodePort或LoadBalancer。2. kind 节点容器没有进行端口映射。1. 确认 Service 配置正确kubectl get svc service-name。2. 如果需要从宿主机访问创建集群时必须使用带有extraPortMappings的配置文件见第6.2节。kind load docker-image失败1. 本地镜像不存在。2. 指定的集群名称错误。1. 使用docker images确认镜像存在。2. 使用kind get clusters查看所有集群确保--name参数正确。集群资源CPU/内存不足创建的节点过多或 Docker 本身资源限制过低。1. 调整 Docker DesktopmacOS/Windows或 Docker EngineLinux的资源限制。2. 减少 kind 集群的节点数量。3. 删除不用的集群释放资源。通用排查命令 当遇到问题时按顺序执行以下命令通常能定位到原因# 1. 查看集群列表和状态 kind get clusters # 2. 查看特定集群的详细信息 kind export logs --name cluster-name # 导出集群日志到当前目录 # 3. 查看 Docker 容器状态即 kind 节点 docker ps -a | grep kind # 4. 查看 Kubernetes 节点和系统 Pod 状态 kubectl get nodes -o wide kubectl get pods -A -o wide # 5. 查看具体出错资源的描述和事件 kubectl describe resource-type resource-name -n namespace8. 最佳实践与工程建议将 kind 用于日常开发和测试时遵循一些最佳实践可以提升效率和稳定性。8.1 配置文件版本控制将你的 kind 集群配置文件如kind-config.yaml纳入版本控制系统如 Git。这样团队所有成员都可以使用完全相同的配置创建集群保证了环境的一致性。配置文件里可以定义节点数量、Kubernetes 版本、端口映射、存储挂载等。8.2 使用脚本自动化将集群的创建、镜像加载、应用部署、测试执行和集群销毁等一系列步骤编写成 Shell 脚本或 Makefile。这对于 CI/CD 流水线尤其有用。示例脚本setup-kind-cluster.sh#!/bin/bash set -e CLUSTER_NAMEdev-test echo 1. 删除旧集群如果存在... kind delete cluster --name $CLUSTER_NAME 2/dev/null || true echo 2. 使用配置文件创建新集群... kind create cluster --name $CLUSTER_NAME --config ./kind-config.yaml echo 3. 等待集群就绪... sleep 10 kubectl wait --forconditionReady nodes --all --timeout120s echo 4. 加载本地应用镜像... kind load docker-image my-app:latest --name $CLUSTER_NAME echo 5. 部署应用... kubectl apply -f ./k8s-manifests/ echo Kind 集群 $CLUSTER_NAME 已就绪8.3 镜像管理策略对于需要频繁修改和测试的镜像使用kind load是高效的。但对于相对稳定的基础镜像如nginx,redis可以考虑在配置文件中使用nodes的image字段预先指定或者让集群从镜像仓库拉取以减少重复加载的时间。8.4 资源清理养成随手清理的习惯。不使用的 kind 集群会持续占用 Docker 资源磁盘、内存。在每天工作结束或一个测试周期完成后使用kind delete cluster清理掉测试集群。你可以结合docker system prune -a来清理 Docker 系统中无用的镜像、容器和卷但这会删除所有未使用的 Docker 资源请谨慎操作。8.5 与 Helm 和 GitOps 工具集成kind 是测试 Helm Chart 或 ArgoCD/Flux 等 GitOps 工具的完美沙盒。你可以在本地 kind 集群中安装 Helmkubectl apply -f https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3部署一个复杂的 Helm Chart验证其模板渲染和部署流程。配置 ArgoCD让其从 Git 仓库同步应用到 kind 集群测试完整的 GitOps 工作流。8.6 性能调优如果你的机器资源有限可以考虑以下优化减少节点数非必要不使用多节点集群单控制平面节点足以满足大多数功能测试。调整节点资源在 kind 配置文件中可以通过kubeadmConfigPatches为节点配置更少的资源需谨慎可能影响系统组件运行。使用轻量级基础镜像如果你自定义节点镜像选择 Alpine 等更小的基础镜像。通过以上步骤你不仅能在 Ubuntu 上顺利安装和使用 kind还能掌握其核心操作、故障排查方法以及融入日常开发流程的最佳实践。kind 以其极致的轻量和速度成为了连接本地开发与云原生世界的理想桥梁。