在本地快速搭建一个轻量级的 Kubernetes 集群进行开发测试,是很多云原生开发者的刚需。相比 minikube 或 k3s,kind 凭借其“Kubernetes in Docker”的设计理念,实现了秒级集群创建和销毁,资源占用极低,尤其适合 CI/CD 流水线和日常功能验证。本文将手把手带你完成在 Ubuntu 系统上安装和配置 kind 的全过程,涵盖从 Docker 环境准备、kind 安装、集群创建、到常用操作和故障排查,确保你能够顺利搭建属于自己的本地 K8s 沙箱环境。

1. 背景与核心概念

在深入安装步骤之前,我们有必要理解 kind 是什么,以及它解决了什么问题。

1.1 什么是 kind?

kind 是一个使用 Docker 容器作为“节点”来运行本地 Kubernetes 集群的工具。它的名字是 “Kubernetes IN Docker” 的缩写。kind 的主要目标是成为 Kubernetes 自身集成测试和开发的工具,但其轻量、快速的特点也让它成为了个人学习和项目开发的绝佳选择。

核心原理 :kind 将 Kubernetes 的各个组件(如 kube-apiserver, kube-controller-manager, etcd)都打包运行在 Docker 容器中。每个容器模拟一个 Kubernetes 节点(可以是控制平面节点,也可以是工作节点)。因此,你无需虚拟机,也无需复杂的系统配置,仅凭 Docker 就能获得一个功能完整的 K8s 集群。

1.2 kind 解决了什么问题?

  1. 环境一致性 :开发、测试环境与生产环境的 Kubernetes 版本、配置可以高度一致,避免“在我机器上好好的”问题。
  2. 资源高效 :相比启动完整的虚拟机,Docker 容器更加轻量,启动速度快,对宿主机资源(CPU、内存)消耗小。
  3. 快速迭代 :可以瞬间创建一个全新的集群进行测试,测试完成后一键删除,非常适合做破坏性实验或快速验证新功能。
  4. 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 核心依赖:Docker

kind 的基石是 Docker。你必须先安装并正确配置 Docker。

重要提示 :请确保安装的是 Docker Engine(社区版或企业版),而不是 docker.io 这个古老的 Ubuntu 仓库版本。我们将使用 Docker 官方提供的安装脚本或仓库。

  1. 卸载旧版本(可选但推荐) : 如果你的系统上存在旧的 Docker 版本,可以先进行卸载。

    sudo apt-get remove docker docker-engine docker.io containerd runc
    
  2. 安装依赖工具

    sudo apt-get update
    sudo apt-get install -y \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  3. 添加 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
    
  4. 设置 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
    
  5. 安装 Docker Engine

    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
  6. 验证 Docker 安装 : 运行一个 hello-world 镜像来测试 Docker 是否安装成功。

    sudo docker run hello-world
    

    如果看到 “Hello from Docker!” 等欢迎信息,说明 Docker 已正确安装并运行。

  7. (可选但重要)将当前用户加入 docker 组 : 为了避免每次运行 docker 命令都需要 sudo ,可以将你的用户加入 docker 组。

    sudo usermod -aG docker $USER
    

    注意 :执行此命令后,你需要 完全注销并重新登录 ,或者重启系统,才能使组权限生效。之后,你就可以直接使用 docker 命令而不加 sudo 了。

2.3 版本说明

本文撰写时使用的环境版本如下,但实际操作中请以最新稳定版为准:

  • Ubuntu : 22.04 LTS
  • Docker : 24.0.x
  • kind : v0.20.0
  • Kubernetes : 通过 kind 默认安装(通常为较新的稳定版,如 1.27, 1.28)

版本兼容性 :kind 项目会紧密跟随 Kubernetes 版本发布。安装 kind 后,你可以指定创建特定版本的 Kubernetes 集群。如果遇到问题,请查阅 kind 官方文档的发布说明。

3. 安装 kind 的多种方式

kind 本身是一个单独的 Go 二进制文件,安装非常简单。这里介绍三种主流安装方法。

3.1 方式一:使用 curl 下载二进制文件(推荐)

