簡述
K8S 如火如荼的發展著,越來越多人想學習和了解 K8S,但是由於 K8S 的入門曲線較高很多人望而卻步。
然而隨著 K8S 生態的蓬勃發展,社群也呈現了越來越多的部署方案,光針對生產可用的環境就有好幾種部署方案,對於用來測試和學習環境也同樣提供了好幾種簡單可用的方案。
今天我們來介紹一種用於測試、學習環境快速搭建 K8S 環境的方案:Kind。
Kind 的官網是:https://kind.sigs.k8s.io/
那麼 Kind 相比於 Minikube 有什麼優勢呢?
基於 Docker 而不是虛擬化
執行架構圖如下:
Kind 不是打包一個虛擬化映象,而是直接講 K8S 元件執行在 Docker。帶來了什麼好處呢?
- 不需要執行 GuestOS 佔用資源更低。
- 不基於虛擬化技術,可以在 VM 中使用。
- 檔案更小,更利於移植。
支援多節點 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
可是呢,預設配置有幾個限制大多數情況是不滿足實際需要的,預設配置的主要限制如下:
- 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 = ["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 種方式訪問他們。
- 直接訪問 PodIP
- 通過 Service 的 ClusterIP 訪問
- 通過 Service 的 NodePort 訪問
- 通過 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 中使用?
可以通過如下幾種方式:
- 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 的本地映象庫使用方式見文件:https://kind.sigs.k8s.io/docs/user/local-registry/
私有映象庫使用方式見文件:https://kind.sigs.k8s.io/docs/user/private-registries/
還有其它問題?
還有遇到其它問題,歡迎給我留言。