使用 Kind 在離線環境創建 K8S 集群

背景

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 命令下載鏡像:

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

接下來,你可以使用 docker save 命令,將鏡像保存為一個 tar 包:

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

如果你覺得鏡像體積太大,並且你也已經安裝了 gzip 的話,可以使用以下命令,將鏡像保存為經 gzip 格式的壓縮包。

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

在目標機器上,你可以使用 docker load 命令將鏡像加載至 docker daemon 的存儲中:

<code>(MoeLove) ➜  ~ docker load -i kind.v1.17.0.tarLoaded image ID: sha256:ec6ab22d89efc045f4da4fc862f6a13c64c0670fa7656fbecdec5307380f9cb0# 或者➜  ~ docker load -i kind.v1.17.0.tar.gzLoaded image ID: sha256:ec6ab22d89efc045f4da4fc862f6a13c64c0670fa7656fbecdec5307380f9cb0/<code>

至此,你便可以通過以下命令,使用已經導入的鏡像來創建集群:

<code>(MoeLove) ➜  ~ kind create cluster --image kindest/node:v1.17.0@sha256:9512edae126da271b66b990b6fff768fbb7cd786c7d39e86bdf55906352fdf62Creating 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-kindHave a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community /<code>

PS:在下載 Docker 鏡像的步驟中,如果你沒有安裝 Docker,那你也可以有其他選擇,比如使用 skopeo 之類的工具。

自行構建鏡像

如果你在對 Kubernetes 進行開發,或是 Kind 維護團隊沒有發佈特定 Kubernetes 版本的預構建的鏡像,那你可以自行構建鏡像。

需要注意的是,構建鏡像時需要網絡和一定的磁盤空間。你可以在構建完鏡像後,使用上一節提到的辦法在離線環境使用。

構建 base 鏡像

需要提前準備好 kind 的源代碼

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

接下來便可使用以下命令構建 base 鏡像了。

<code>(MoeLove) ➜  ~ kind build base-image --image kindest/base:latest --source $GOPATH/src/sigs.k8s.io/kind/images/baseBuilding base image in: /tmp/kind-base-image147474678Starting Docker build ......Successfully tagged kindest/base:latestDocker build completed./<code>

構建完 base 鏡像,還需要以此鏡像作為基礎構建 node 鏡像。

構建 node 鏡像

使用此方法,需要你提前準備好 Kubernetes 源代碼,你可以參考 Kubernetes 項目的說明下載 Kubernetes 源代碼,或者將源代碼拷貝至目標機器的對應位置。

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

接下來你便可以使用以下命令構建 node 鏡像了

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

鏡像構建成功後,便可使用此鏡像來創建集群了。

<code>(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-kindHave a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community /<code>

檢查集群節點信息

<code>(MoeLove) ➜  ~ kubectl get node NAME                 STATUS   ROLES    AGE   VERSIONkind-control-plane   Ready    master   40s   v1.18.0-alpha.0.3222+4b294079458a72/<code>

可以看到集群版本是當前 kubernetes 源碼的版本了。

總結

本文介紹了兩類使用 Kind 創建 Kubernetes 集群的方法,分別是使用 Kind 預發佈的鏡像和使用 Kubernetes 源代碼構建鏡像。

以上兩種方法,鏡像中均已包含創建 Kubernetes 集群所需的全部資源,無需再額外下載。(這也是和之前版本最大的區別)

系列文章

  • 使用 Kind 搭建你的本地 Kubernetes 集群​: https://zhuanlan.zhihu.com/p/60464867
使用 Kind 在離線環境創建 K8S 集群

(使用了 0.2.0 版本,部分內容已過期)

  • How to Test a Kubernetes PR with KIND​mauilion.dev: https://mauilion.dev/posts/kind-k8s-testing/


歡迎訂閱我的文章公眾號【MoeLove】


分享到:


相關文章: