快速入门

本指南介绍如何开始使用 kind 命令。

如果您遇到问题,请参阅 已知问题 指南。

内容 🔗︎

安装 🔗︎

注意kind 不需要 kubectl,但您将无法在我们的文档中执行某些示例,除非您安装了它。要安装 kubectl,请参阅上游 kubectl 安装文档

如果您是 Go 开发人员,您可能会发现 go install 选项 很方便。

否则,我们提供可下载的 发布二进制文件、社区管理的 软件包源代码安装指南

通常强烈建议使用稳定的标记版本(当前为 v0.23.0),尤其是在 CI 使用中。

如果您正在开发 Kubernetes 本身(在 HEAD 或最新源代码中),您可能需要从 HEAD 安装最新代码。

从发布二进制文件安装 🔗︎

预构建的二进制文件可在我们的 发布页面 上获得。

要安装,请从“资产”中下载适合您平台的二进制文件,然后将其重命名为 kind(或在 Windows 上可能是 kind.exe),并将此文件放在您首选的二进制文件安装目录中的 $PATH 中。

在 Linux 上

# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.kubernetes.ac.cn/dl/v0.23.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.kubernetes.ac.cn/dl/v0.23.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

在 macOS 上

# For Intel Macs
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.kubernetes.ac.cn/dl/v0.23.0/kind-darwin-amd64
# For M1 / ARM Macs
[ $(uname -m) = arm64 ] && curl -Lo ./kind https://kind.kubernetes.ac.cn/dl/v0.23.0/kind-darwin-arm64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

在 Windows 上的 PowerShell

curl.exe -Lo kind-windows-amd64.exe https://kind.kubernetes.ac.cn/dl/v0.23.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

从源代码安装 🔗︎

除了上面列出的预构建二进制文件 + 包管理器安装选项之外,您还可以使用 go install sigs.k8s.io/[email protected] 从源代码安装 kind,或者克隆此仓库并从仓库中运行 make build

使用 make 安装 🔗︎

使用 make build 不需要安装 Go,并将可重复地构建 kind,二进制文件将位于您克隆的仓库中的 bin/kind 中。

您只需要 make 和标准用户空间实用程序来运行此构建,它将使用我们提供的 gimme 的已售版本自动获取正确的 Go 版本。

然后,您可以调用 ./bin/kind 来使用它,或者将 bin/kind 复制到系统 PATH 中的某个目录中,以便从命令行将其用作 kind

make install 将尝试模仿 go install,并且具有与下面的 go install 相同的路径要求。

使用 go install 安装 🔗︎

使用 Go 安装时,请使用最新的稳定 Go 版本。至少需要 go1.16 或更高版本。

要安装,请使用:go install sigs.k8s.io/[email protected]

如果您是从本地源代码克隆构建的,请从克隆的顶层目录使用 go install .

go install 通常会将 kind 二进制文件放在 go env GOPATH 下的 bin 目录中,有关此方面的更多信息,请参阅 Go 的 “编译和安装包和依赖项”。如果您在安装后遇到 kind: command not found 错误,您可能需要将该目录添加到 $PATH 中,您可以在 https://gist.github.com/nex3/c395b2f8fd4b02068be37c961301caa7#file-path-md 找到将目录添加到 PATH 的指南。

使用包管理器安装 🔗︎

kind 社区已通过以下包管理器启用安装。

注意:以下是社区支持的努力。kind 维护人员不参与这些软件包的创建,上游社区对它们的有效性、安全性或内容不作任何声明。

在 macOS 上通过 Homebrew

brew install kind

在 macOS 上通过 MacPorts

sudo port selfupdate && sudo port install kind

