雲計算

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

簡述

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

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">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

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">brew install kind

Windows

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">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-PATHkind.exe

Windows 使用 Chocolatey

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">choco install kind

創建 K8S 集群

如果你在 macOS 或 Windows 中使用 Docker 那麼至少需要設置 Docker VM 的內存至 6GB,Kind 建議設置為 8GB。

不是不基於虛擬化技術嗎?為什麼還有 Docker VM?

因為 Docker 其實只支持 Linux,macOS 和 Windwos 是基於虛擬化技術創建了一個 Linux VM。在 Linux 系統上則不存在這些問題。

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

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">kind create cluster

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

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

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

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">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 集群上下文

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">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 如下:

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">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

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">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 環境中。

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">kind load docker-image nginx nginx

甚至可以為鏡像起別名

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">kind load docker-image nginx nginx:test

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

https://files.mdnice.com/point.png); height: 30px; width: 100%; background-size: 40px; background-repeat: no-repeat; background-color: #282c34; margin-bottom: -7px; border-radius: 5px; background-position: 10px 10px;">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/

還有其它問題?

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

Leave a Reply

Your email address will not be published. Required fields are marked *