天天看點

比Minikube更快,使用Kind快速建立K8S學習環境

K8S 如火如荼的發展着,越來越多人想學習和了解 K8S,但是由于 K8S 的入門曲線較高很多人望而卻步。

然而随着 K8S 生态的蓬勃發展,社群也呈現了越來越多的部署方案,光針對生産可用的環境就有好幾種部署方案,對于用來測試和學習環境也同樣提供了好幾種簡單可用的方案。

今天我們來介紹一種用于測試、學習環境快速搭建 K8S 環境的方案:Kind。

Kind 的官網是:https://kind.sigs.k8s.io/

運作架構圖如下:

比Minikube更快,使用Kind快速建立K8S學習環境

Kind 不是打包一個虛拟化鏡像,而是直接講 K8S 元件運作在 Docker。帶來了什麼好處呢?

不需要運作 GuestOS 占用資源更低。

不基于虛拟化技術,可以在 VM 中使用。

檔案更小,更利于移植。

Kind 支援多角色的節點部署,你可以通過配置檔案控制你需要幾個 Master 節點,幾個 Worker 節點,以更好的模拟生産中的實際環境。

Kind 的安裝非常簡單,隻有一個二進制檔案,如果大家嫌麻煩,可以直接去 GitHub releases 上下載下傳二進制檔案即可。

下面的安裝方式來自 Kind 文檔 https://kind.sigs.k8s.io/docs/user/quick-start/

如果你在 macOS 或 Windows 中使用 Docker 那麼至少需要設定 Docker VM 的記憶體至 6GB,Kind 建議設定為 8GB。 不是不基于虛拟化技術嗎?為什麼還有 Docker VM? 因為 Docker 其實隻支援 Linux,macOS 和 Windwos 是基于虛拟化技術建立了一個 Linux VM。在 Linux 系統上則不存在這些問題。

最簡單的情況,我們使用一條指令就能建立出一個單節點的 K8S 環境

可是呢,預設配置有幾個限制大多數情況是不滿足實際需要的,預設配置的主要限制如下:

APIServer 隻監聽了 127.0.0.1,也就意味着在 Kind 的本機環境之外無法通路 APIServer

由于國内的網絡情況關系,Docker Hub 鏡像站經常無法通路或逾時,會導緻無法拉取鏡像或拉取鏡像非常的慢

這邊提供一個配置檔案來解除上訴的限制:

<code>API_SERVER_ADDRESS</code> 配置區域網路 IP 或想監聽的 IP

<code>http://f1361db2.m.daocloud.io</code> 配置 Docker Hub 加速鏡像站點

更多的配置(多節點,節點中運作的 K8S 元件版本,APIServer 監聽端口,Pod、Service 子網,kubeProxy 模式,端口映射,本地卷持久化)可以檢視 Kind 的文檔

https://kind.sigs.k8s.io/docs/user/configuration/

建立完成效果如下:

比Minikube更快,使用Kind快速建立K8S學習環境

如果長時間卡在 <code>Ensuring node image (kindest/node:v1.18.2)</code> 這個步驟,可以使用 <code>docker pull kindest/node:v1.18.2</code> 來得到鏡像拉取進度條。

Kind 建立叢集完成後會将叢集的通路配置寫入到 <code>~/.kube/config</code> 中,可以複制或加入到有 kubectl 工具的環境中。

我們在 K8S 中部署應用程式,一般有 4 種方式通路他們。

直接通路 PodIP

通過 Service 的 ClusterIP 通路

通過 Service 的 NodePort 通路

通過 Ingress Service NodePort 通路

其中方式 1、2 需要通路用戶端在 K8S 網絡環境内。方式 3、4 其實是一種,通過機器的端口映射來觸達應用。

個人覺得直接通路 IP+端口更為友善,這邊不對 Ingress 做過多的介紹,大家可以看 Kind 關于 Ingress 的文檔。

https://kind.sigs.k8s.io/docs/user/ingress/

這邊介紹通過 <code>kubectl port-forward</code> 端口轉發的方式通路 K8S 中的應用。

yaml 如下:

效果如下

比Minikube更快,使用Kind快速建立K8S學習環境
比Minikube更快,使用Kind快速建立K8S學習環境

可以看到我們将本地的 8080 轉發到了 nginx service 的 80 端口,這時通路本地的 8080 端口就可以通路到 service nginx 的 80 端口。

可以的,<code>kind create cluster</code> 提供了 <code>--name</code> 參數,可以為 K8S 叢集設定名稱。

但是要注意 API Server 的監聽位址/端口不能重複或被占用。

<code>kind create cluster</code> 提供了 <code>--image</code> 參數,可以設定 <code>kindest/node</code> 鏡像的版本,一般與 K8S 釋出的版本一一對應,具體提供了哪些版本可以去 DockerHub 上檢視。

https://hub.docker.com/r/kindest/node/tags

這個功能很酷,在做相容性測試的時候可以建立一個目标版本的叢集進行測試,真是不要太友善。

可以通過如下幾種方式:

kind load

本地鏡像庫

私有鏡像庫

一般來說可以通過 kind load 将客戶機上的鏡像加載到 K8S 環境中去。例如将本機的 nginx 鏡像加載到 Kind 的 K8S 環境中。

甚至可以為鏡像起别名

具體使用方式可以通路 cli 的幫助

Kind 的本地鏡像庫使用方式見文檔:https://kind.sigs.k8s.io/docs/user/local-registry/

私有鏡像庫使用方式見文檔:https://kind.sigs.k8s.io/docs/user/private-registries/

還有遇到其它問題,歡迎給我留言。