在 Windows 上通过 Chocolatey (https://chocolatey.org/packages/kind)

choco install kind

在 Windows 上通过 Scoop (https://scoop.sh/#/apps?q=kind&id=faec311bb7c6b4a174169c8c02358c74a78a10c2)

scoop bucket add main
scoop install main/kind

在 Windows 上通过 Winget (https://github.com/microsoft/winget-pkgs/tree/master/manifests/k/Kubernetes/kind)

winget install Kubernetes.kind

创建集群 🔗︎

创建 Kubernetes 集群就像 kind create cluster 一样简单。

这将使用预构建的 节点镜像 引导 Kubernetes 集群。预构建的镜像托管在 kindest/node 上,但要找到适合特定版本的镜像,您应该查看 发布说明,了解您给定 kind 版本(使用 kind version 检查)的完整镜像列表。

要指定其他镜像,请使用 --image 标志 - kind create cluster --image=...

使用不同的镜像可以更改创建的集群的 Kubernetes 版本。

如果您希望使用自定义版本自己构建节点镜像,请参阅 构建镜像 部分。

默认情况下,集群将被赋予 kind 的名称。使用 --name 标志为集群分配不同的上下文名称。

如果您希望 create cluster 命令阻塞,直到控制平面达到就绪状态,您可以使用 --wait 标志并指定超时时间。要使用 --wait,您必须指定等待时间的单位。例如,要等待 30 秒,请执行 --wait 30s,要等待 5 分钟,请执行 --wait 5m 等。

可以使用 kind create cluster --help 发现更多用法。

kind 可以自动检测已安装的 dockerpodmannerdctl 并选择可用的一个。如果您想关闭自动检测,请使用环境变量 KIND_EXPERIMENTAL_PROVIDER=dockerKIND_EXPERIMENTAL_PROVIDER=podmanKIND_EXPERIMENTAL_PROVIDER=nerdctl 来选择运行时。

与您的集群交互 🔗︎

创建集群 后,您可以使用 kubectl 与其交互,方法是使用 kind 生成的配置文件

默认情况下,集群访问配置存储在 ${HOME}/.kube/config 中,如果未设置 $KUBECONFIG 环境变量。

如果设置了 $KUBECONFIG 环境变量,则将其用作路径列表(您系统上的正常路径分隔规则)。这些路径将合并。当修改值时,它将在定义节的文件中修改。当创建值时,它将在第一个存在的文件中创建。如果链中没有文件存在,则它将在列表中的最后一个文件中创建。

您可以在创建集群时使用 --kubeconfig 标志,然后只加载该文件。该标志只能设置一次,并且不会进行合并。

要查看您创建的所有集群,可以使用 get clusters 命令。

例如,假设您创建了两个集群

kind create cluster # Default cluster context name is `kind`.
...
kind create cluster --name kind-2

当您列出您的 kind 集群时,您将看到类似以下内容

kind get clusters
kind
kind-2

为了与特定集群交互,您只需要在 kubectl 中指定集群名称作为上下文

kubectl cluster-info --context kind-kind
kubectl cluster-info --context kind-kind-2

删除集群 🔗︎

如果您使用 kind create cluster 创建了集群,那么删除同样简单

kind delete cluster

如果未指定 --name 标志,kind 将使用默认集群上下文名称 kind 并删除该集群。

注意:根据设计,请求删除不存在的集群不会返回错误。这是故意的,并且是清理资源的幂等方式。

将镜像加载到您的集群中 🔗︎

Docker 镜像可以使用以下命令加载到您的集群节点中

kind load docker-image my-custom-image-0 my-custom-image-1

注意:如果您使用的是命名集群,您需要指定要将镜像加载到的集群的名称:kind load docker-image my-custom-image-0 my-custom-image-1 --name kind-2

此外,可以使用以下命令加载镜像存档:kind load image-archive /my-image-archive.tar

这允许以下工作流程

docker build -t my-custom-image:unique-tag ./my-image-dir
kind load docker-image my-custom-image:unique-tag
kubectl apply -f my-manifest-using-my-image:unique-tag

注意:您可以使用 docker exec 获取集群节点上存在的镜像列表

docker exec -it my-node-name crictl images

其中 my-node-name 是 Docker 容器的名称(例如 kind-control-plane)。

注意:Kubernetes 默认拉取策略是 IfNotPresent,除非镜像标签是 :latest 或省略(并隐式为 :latest),在这种情况下,默认策略是 AlwaysIfNotPresent 使 Kubelet 在镜像已存在的情况下跳过拉取镜像。如果您希望加载到节点中的这些镜像按预期工作,请

  • 不要使用 :latest 标签

和/或

  • 在您的容器上指定 imagePullPolicy: IfNotPresentimagePullPolicy: Never

有关更多信息,请参阅 Kubernetes imagePullPolicy

另请参阅:将 kind 与私有注册表一起使用

构建镜像 🔗︎

注意:如果您使用的是 Docker Desktop,请务必先阅读 Docker Desktop 设置

kind 使用 Docker 容器作为“节点”运行本地 Kubernetes 集群。kind 使用 node-image 来运行 Kubernetes 工件,例如 kubeadmkubeletnode-image 又基于 base-image 构建,后者安装了 Docker 和 Kubernetes 在容器中运行所需的所有依赖项。

目前,如果您在主机上拥有 Kubernetes 源代码($GOPATH/src/k8s.io/kubernetes),kind 支持使用 source 构建 node-image 的一种默认方法。

您也可以使用以下方法指定不同的 Kubernetes 源代码路径:

kind build node-image /path/to/kubernetes/source

注意:构建 Kubernetes 节点镜像需要构建上游 Kubernetes 所需的一切,我们包装了上游构建。这包括带有 buildx 的 Docker。请参阅:https://git.k8s.io/community/contributors/devel/development.md#building-kubernetes-with-docker

使用 Kubernetes 版本的一种快捷方式是直接指定版本以获取官方的 tar 压缩文件

kind build node-image v1.30.0

如果您更喜欢使用现有的 tar 压缩文件(例如来自 Kubernetes 版本的 tar 压缩文件),您也可以从 URL 或本地目录指定这些文件,例如

kind build node-image https://dl.k8s.io/v1.30.0/kubernetes-server-linux-arm64.tar.gz
kind build node-image $HOME/Downloads/kubernetes-server-linux-amd64.tar.gz

为了避免混淆,您可以使用 --type 参数显式指定构建类型,请参阅以下示例

kind build node-image --type url https://dl.k8s.io/v1.30.0/kubernetes-server-linux-arm64.tar.gz
kind build node-image --type file $HOME/Downloads/kubernetes-server-linux-amd64.tar.gz
kind build node-image --type release v1.30.0
kind build node-image --type source $HOME/go/src/k8s.io/kubernetes/

注意:除了源目录之外的其他模式,即 urlfilerelease,仅在 kind v0.24 及更高版本中可用。

Docker Desktop 设置 🔗︎

如果您在 macOS 或 Windows 上构建 Kubernetes(例如 - kind build node-image),那么您需要至少为运行 Docker 引擎的虚拟机 (VM) 分配 6GB 的 RAM。建议使用 8GB。

要更改 Docker for Mac 的资源限制,您需要打开首选项菜单。

现在,转到高级设置页面,并更改那里的设置,请参阅 更改 Docker 的资源限制在 Docker for Mac 中设置 8GB 内存

要更改 Docker for Windows 的资源限制,您需要右键单击任务栏上的 Moby 图标,然后选择“设置”。如果您看到“切换到 Linux 容器”,那么您需要先执行此操作,然后再打开“设置”。

现在,转到高级设置页面,并更改那里的设置,请参阅 更改 Docker 的资源限制

Setting 8Gb of memory in Docker for Windows

您也可以尝试删除 Docker 引擎留下的任何未使用的數據 - 例如,docker system prune

高级 🔗︎

配置您的 kind 集群 🔗︎

有关示例 kind 配置文件,请参阅 kind-example-config。要创建集群时指定配置文件,请使用 --config 标志

kind create cluster --config kind-example-config.yaml

多节点集群 🔗︎

特别是,许多用户可能对多节点集群感兴趣。可以使用以下配置文件内容实现此目的的简单配置

# three node (two workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

控制平面高可用性 🔗︎

您还可以拥有一个具有多个控制平面节点的集群

# a cluster with 3 control-plane nodes and 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

将端口映射到主机 🔗︎

您可以使用 extraPortMappings 将节点的额外端口映射到主机。

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: udp # Optional, defaults to tcp

如果使用 NodePort 服务或暴露主机端口的守护进程集,这将很有用。

注意:将 listenAddress 绑定到 127.0.0.1 可能会影响您访问服务的权限。

您可能想查看 Ingress 指南负载均衡器指南

设置 Kubernetes 版本 🔗︎

您还可以通过设置 node 的容器镜像来设置特定的 Kubernetes 版本。您可以在 发布页面 上找到可用的镜像标签。请使用您所需 Kubernetes 版本的 sha256 shasum,如本示例所示

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.16.4@sha256:b91a2c2317a000f3a783489dfb755064177dbc3a0b2f4147d50f04825d016f55
- role: worker
  image: kindest/node:v1.16.4@sha256:b91a2c2317a000f3a783489dfb755064177dbc3a0b2f4147d50f04825d016f55

在您的集群中启用功能门 🔗︎

功能门是一组键值对,用于描述 alpha 或实验性功能。为了启用门,您必须 自定义您的 kubeadm 配置,这将取决于您要启用的门和组件。示例 kind 配置可以是

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
featureGates:
  FeatureGateName: true

配置 kind 以使用代理 🔗︎

如果您在需要代理的环境中运行 kind,则可能需要配置 kind 以使用它。

您可以使用以下一个或多个 环境变量 配置 kind 以使用代理(大写优先)

注意:如果您设置了代理,它将传递给 kind 节点中的所有内容。kind 会在将 NO_PROXY 传递给节点之前自动将某些地址追加到其中,以便 Kubernetes 组件直接相互连接,但您可能需要根据您的使用情况配置其他地址。

导出集群日志 🔗︎

kind 能够导出所有与 kind 相关的日志,供您探索。要导出默认集群(上下文名称为 kind)的所有日志

kind export logs
Exported logs to: /tmp/396758314

与所有其他命令一样,如果您想对具有不同上下文名称的集群执行操作,请使用 --name 标志。

如您所见,kind 将集群 kind 的所有日志放置在一个临时目录中。如果您想指定一个位置,只需在命令后添加目录的路径

kind export logs ./somedir
Exported logs to: ./somedir

日志的结构或多或少如下所示

.
├── docker-info.txt
└── kind-control-plane/
    ├── containers
    ├── docker.log
    ├── inspect.json
    ├── journal.log
    ├── kubelet.log
    ├── kubernetes-version.txt
    └── pods/

日志包含有关 Docker 主机、运行 kind 的容器、Kubernetes 集群本身等的信息。