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

KAnts發表於2020-07-01

簡述

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

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

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

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

那麼 Kind 相比於 Minikube 有什麼優勢呢?

基於 Docker 而不是虛擬化

執行架構圖如下:

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

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

brew install kind

Windows

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

choco install kind

建立 K8S 叢集

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

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

kind create cluster

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

  1. APIServer 只監聽了 127.0.0.1,也就意味著在 Kind 的本機環境之外無法訪問 APIServer
  2. 由於國內的網路情況關係,Docker Hub 映象站經常無法訪問或超時,會導致無法拉取映象或拉取映象非常的慢

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

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  apiServerAddress: "<API_SERVER_ADDRESS>"
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/

建立完成效果如下:

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

複製叢集配置檔案

Kind 建立叢集完成後會將叢集的訪問配置寫入到 ~/.kube/config 中,可以複製或加入到有 kubectl 工具的環境中。

切換 kubectl 叢集上下文

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 如下:

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
kubectl create nginx.yaml
kubectl port-forward service/nginx 8080:80

效果如下

可以看到我們將本地的 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 環境中。

kind load docker-image nginx nginx

甚至可以為映象起別名

kind load docker-image nginx nginx:test

具體使用方式可以訪問 cli 的幫助

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/

還有其它問題?

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

相關文章