1. 程式人生 > >比Minikube更快,使用Kind快速建立K8S學習環境

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

# 簡述 K8S 如火如荼的發展著,越來越多人想學習和了解 K8S,但是由於 K8S 的入門曲線較高很多人望而卻步。 然而隨著 K8S 生態的蓬勃發展,社群也呈現了越來越多的部署方案,光針對生產可用的環境就有好幾種部署方案,對於用來測試和學習環境也同樣提供了好幾種簡單可用的方案。 今天我們來介紹一種用於測試、學習環境快速搭建 K8S 環境的方案:Kind。 Kind 的官網是:https://kind.sigs.k8s.io/ ## 那麼 Kind 相比於 Minikube 有什麼優勢呢? ### 基於 Docker 而不是虛擬化 執行架構圖如下: ![](https://d33wubrfki0l68.cloudfront.net/79bdd6c59934dec77bf525514c2416f547407720/a470d/docs/images/diagram.png) Kind 不是打包一個虛擬化映象,而是直接講 K8S 元件執行在 Docker。帶來了什麼好處呢? 1. 不需要執行 GuestOS 佔用資源更低。 2. 不基於虛擬化技術,可以在 VM 中使用。 3. 檔案更小,更利於移植。 ### 支援多節點 K8S 叢集和 HA Kind 支援多角色的節點部署,你可以通過配置檔案控制你需要幾個 Master 節點,幾個 Worker 節點,以更好的模擬生產中的實際環境。 # 安裝 Kind Kind 的安裝非常簡單,只有一個二進位制檔案,如果大家嫌麻煩,可以直接去 GitHub releases 上下載二進位制檔案即可。 下面的安裝方式來自 Kind 文件 https://kind.sigs.k8s.io/docs/user/quick-start/ ## macOS / Linux ```sh curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.8.1/kind-$(uname)-amd64 chmod +x ./kind mv ./kind /some-dir-in-your-PATH/kind ``` ## macOS / Linux 使用 Homebrew ```sh brew install kind ``` ## Windows ```cmd curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.8.1/kind-windows-amd64 Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe ``` ## Windows 使用 Chocolatey ```cmd choco install kind ``` # 建立 K8S 叢集 > 如果你在 macOS 或 Windows 中使用 Docker 那麼至少需要設定 Docker VM 的記憶體至 6GB,Kind 建議設定為 8GB。 > 不是不基於虛擬化技術嗎?為什麼還有 Docker VM? > 因為 Docker 其實只支援 Linux,macOS 和 Windwos 是基於虛擬化技術建立了一個 Linux VM。在 Linux 系統上則不存在這些問題。 最簡單的情況,我們使用一條命令就能創建出一個單節點的 K8S 環境 ```sh kind create cluster ``` 可是呢,預設配置有幾個限制大多數情況是不滿足實際需要的,預設配置的主要限制如下: 1. APIServer 只監聽了 127.0.0.1,也就意味著在 Kind 的本機環境之外無法訪問 APIServer 2. 由於國內的網路情況關係,Docker Hub 映象站經常無法訪問或超時,會導致無法拉取映象或拉取映象非常的慢 這邊提供一個配置檔案來解除上訴的限制: ```yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 networking: apiServerAddress: "" containerdConfigPatches: - |- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["http://f1361db2.m.daocloud.io"] ``` `API_SERVER_ADDRESS` 配置區域網 IP 或想監聽的 IP `http://f1361db2.m.daocloud.io` 配置 Docker Hub 加速映象站點 更多的配置(多節點,節點中執行的 K8S 元件版本,APIServer 監聽埠,Pod、Service 子網,kubeProxy 模式,埠對映,本地卷持久化)可以檢視 Kind 的文件 https://kind.sigs.k8s.io/docs/user/configuration/ 建立完成效果如下: ![](https://cdn.jsdelivr.net/gh/majian159/blogs@master/images/2020_06_24_16_27_M8rO30%20.png) 如果長時間卡在 `Ensuring node image (kindest/node:v1.18.2)` 這個步驟,可以使用 `docker pull kindest/node:v1.18.2` 來得到映象拉取進度條。 ## 複製叢集配置檔案 Kind 建立叢集完成後會將叢集的訪問配置寫入到 `~/.kube/config` 中,可以複製或加入到有 kubectl 工具的環境中。 ## 切換 kubectl 叢集上下文 ```sh kubectl cluster-info --context kind-kind ``` # 如何訪問 K8S 中的 IP 我們在 K8S 中部署應用程式,一般有 4 種方式訪問他們。 1. 直接訪問 PodIP 2. 通過 Service 的 ClusterIP 訪問 3. 通過 Service 的 NodePort 訪問 4. 通過 Ingress Service NodePort 訪問 其中方式 1、2 需要訪問客戶端在 K8S 網路環境內。方式 3、4 其實是一種,通過機器的埠對映來觸達應用。 個人覺得直接訪問 IP+埠更為方便,這邊不對 Ingress 做過多的介紹,大家可以看 Kind 關於 Ingress 的文件。 https://kind.sigs.k8s.io/docs/user/ingress/ 這邊介紹通過 `kubectl port-forward` 埠轉發的方式訪問 K8S 中的應用。 ## 部署一個 Nginx Deployment 和 Service yaml 如下: ```yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx --- apiVersion: v1 kind: Service metadata: name: nginx spec: ports: - name: 80-tcp port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: ClusterIP ``` ```sh kubectl create nginx.yaml kubectl port-forward service/nginx 8080:80 ``` 效果如下 ![](https://cdn.jsdelivr.net/gh/majian159/blogs@master/images/2020_06_24_16_25_CCABrD%20.jpg) ![](https://cdn.jsdelivr.net/gh/majian159/blogs@master/images/2020_06_24_16_26_jlWNtn%20.png) 可以看到我們將本地的 8080 轉發到了 nginx service 的 80 埠,這時訪問本地的 8080 埠就可以訪問到 service nginx 的 80 埠。 # 常見問題 ## Kind 能在一臺機器上建立多個 K8S 叢集嗎? 可以的,`kind create cluster` 提供了 `--name` 引數,可以為 K8S 叢集設定名稱。 但是要注意 API Server 的監聽地址/埠不能重複或被佔用。 ## 怎麼設定指定的 K8S 版本? `kind create cluster` 提供了 `--image` 引數,可以設定 `kindest/node` 映象的版本,一般與 K8S 釋出的版本一一對應,具體提供了哪些版本可以去 DockerHub 上檢視。 https://hub.docker.com/r/kindest/node/tags > 這個功能很酷,在做相容性測試的時候可以建立一個目標版本的叢集進行測試,真是不要太方便。 ## 我的應用映象沒有釋出到映象庫如何在 K8S 中使用? 可以通過如下幾種方式: 1. kind load 2. 本地映象庫 3. 私有映象庫 一般來說可以通過 kind load 將客戶機上的映象載入到 K8S 環境中去。例如將本機的 nginx 映象載入到 Kind 的 K8S 環境中。 ```sh kind load docker-image nginx nginx ``` 甚至可以為映象起別名 ```sh kind load docker-image nginx nginx:test ``` 具體使用方式可以訪問 cli 的幫助 ```sh kind load -h kind load docker-image -h kind load image-archive -h ``` Kind 的本地映象庫使用方式見文件:https://kind.sigs.k8s.io/docs/user/local-registry/ 私有映象庫使用方式見文件:https://kind.sigs.k8s.io/docs/user/private-registries/ ## 還有其它問題? 還有遇到其它問題,歡迎給我