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

簡述

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

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

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

Kind 的官網是://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 文檔 //kind.sigs.k8s.io/docs/user/quick-start/

macOS / Linux

curl -Lo ./kind //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 //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 = ["//f1361db2.m.daocloud.io"]

API_SERVER_ADDRESS 配置區域網 IP 或想監聽的 IP
//f1361db2.m.daocloud.io 配置 Docker Hub 加速鏡像站點

更多的配置(多節點,節點中運行的 K8S 組件版本,APIServer 監聽埠,Pod、Service 子網,kubeProxy 模式,埠映射,本地卷持久化)可以查看 Kind 的文檔
//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 的文檔。
//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 上查看。
//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 的本地鏡像庫使用方式見文檔://kind.sigs.k8s.io/docs/user/local-registry/
私有鏡像庫使用方式見文檔://kind.sigs.k8s.io/docs/user/private-registries/

還有其它問題?

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