这是最直接、最通用的方法,适用于任何 Linux 发行版。

  1. 从 kind 的 GitHub Release 页面下载最新的二进制文件。

    # 下载 kind 二进制文件 (请检查官网获取最新版本号,以下 v0.20.0 为例)
    curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
    
  2. 赋予二进制文件可执行权限。

    chmod +x ./kind
    
  3. 将 kind 移动到系统 PATH 路径下(例如 /usr/local/bin )。

    sudo mv ./kind /usr/local/bin/kind
    
  4. 验证安装。

    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

这条命令会:

  1. 拉取默认的节点镜像(如 kindest/node:v1.27.3 )。
  2. 创建一个 Docker 容器作为 Kubernetes 控制平面节点。
  3. 在容器内部部署完整的 Kubernetes 组件。
  4. 生成一个 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-kind

4.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.6

4.4 使用配置文件创建多节点集群

kind 的强大之处在于可以通过一个 YAML 配置文件来定义复杂的集群拓扑结构。

  1. 创建配置文件 :新建一个文件,例如 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 个工作节点的集群。

  2. 使用配置文件创建集群

    kind create cluster --config multi-node-cluster.yaml --name multi-node-demo
    
  3. 验证节点 :集群创建完成后,使用 kubectl 查看节点状态。

    kubectl get nodes --context kind-multi-node-demo
    

    你应该能看到 4 个节点,并且状态都是 Ready

4.5 验证集群状态

无论以何种方式创建集群,都可以使用以下命令验证:

  1. 检查集群信息

    kubectl cluster-info --context kind-kind  # 如果集群名为默认的 kind
    
  2. 查看所有节点

    kubectl get nodes
    
  3. 查看所有 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 --short

5.2 kind 如何管理 kubeconfig

kind 创建集群后,会在 ~/.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 refused kubectl 没有找到正确的 kubeconfig 或上下文未设置。 1. 确认 ~/.kube/config 文件存在且包含 kind 集群的配置。
2. 运行 kubectl config get-contexts 查看并切换到正确的上下文: kubectl config use-context kind-kind
3. 检查 KUBECONFIG 环境变量是否指向了其他文件。
无法从宿主机访问集群内的服务(NodePort) 1. 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 Desktop(macOS/Windows)或 Docker Engine(Linux)的资源限制。
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 <namespace>

8. 最佳实践与工程建议

将 kind 用于日常开发和测试时,遵循一些最佳实践可以提升效率和稳定性。

8.1 配置文件版本控制

将你的 kind 集群配置文件(如 kind-config.yaml )纳入版本控制系统(如 Git)。这样,团队所有成员都可以使用完全相同的配置创建集群,保证了环境的一致性。配置文件里可以定义节点数量、Kubernetes 版本、端口映射、存储挂载等。

8.2 使用脚本自动化

将集群的创建、镜像加载、应用部署、测试执行和集群销毁等一系列步骤编写成 Shell 脚本或 Makefile。这对于 CI/CD 流水线尤其有用。

示例脚本 setup-kind-cluster.sh

#!/bin/bash
set -e

CLUSTER_NAME="dev-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 --for=condition=Ready nodes --all --timeout=120s

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 集群中:

  1. 安装 Helm: kubectl apply -f https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
  2. 部署一个复杂的 Helm Chart,验证其模板渲染和部署流程。
  3. 配置 ArgoCD,让其从 Git 仓库同步应用到 kind 集群,测试完整的 GitOps 工作流。

8.6 性能调优

如果你的机器资源有限,可以考虑以下优化:

  • 减少节点数 :非必要不使用多节点集群,单控制平面节点足以满足大多数功能测试。
  • 调整节点资源 :在 kind 配置文件中,可以通过 kubeadmConfigPatches 为节点配置更少的资源(需谨慎,可能影响系统组件运行)。
  • 使用轻量级基础镜像 :如果你自定义节点镜像,选择 Alpine 等更小的基础镜像。

通过以上步骤,你不仅能在 Ubuntu 上顺利安装和使用 kind,还能掌握其核心操作、故障排查方法以及融入日常开发流程的最佳实践。kind 以其极致的轻量和速度,成为了连接本地开发与云原生世界的理想桥梁。

更多推荐