比Minikube更快,使用Kind快速建立K8S學習環境
阿新 • • 發佈:2020-07-01
# 簡述
K8S 如火如荼的發展著,越來越多人想學習和了解 K8S,但是由於 K8S 的入門曲線較高很多人望而卻步。
然而隨著 K8S 生態的蓬勃發展,社群也呈現了越來越多的部署方案,光針對生產可用的環境就有好幾種部署方案,對於用來測試和學習環境也同樣提供了好幾種簡單可用的方案。
今天我們來介紹一種用於測試、學習環境快速搭建 K8S 環境的方案:Kind。
Kind 的官網是:https://kind.sigs.k8s.io/
## 那麼 Kind 相比於 Minikube 有什麼優勢呢?
### 基於 Docker 而不是虛擬化
執行架構圖如下:
![](https://d33wubrfki0l68.cloudfront.net/79bdd6c59934dec77bf525514c2416f547407720/a470d/docs/images/diagram.png)
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
```sh
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
```sh
brew install kind
```
## Windows
```cmd
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
```cmd
choco install kind
```
# 建立 K8S 叢集
> 如果你在 macOS 或 Windows 中使用 Docker 那麼至少需要設定 Docker VM 的記憶體至 6GB,Kind 建議設定為 8GB。
> 不是不基於虛擬化技術嗎?為什麼還有 Docker VM?
> 因為 Docker 其實只支援 Linux,macOS 和 Windwos 是基於虛擬化技術建立了一個 Linux VM。在 Linux 系統上則不存在這些問題。
最簡單的情況,我們使用一條命令就能創建出一個單節點的 K8S 環境
```sh
kind create cluster
```
可是呢,預設配置有幾個限制大多數情況是不滿足實際需要的,預設配置的主要限制如下:
1. APIServer 只監聽了 127.0.0.1,也就意味著在 Kind 的本機環境之外無法訪問 APIServer
2. 由於國內的網路情況關係,Docker Hub 映象站經常無法訪問或超時,會導致無法拉取映象或拉取映象非常的慢
這邊提供一個配置檔案來解除上訴的限制:
```yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
apiServerAddress: ""
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/
建立完成效果如下:
![](https://cdn.jsdelivr.net/gh/majian159/blogs@master/images/2020_06_24_16_27_M8rO30%20.png)
如果長時間卡在 `Ensuring node image (kindest/node:v1.18.2)` 這個步驟,可以使用 `docker pull kindest/node:v1.18.2` 來得到映象拉取進度條。
## 複製叢集配置檔案
Kind 建立叢集完成後會將叢集的訪問配置寫入到 `~/.kube/config` 中,可以複製或加入到有 kubectl 工具的環境中。
## 切換 kubectl 叢集上下文
```sh
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 如下:
```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
```
```sh
kubectl create nginx.yaml
kubectl port-forward service/nginx 8080:80
```
效果如下
![](https://cdn.jsdelivr.net/gh/majian159/blogs@master/images/2020_06_24_16_25_CCABrD%20.jpg)
![](https://cdn.jsdelivr.net/gh/majian159/blogs@master/images/2020_06_24_16_26_jlWNtn%20.png)
可以看到我們將本地的 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 環境中。
```sh
kind load docker-image nginx nginx
```
甚至可以為映象起別名
```sh
kind load docker-image nginx nginx:test
```
具體使用方式可以訪問 cli 的幫助
```sh
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/
## 還有其它問題?
還有遇到其它問題,歡迎給我