使用 Kind 在离线环境创建 K8S 集群

1,673 阅读5分钟

Kind 是我很喜欢也一直在参与的项目,我计划将 Kind 相关的文章写成一个系列。这是第二篇。

同时,本文也可作为 《Kubernetes 从上手到实践》 第四节内容的补充,搭配食用效果更佳~

背景

Kind 是 Kubernetes In Docker 的缩写,顾名思义是使用 Docker 容器作为 Node 并将 Kubernetes 部署至其中的一个工具。现在包括 Kubernetes 自身在内的很多云原生基础项目都将 Kind 应用于自身的 e2e 测试或项目的入门示例中。

默认情况下使用 Kind 创建 Kubernetes 集群,只需要先安装好 Kind 执行 kind create cluster 便可, Kind 会自动下载所需的 Docker 镜像,并启动集群。

但是,在某些情况下,我们也会有需要在离线环境中启动 Kubernetes 集群的需求。本篇文章我来为你介绍两种使用 Kind 在离线环境创建 Kubernetes 集群的方式。

使用预构建镜像

Kind 在每次发布版本时,会同时构建并发布默认使用的镜像,目前托管在 Docker Hub 上。建议你使用在每次 ReleaseNote 中指定了 shasum 的镜像。

当你在离线环境中想要使用 Kind 预构建的镜像创建集群时,你可以在任意可联网的机器上或目标机器上有网络的情况下,提前下载该镜像,并拷贝至需要创建集群的目标机器上。

如果你的机器上已经安装了 Docker,那可以直接使用 docker pull 命令下载镜像:

(MoeLove) ➜  ~ docker pull kindest/node:v1.17.0@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62
sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62: Pulling from kindest/node
cc5a81c29aab: Pull complete 
81c62728355f: Pull complete 
ed9cffdd962a: Pull complete 
6a46f000fce2: Pull complete 
6bd890da28be: Pull complete 
0d88bd219ffe: Pull complete 
af5240f230f0: Pull complete 
Digest: sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62
Status: Downloaded newer image for kindest/node@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62
docker.io/kindest/node:v1.17.0@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62

接下来,你可以使用 docker save 命令,将镜像保存为一个 tar 包:

(MoeLove) ➜  ~ docker save -o kind.v1.17.0.tar kindest/node:v1.17.0@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62

如果你觉得镜像体积太大,并且你也已经安装了 gzip 的话,可以使用以下命令,将镜像保存为经 gzip 格式的压缩包。

(MoeLove) ➜  ~ docker save kindest/node:v1.17.0@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62 | gzip > kind.v1.17.0.tar.gz

在目标机器上,你可以使用 docker load 命令将镜像加载至 docker daemon 的存储中:

(MoeLove) ➜  ~ docker load -i kind.v1.17.0.tar
Loaded image ID: sha256:ec6ab22d89efc045f4da4fc862f6a13c64c0670fa7656fbecdec5307380f9cb0
# 或者
➜  ~ docker load -i kind.v1.17.0.tar.gz
Loaded image ID: sha256:ec6ab22d89efc045f4da4fc862f6a13c64c0670fa7656fbecdec5307380f9cb0

至此,你便可以通过以下命令,使用已经导入的镜像来创建集群:

(MoeLove) ➜  ~ kind create cluster --image kindest/node:v1.17.0@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.17.0) 🖼
 ✓ 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

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

PS:在下载 Docker 镜像的步骤中,如果你没有安装 Docker,那你也可以有其他选择,比如使用 skopeo 之类的工具。

自行构建镜像

如果你在对 Kubernetes 进行开发,或是 Kind 维护团队没有发布特定 Kubernetes 版本的预构建的镜像,那你可以自行构建镜像。

需要注意的是,构建镜像时需要网络和一定的磁盘空间。你可以在构建完镜像后,使用上一节提到的办法在离线环境使用。

构建 base 镜像

需要提前准备好 kind 的源代码

(MoeLove) ➜  ~ mkdir -p $GOPATH/src/sigs.k8s.io
(MoeLove) ➜  ~ cd $GOPATH/src/sigs.k8s.io
(MoeLove) ➜  ~ git clone https://github.com/kubernetes-sigs/kind

接下来便可使用以下命令构建 base 镜像了。

(MoeLove) ➜  ~ kind build base-image --image kindest/base:latest --source $GOPATH/src/sigs.k8s.io/kind/images/base
Building base image in: /tmp/kind-base-image147474678
Starting Docker build ...
...
Successfully tagged kindest/base:latest
Docker build completed.

构建完 base 镜像,还需要以此镜像作为基础构建 node 镜像。

构建 node 镜像

使用此方法,需要你提前准备好 Kubernetes 源代码,你可以参考 Kubernetes 项目的说明下载 Kubernetes 源代码,或者将源代码拷贝至目标机器的对应位置。

(MoeLove) ➜  ~ mkdir -p $GOPATH/src/k8s.io
(MoeLove) ➜  ~ cd $GOPATH/src/k8s.io
(MoeLove) ➜  ~ git clone https://github.com/kubernetes/kubernetes

接下来你便可以使用以下命令构建 node 镜像了

(MoeLove) ➜  ~ kind build node-image --base-image kindest/base:latest --image kindest/node:latest --kube-root $GOPATH/src/k8s.io/kubernetes
Starting to build Kubernetes
+++ [0205 11:21:38] Verifying Prerequisites....
...
Image build completed.

镜像构建成功后,便可使用此镜像来创建集群了。

(MoeLove) ➜  ~ kind create cluster --image kindest/node:latest                            
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:latest) 🖼
 ✓ 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

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

检查集群节点信息

(MoeLove) ➜  ~ kubectl get node 
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   40s   v1.18.0-alpha.0.3222+4b294079458a72

可以看到集群版本是当前 kubernetes 源码的版本了。

总结

本文介绍了两类使用 Kind 创建 Kubernetes 集群的方法,分别是使用 Kind 预发布的镜像和使用 Kubernetes 源代码构建镜像。

以上两种方法,镜像中均已包含创建 Kubernetes 集群所需的全部资源,无需再额外下载。(这也是和之前版本最大的区别)

系列文章

推荐阅读


可以通过下面二维码订阅我的文章公众号【MoeLove】

TheMoeLove