K8S 如火如荼的發展着,越來越多人想學習和了解 K8S,但是由于 K8S 的入門曲線較高很多人望而卻步。
然而随着 K8S 生态的蓬勃發展,社群也呈現了越來越多的部署方案,光針對生産可用的環境就有好幾種部署方案,對于用來測試和學習環境也同樣提供了好幾種簡單可用的方案。
今天我們來介紹一種用于測試、學習環境快速搭建 K8S 環境的方案:Kind。
Kind 的官網是:https://kind.sigs.k8s.io/
運作架構圖如下:

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/
建立完成效果如下:
如果長時間卡在 <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 如下:
效果如下
可以看到我們将本地的 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/
還有遇到其它問題,歡迎給我留言。