比Minikube更快,使用Kind快速創建K8S學習環境
- 2020 年 7 月 1 日
- 筆記
- Kubernetes
簡述
K8S 如火如荼的發展著,越來越多人想學習和了解 K8S,但是由於 K8S 的入門曲線較高很多人望而卻步。
然而隨著 K8S 生態的蓬勃發展,社區也呈現了越來越多的部署方案,光針對生產可用的環境就有好幾種部署方案,對於用來測試和學習環境也同樣提供了好幾種簡單可用的方案。
今天我們來介紹一種用於測試、學習環境快速搭建 K8S 環境的方案:Kind。
Kind 的官網是://kind.sigs.k8s.io/
那麼 Kind 相比於 Minikube 有什麼優勢呢?
基於 Docker 而不是虛擬化
運行架構圖如下:
Kind 不是打包一個虛擬化鏡像,而是直接講 K8S 組件運行在 Docker。帶來了什麼好處呢?
- 不需要運行 GuestOS 佔用資源更低。
- 不基於虛擬化技術,可以在 VM 中使用。
- 文件更小,更利於移植。
支援多節點 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
可是呢,默認配置有幾個限制大多數情況是不滿足實際需要的,默認配置的主要限制如下:
- APIServer 只監聽了 127.0.0.1,也就意味著在 Kind 的本機環境之外無法訪問 APIServer
- 由於中國的網路情況關係,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 種方式訪問他們。
- 直接訪問 PodIP
- 通過 Service 的 ClusterIP 訪問
- 通過 Service 的 NodePort 訪問
- 通過 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 中使用?
可以通過如下幾種方式:
- kind load
- 本地鏡像庫
- 私有鏡像庫
一般來說可以通過 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/
還有其它問題?
還有遇到其它問題,歡迎給我留言。