资讯动态

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

发布时间:2026/8/23 6:46:28 来源:尧图企业网站定制
在 Ubuntu 上搭建一个轻量级的 Kubernetes 开发或测试环境Kind 是目前最受推崇的工具之一。它通过将 Kubernetes 节点直接运行在 Docker 容器中实现了“Kubernetes in Docker”的设计理念让你能在几秒钟内启动一个功能完整的 K8s 集群而无需管理复杂的虚拟机或云资源。这对于本地开发、CI/CD 流水线测试、学习 Kubernetes 概念和 API 来说是一个近乎完美的解决方案。本文将带你从零开始在 Ubuntu 系统上完成 Kind 的安装、集群创建、基本操作并深入探讨其工作原理、常见问题排查以及生产级使用的最佳实践。1. 理解 Kind 的核心价值与工作原理在开始动手之前理解 Kind 解决了什么问题以及它是如何工作的能帮助你更好地使用它并在遇到问题时知道从哪里着手。1.1 Kind 解决了什么痛点传统的本地 Kubernetes 环境搭建如 Minikube、kubeadm 等通常需要虚拟机或对宿主机有较高的权限和复杂的配置。Kind 另辟蹊径它利用 Docker 容器作为“节点”每个容器都运行着一个微型的 Linux 系统通常是基于 Ubuntu 或类似发行版和必要的 Kubernetes 组件kubelet、kube-apiserver 等。这带来了几个显著优势极速启动与销毁集群的创建和删除速度极快通常在 30 秒到 2 分钟内完成非常适合需要频繁重建环境的场景。资源占用低相比虚拟机方案容器化节点对 CPU 和内存的 overhead 更小。环境一致性基于容器镜像确保了每次创建的集群环境完全一致。支持多节点集群可以轻松创建包含多个控制平面Control Plane和工作节点Worker Node的集群模拟真实的多节点拓扑。易于调试所有组件都运行在容器内你可以直接使用docker exec或docker logs命令进入节点容器查看日志或执行命令调试体验非常直接。1.2 Kind 的底层架构一个由 Kind 创建的集群其架构可以这样理解容器即节点你通过kind create cluster命令创建的“节点”实际上是一个个 Docker 容器。控制平面节点容器内运行着kube-apiserver、etcd、kube-controller-manager、kube-scheduler等组件工作节点容器内则运行着kubelet和kube-proxy。Docker 网络Kind 会创建一个独立的 Docker 网络所有节点容器都接入这个网络它们之间通过 Docker 的内部 DNS 和网络进行通信。Kubeconfig 配置集群创建成功后Kind 会自动在~/.kube/config文件中生成或更新一个上下文context指向这个新集群的 API Server通常映射到了宿主机的某个端口。负载镜像加载Kind 的一个关键特性是能够将本地 Docker 镜像直接“加载”到集群的节点容器中无需推送到外部镜像仓库。这对于开发测试循环至关重要。2. 安装前的环境准备与检查Kind 的运行强依赖于 Docker。因此在安装 Kind 之前必须确保你的 Ubuntu 系统已经正确安装并运行了 Docker。2.1 系统要求与 Docker 安装首先确认你的 Ubuntu 系统版本。Kind 支持主流的 LTS 版本如 20.04 (Focal)、22.04 (Jammy) 等。步骤一更新系统包索引sudo apt update步骤二安装 Docker 的依赖包sudo apt install -y apt-transport-https ca-certificates curl software-properties-common步骤三添加 Docker 的官方 GPG 密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg步骤四设置 Docker 稳定版仓库echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.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 update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin步骤六启动 Docker 服务并设置开机自启sudo systemctl start docker sudo systemctl enable docker步骤七将当前用户加入 docker 组避免每次使用sudosudo usermod -aG docker $USER重要执行此命令后你需要注销并重新登录或者新开一个终端用户组变更才会生效。步骤八验证 Docker 安装docker --version docker run hello-world如果能看到 Docker 版本信息以及 “Hello from Docker!” 的成功消息说明 Docker 安装成功。2.2 解决潜在的虚拟化支持问题在安装或启动 Docker Desktop或某些环境下时你可能会遇到类似virtualization support not detected或failed to start because virtualisation support wasn’t detected的错误。这通常意味着你的系统 BIOS/UEFI 中未启用虚拟化技术Intel VT-x 或 AMD-V或者宿主机是虚拟机且嵌套虚拟化未开启。对于在物理机上安装 Ubuntu 的情况重启电脑进入 BIOS/UEFI 设置界面通常在开机时按 F2、F10、Del 等键。找到与虚拟化相关的选项如Intel Virtualization Technology、VT-x、AMD-V或SVM Mode将其设置为Enabled。保存并退出。对于在VMware 或 VirtualBox 虚拟机中运行 Ubuntu 的情况你需要确保宿主机的虚拟化已开启同上。在 VMware 虚拟机设置中找到处理器选项勾选虚拟化 Intel VT-x/EPT 或 AMD-V/RVI。在 VirtualBox 中创建虚拟机时选择启用嵌套分页/AMD-V或启用 VT-x/AMD-V。验证虚拟化是否启用# 方法一检查 /proc/cpuinfo grep -E --color vmx|svm /proc/cpuinfo # 如果有输出vmx 对应 Intelsvm 对应 AMD则表示已启用。 # 方法二使用 kvm-ok 命令需要安装 cpu-checker sudo apt install -y cpu-checker kvm-ok # 输出 “KVM acceleration can be used” 表示正常。3. 安装 Kind 并创建你的第一个集群Docker 环境就绪后安装 Kind 本身非常简单。3.1 下载并安装 Kind 二进制文件Kind 是一个单独的 Go 二进制文件我们可以直接从其 GitHub 发布页面下载。步骤一下载最新稳定版的 Kind访问 Kind 的 GitHub Releases 页面 查看最新版本号例如v0.20.0然后使用curl下载。# 将下面的 v0.20.0 替换为最新的稳定版本号 KIND_VERSIONv0.20.0 curl -Lo ./kind https://kind.sigs.k8s.io/dl/${KIND_VERSION}/kind-linux-amd64步骤二赋予执行权限并移动到系统 PATHchmod x ./kind sudo mv ./kind /usr/local/bin/步骤三验证安装kind version如果输出类似kind v0.20.0 go1.20.5 linux/amd64的信息说明安装成功。3.2 创建默认的单节点集群现在你可以用一行命令创建一个最简单的 Kubernetes 集群。kind create cluster这条命令会执行以下操作拉取默认的节点镜像如kindest/node:v1.27.3。创建一个 Docker 容器作为控制平面节点。在该节点容器内启动所有 Kubernetes 控制平面组件。配置kubectl的上下文context指向这个新集群。命令输出末尾会提示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-kind验证集群状态# 查看集群信息 kubectl cluster-info --context kind-kind # 查看所有节点 kubectl get nodes # 查看所有 Pod在 kube-system 命名空间 kubectl get pods -n kube-system你应该能看到一个名为kind-control-plane的节点状态为Ready并且kube-system命名空间下的核心 Pod如 CoreDNS都在运行。3.3 理解 Kind 的配置文件默认创建的是单节点集群。但 Kind 的强大之处在于可以通过一个 YAML 配置文件来定义复杂的集群拓扑。创建一个名为kind-config.yaml的文件# kind-config.yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 # 配置节点网络允许从宿主机访问 NodePort 服务 networking: apiServerAddress: 0.0.0.0 # 可选使 API Server 监听所有接口 apiServerPort: 6443 # 定义节点 nodes: # 第一个节点作为控制平面 - role: control-plane # 将宿主机的 80 端口映射到控制平面节点的 30000 端口 extraPortMappings: - containerPort: 30000 hostPort: 80 listenAddress: 0.0.0.0 protocol: TCP # 两个工作节点 - role: worker - role: worker这个配置文件定义了一个包含 1 个控制平面节点和 2 个工作节点的集群并且将宿主机的 80 端口映射到了控制平面节点的 30000 端口常用于访问 NodePort 类型的服务。使用配置文件创建集群kind create cluster --name multi-node-cluster --config kind-config.yaml创建后使用kubectl get nodes可以看到三个节点multi-node-cluster-control-plane,multi-node-cluster-worker,multi-node-cluster-worker2。4. 核心操作与开发工作流集群运行起来后你需要掌握几个与 Kind 特性紧密相关的核心操作。4.1 将本地镜像加载到 Kind 集群这是开发中最常用的功能。你本地构建了一个 Docker 镜像my-app:v1想直接在 Kind 集群中测试无需推送至远程仓库。方法一使用kind load docker-image# 假设你已构建镜像 my-app:v1 docker build -t my-app:v1 . # 将镜像加载到名为 kind 的默认集群 kind load docker-image my-app:v1 --name kind # 如果创建了多集群指定集群名 kind load docker-image my-app:v1 --name multi-node-cluster此命令会将镜像从本地 Docker 存储区导入到集群所有节点的容器中。方法二在配置文件中指定额外挂载高级你可以在kind-config.yaml中配置节点将宿主机的 Docker 守护进程套接字挂载到节点容器内这样节点内的kubelet可以直接使用宿主机的 Docker 来拉取镜像不推荐用于生产概念仅用于特定开发场景。4.2 访问集群服务在 Kind 中访问服务需要注意网络映射。ClusterIP 服务在集群内部通过服务名访问与普通 K8s 一致。NodePort 服务Kind 节点是容器没有独立的宿主机 IP。你需要使用extraPortMappings如前文配置将容器端口映射到宿主机端口然后通过localhost:hostPort访问。LoadBalancer 服务在本地 Kind 中LoadBalancer 类型的服务通常不会获得外部 IP。你可以使用MetalLB这样的工具在 Kind 中模拟负载均衡器或者使用port-forward。使用kubectl port-forward访问任意服务# 将本地的 8080 端口转发到集群中 my-service 服务的 80 端口 kubectl port-forward service/my-service 8080:80然后即可在浏览器中访问http://localhost:8080。4.3 查看日志与进入节点调试由于节点是容器调试非常方便。# 1. 查看特定节点的 Docker 容器日志 docker logs kind-control-plane # 对于默认集群的控制平面节点 docker logs multi-node-cluster-worker # 对于多节点集群的工作节点 # 2. 进入节点容器内部就像进入一台服务器 docker exec -it kind-control-plane bash # 在节点内部你可以查看进程、检查文件、查看 kubelet 日志等 ps aux | grep kube cat /var/log/kubelet.log4.4 删除与清理集群# 删除指定集群 kind delete cluster --name multi-node-cluster # 删除默认集群名为 kind kind delete cluster # 列出所有 kind 创建的集群 kind get clusters5. 常见问题排查清单使用 Kind 时可能会遇到一些问题下表列出了常见现象、原因及解决方案。问题现象可能原因检查与解决步骤kind create cluster失败提示超时或镜像拉取失败。1. 网络问题无法拉取kindest/node镜像。2. Docker 守护进程未运行或状态异常。1. 检查网络连接尝试docker pull kindest/node:v1.27.3手动拉取。2. 运行systemctl status docker确认 Docker 服务状态重启服务sudo systemctl restart docker。kubectl命令报错The connection to the server localhost:8080 was refused。kubectl未配置正确的上下文或~/.kube/config文件不存在/不正确。1. 运行kubectl cluster-info --context kind-kind确认上下文。2. 运行kubectl config get-contexts查看所有上下文使用kubectl config use-context kind-kind切换。3. 确认~/.kube/config文件是否存在且权限正确。无法从宿主机访问NodePort服务。创建集群时未配置extraPortMappings进行端口映射。1. 使用kubectl get svc查看服务的NodePort。2. 使用kubectl port-forward临时转发端口访问。3. 删除集群使用包含extraPortMappings的配置文件重新创建。执行kind load docker-image后Pod 仍提示ImagePullBackOff。1. 镜像未成功加载到所有节点。2. Pod 配置的镜像标签与加载的标签不一致。3. 加载到了错误的集群。1. 确认加载命令指向了正确的集群名--name。2. 使用docker exec -it node-name crictl images在节点容器内检查镜像是否存在。3. 确保 Deployment/Pod YAML 中指定的镜像名和标签与加载的完全一致。集群运行一段时间后节点状态变为NotReady。节点容器可能因为资源不足内存、CPU而挂起或崩溃。1. 使用docker ps -a查看节点容器状态是否已退出。2. 检查宿主机资源使用情况free -h,top。3. 考虑为 Docker 分配更多资源在 Docker Desktop 设置中或通过/etc/docker/daemon.json配置。4. 重启节点容器docker restart node-container-id。在 WSL2 中运行 Kind性能极差或端口无法访问。WSL2 与 Windows 主机之间的网络转发和文件系统性能问题。1. 将项目文件放在 WSL2 的 Linux 文件系统内如/home/youruser/projects而不是挂载的 Windows 盘符如/mnt/c/。2. 检查 Windows 防火墙是否阻止了端口。3. 考虑使用extraPortMappings并绑定到0.0.0.0。6. 生产环境考量与最佳实践虽然 Kind 主要用于开发和测试但了解其局限性并遵循最佳实践能让你更高效、更安全地使用它。6.1 Kind 的局限性非高可用控制平面节点是单点尽管可配置多个但仍在同一宿主机。资源隔离性弱节点共享宿主机的内核和资源不适合需要强隔离的场景。网络模型差异Kind 使用 Docker 网络与云上真实的 K8s 网络模型如 CNI 插件 Calico、Cilium 的某些高级特性可能存在行为差异。持久化存储节点容器本身是无状态的容器内数据随容器销毁而丢失。需要仔细配置hostPath卷或使用其他方案来持久化数据。6.2 针对开发测试的最佳实践使用配置文件版本控制将你的kind-config.yaml纳入 Git 仓库确保团队所有成员使用完全相同的集群配置。固定 Kubernetes 版本在配置文件中明确指定节点镜像版本避免因默认版本升级导致的不兼容。kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane image: kindest/node:v1.27.3sha256:... # 使用带摘要的镜像更安全 - role: worker image: kindest/node:v1.27.3sha256:...脚本化集群生命周期编写 Shell 脚本或 Makefile 来封装集群的创建、镜像加载、应用部署和清理操作提高效率。# deploy.sh 示例 #!/bin/bash set -e kind create cluster --config kind-config.yaml kind load docker-image my-app:latest kubectl apply -f k8s-manifests/集成到 CI/CD在 GitLab CI、GitHub Actions 等流水线中可以使用 Kind 快速创建一个干净的 K8s 环境来运行集成测试测试结束后自动销毁。资源管理在kind-config.yaml中可以为节点容器配置资源限制防止其占用过多宿主机资源。nodes: - role: control-plane kubeadmConfigPatches: - | kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-labels: ingress-readytrue extraMounts: - hostPath: ./shared-data containerPath: /data # 配置资源限制 extraArgs: - --cpus2 - --memory4G6.3 下一步探索方向当你熟练使用 Kind 进行基本操作后可以进一步探索以下方向构建更完善的本地开发环境安装 Ingress 控制器如ingress-nginx配合extraPortMappings实现方便的域名访问。配置持久化存储研究使用hostPath、local存储类或集成 Rancher 的local-path-provisioner。服务网格体验在 Kind 集群中安装Istio或Linkerd体验服务网格功能。GitOps 实践使用Argo CD或Flux部署到 Kind 集群实践声明式部署。监控与日志部署Prometheus、Grafana和Loki套件为你的测试应用添加可观测性。Kind 作为 Kubernetes in Docker 的实现极大地降低了学习和使用 Kubernetes 的门槛。通过本文的步骤你不仅能在 Ubuntu 上快速搭建起可用的集群更能理解其背后的机制并掌握高效使用和排查问题的方法。记住对于生产级负载Kind 并非设计目标但它无疑是连接本地开发与云上生产环境之间最得力的桥梁之一。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价