什麼是 Kind
Kind
(Kubernetes in Docker) 是一個
Kubernetes
孵化項目,
Kind
是一套開箱即用的
Kubernetes
環境搭建方案。顧名思義,就是将
Kubernetes
所需要的所有元件,全部部署在一個
Docker
容器中,可以很友善的搭建
Kubernetes
叢集。
Kind
已經廣泛的應用于
Kubernetes
上遊及相關項目的
CI
環境中,官方文檔中也把
Kind
作為一種本地叢集搭建的工具推薦給大家。
項目位址:https://github.com/kubernetes-sigs/kind
Kind 可以做什麼?
- 快速建立一個或多個
叢集Kubernetes
- 支援部署高可用的
叢集Kubernetes
- 支援從源碼建構并部署一個
叢集Kubernetes
- 可以快速低成本體驗一個最新的
叢集,并支援Kubernetes
的絕大部分功能Kubernetes
- 支援本地離線運作一個多節點叢集
Kind 有哪些優勢?
- 最小的安裝依賴,僅需要安裝
即可Docker
- 使用方法簡單,隻需
工具即可快速建立叢集Kind Cli
- 使用容器來模似
節點Kubernetes
- 内部使用
的官方主流部署工具Kubeadm
- 通過了
官方的CNCF
測試K8S Conformance
Kind 是如何工作的?

Kind
使用容器來模拟每一個
Kubernetes
節點,并在容器裡面運作
Systemd
。 容器裡的
Systemd
托管了
Kubelet
和
Containerd
,然後容器内部的
Kubelet
把其它
Kubernetes
元件:
Kube-Apiserver
、
Etcd
、
CNI
等等元件運作起來。
Kind
内部使用了
Kubeadm
這個工具來做叢集的部署,包括高可用叢集也是借助
Kubeadm
提供的特性來完成的。在高用叢集下還會額外部署了一個
Nginx
來提供負載均衡
VIP
。
安裝 Kind
安裝 Kind 依賴元件
Kind
把部署
Kubernetes
環境的依賴降低到了最小,僅需要機器安裝
Docker
即可。
- 安裝 Docker
這裡以
Linux
系統為例:
$ curl -sSL https://get.daocloud.io/docker | sh
複制
更多平台的安裝方法可參考官方文檔:https://docs.docker.com/install/
- 安裝 Kubectl
如果你需要通過指令行管理叢集,則需要安裝
Kubectl
。
這裡以
Linux
系統為例:
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl
複制
更多平台的安裝方法可參考官方文檔:https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl
安裝 Kind
Kind
使用
Golang
進行開發,原生支援良好的跨平台特性,通常隻需要直接下載下傳建構好的二進制檔案就可使用。
- 通過二進制安裝
- Linux
$ curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-linux-amd64
$ chmod +x ./kind
$ mv ./kind /usr/local/bin/kind
複制
- Windows
$ curl.exe -Lo kind-windows-amd64.exe https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-windows-amd64
$ mv .\kind-windows-amd64.exe c:\kind.exe
複制
更多平台的安裝方法可參考官方文檔:https://kind.sigs.k8s.io/docs/user/quick-start/
- 通過源碼安裝
如果本地環境已經配置好 Golang (1.11+) 的開發環境,你也可以直接通過源碼進行安裝。
$ go get sigs.k8s.io/[email protected]
複制
運作完上述指令後,會将
Kind
的可執行檔案放到
$GOPATH/bin
目錄内。為了友善使用,你需要将此目錄加入到
$PATH
中。
使用 Kind
安裝完成之後,我們可以來看看
Kind
支援哪些指令行操作。
$ kind
kind creates and manages local Kubernetes clusters using Docker container 'nodes'
Usage:
kind [command]
Available Commands:
build Build one of [base-image, node-image]
create Creates one of [cluster]
delete Deletes one of [cluster]
export exports one of [logs]
get Gets one of [clusters, nodes, kubeconfig-path]
help Help about any command
load Loads images into nodes
version prints the kind CLI version
Flags:
-h, --help help for kind
--loglevel string logrus log level [panic, fatal, error, warning, info, debug] (default "warning")
--version version for kind
Use "kind [command] --help" for more information about a command.
複制
簡單說下幾個比較常用選項的含義:
-
:用來從build
源代碼建構一個新的鏡像。Kubernetes
-
:建立一個create
叢集。Kubernetes
-
:删除一個delete
叢集。Kubernetes
-
:可用來檢視目前叢集、節點資訊以及get
配置檔案的位址。Kubectl
-
:從主控端向load
節點内導入鏡像。Kubernetes
使用 Kind 建立 Kubernetes 叢集
搭建一個單節點叢集
搭建單節點叢集是
Kind
最基礎的功能,當然使用起來也很簡單,僅需一條指令即可完成。
$ kind create cluster --name my-cluster
Creating cluster "my-cluster" ...
✓ Ensuring node image (kindest/node:v1.15.3) ?
✓ Preparing nodes ?
✓ Creating kubeadm config ?
✓ Starting control-plane ?️
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"
kubectl cluster-info
複制
以上指令中是可選參數。如果不指定,預設建立出來的叢集名字為
--name
。
kind
使用預設安裝的方式時,我們沒有指定任何配置檔案。從安裝過程的輸出來看,一共分為 4 步:
- 檢查本地環境是否存在一個基礎的安裝鏡像,預設是
,該鏡像裡面包含了所有需要安裝的東西,包括:kindest/node:v1.15.3
、kubectl
、kubeadm
的二進制檔案,以及安裝對應版本kubelet
所需要的鏡像。Kubernetes
- 準備
節點,主要就是啟動容器、解壓鏡像這類的操作。Kubernetes
- 建立對應的
的配置,完成之後就通過kubeadm
進行安裝。安裝完成後還會做一些清理操作,比如:删掉主節點上的污點,否則對于沒有容忍的kubeadm
無法完成部署。Pod
- 上面所有操作都完成後,就成功啟動了一個
叢集并輸出一些操作叢集的提示資訊。Kubernetes
- 預設情況下,
會先下載下傳Kind
鏡像。如果你想指定不同版本,可以使用kindest/node:v1.15.3
參數,類似這樣:--image
kind create cluster --image kindest/node:v1.15.3
-
這個鏡像目前托管于 Docker Hub 上,下載下傳時可能會較慢。同樣的問題kindest/node
進行叢集的建立也是存在的,Kind
實際使用Kind
進行叢集的建立。對Kubeadm
有所了解的同學都知道它預設使用的鏡像在國内是不能通路的,是以一樣需要自行解決網絡問題。Kubeadm
- 如果你存在上面說的網絡問題,最好配置一個國内的加速器或者鏡像源。如果你還不知道如何配置加速器和鏡像源可以參考:「Docker / Kubernetes 鏡像源不可用,教你幾招搞定它!」和 「 Docker 下使用 DaoCloud / 阿裡雲鏡像加速」兩篇文章。
接下來,我們根據上面指令執行完後,輸出的提示資訊進行操作來驗證一下叢集是否部署成功。
# 擷取指定叢集的配置檔案所在的路徑
$ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"
$ kubectl cluster-info
Kubernetes master is running at https://localhost:34458
KubeDNS is running at https://localhost:34458/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-control-plane Ready master 2m v1.15.3
$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-6g66f 1/1 Running 0 21m
coredns-86c58d9df4-pqcc4 1/1 Running 0 21m
etcd-my-cluster-control-plane 1/1 Running 0 20m
kube-apiserver-my-cluster-control-plane 1/1 Running 0 20m
kube-controller-manager-my-cluster-control-plane 1/1 Running 0 20m
kube-proxy-cjgnt 1/1 Running 0 21m
kube-scheduler-my-cluster-control-plane 1/1 Running 0 21m
weave-net-ls2v8 2/2 Running 1 21m
複制
從上面的輸出結果,可以看到單節點的
Kubernetes
已經搭建成功。單節點叢集預設方式啟動的節點類型是
control-plane
,該節點包含了所有的元件。這些元件分别是:
2*Coredns
、
Etcd
、
Api-Server
、
Controller-Manager
、
Kube-Proxy
、
Sheduler
和網絡插件
Weave
,目前預設使用的網絡插件也是
Weave
。
建立多節點的叢集
預設安裝的叢集隻部署了一個控制節點,如果需要部署多節點叢集,我們可以通過配置檔案的方式來建立多個容器。這樣就可以達到模拟多個節點目的,并以這些節點來建構一個多節點的
Kubernetes
叢集。
- 建立多節點 Kubernetes 叢集配置檔案
Kind
在建立叢集的時候,支援通過
--config
參數傳遞配置檔案給
Kind
,配置檔案可修改的内容主要有 role 和 節點使用的鏡像。
$ vim my-cluster-multi-node.yaml
# 一共兩個節點,一個主節點,一個從節點。
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker
複制
- 建立多節點 Kubernetes 叢集
配置檔案建立完成後,就可以使用下面的指令來完成多節點
Kubernetes
叢集搭建。
$ kind create cluster --config my-cluster-multi-node.yaml --name my-cluster-multi-node
Creating cluster "my-cluster-multi-node" ...
✓ Ensuring node image (kindest/node:v1.15.3) ?
✓ Preparing nodes ??
✓ Creating kubeadm config ?
✓ Starting control-plane ?️
✓ Joining worker nodes ?
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-multi-node")"
kubectl cluster-info
複制
和上面建立的單節點叢集一樣,我們同樣根據上面指令執行完後,輸出的提示資訊進行操作來驗證一下叢集是否部署成功。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-multi-node-control-plane Ready master 3m20s v1.15.3
my-cluster-multi-node-worker Ready <none> 3m8s v1.15.3
$ kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-86c58d9df4-cnqhc 1/1 Running 0 5m29s
coredns-86c58d9df4-hn9mv 1/1 Running 0 5m29s
etcd-my-cluster-multi-node-control-plane 1/1 Running 0 4m24s
kube-apiserver-my-cluster-multi-node-control-plane 1/1 Running 0 4m17s
kube-controller-manager-my-cluster-multi-node-control-plane 1/1 Running 0 4m21s
kube-proxy-8t4xt 1/1 Running 0 5m27s
kube-proxy-skd5v 1/1 Running 0 5m29s
kube-scheduler-my-cluster-multi-node-control-plane 1/1 Running 0 4m18s
weave-net-nmfq2 2/2 Running 1 5m27s
weave-net-srdfw 2/2 Running 0 5m29s
複制
建立高可用 Kubernetes 叢集
Kind
也支援搭建高可用的
Kubernetes
叢集,建立方式和多節點叢集類似,也是通過配置檔案來實作。
- 建立高可用 Kubernetes 叢集配置檔案
$ vim my-cluster-ha.yaml
# 一共六個節點,三個 control-plane 節點,三個 workers 節點
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
複制
這裡,我們通過直接在配置檔案裡使用國内容器鏡像源的方式解決了官方容器鏡像源不可用的問題,同時也達到了加速叢集建立的目的。
- 建立高可用 Kubernetes 叢集
配置檔案建立完成後,就可以使用下面的指令來完成高可用
Kubernetes
叢集搭建。
$ kind create cluster --name my-cluster-ha --config my-cluster-ha.yaml
Creating cluster "my-cluster-ha" ...
✓ Ensuring node image (kindest/node:v1.15.3) ?
✓ Preparing nodes ???????
✓ Starting the external load balancer ⚖️
✓ Creating kubeadm config ?
✓ Starting control-plane ?️
✓ Joining more control-plane nodes ?
✓ Joining worker nodes ?
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"
kubectl cluster-info
master $ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"
master $ kubectl cluster-info
Kubernetes master is running at https://localhost:44019
KubeDNS is running at https://localhost:44019/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
複制
同樣,我們根據上面指令執行完後,輸出的提示資訊進行操作來驗證一下叢集是否部署成功。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
my-cluster-ha-control-plane Ready master 3m42s v1.15.3
my-cluster-ha-control-plane2 Ready master 3m24s v1.15.3
my-cluster-ha-control-plane3 Ready master 2m13s v1.15.3
my-cluster-ha-worker Ready <none> 96s v1.15.3
my-cluster-ha-worker2 Ready <none> 98s v1.15.3
my-cluster-ha-worker3 Ready <none> 95s v1.15.3
複制
從上面的輸出結果,可以看到包含了多個 master 節點,說明高可用的
Kubernetes
叢集已經搭建成功。
其它相關知識
Kind 的鏡像裡的秘密
Kind
鏡像一共分為兩類,一類是
Base
鏡像,另一類是
Node
鏡像。
- Base 鏡像
Base 鏡像目前使用了
ubuntu:19.04
作為基礎鏡像,并做了下面的調整:
- 安裝
相關的包,并調整一些配置以适應在容器内運作。Systemd
- 安裝
運作時的依賴包,比如:Kubernetes
、Conntrack
、Socat
等。CNI
- 安裝容器運作環境,比如:
、Containerd
等。Crictl
- 配置自己的
腳本,以适應和調整容器内運作的問題。ENTRYPOINT
更多具體的建構邏輯可以參考:https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile
- Node 鏡像
Node
鏡像的建構比較複雜,目前是通過運作
Base
鏡像并在
Base
鏡像内執行操作,再儲存此容器内容為鏡像的方式來建構的,包含的操作有:
- 建構
相關資源,比如:二進制檔案和鏡像。Kubernetes
- 運作一個用于建構的容器
- 把建構的
相關資源複制到容器裡Kubernetes
- 調整部分元件配置參數,以支援在容器内運作
- 預先拉去運作環境需要的鏡像
- 通過
方式儲存目前的建構容器為docker commit
鏡像Node
如何快速删除一個叢集
如果你不需要本地的叢集環境,通過以下指令進行删除:
$ kind delete cluster --name my-cluster
Deleting cluster "my-cluster" ...
$KUBECONFIG is still set to use /root/.kube/kind-config-my-cluster even though that file has been deleted, remember to unset it
複制
至此,我們就示範完了如何使用
Kind
快速搭建一個
Kubernetes
叢集。不過有一個你需要注意的地方,
Kind
搭建的叢集不适用于生産環境中使用。但是如果你想在本地快速建構一個
Kubernetes
叢集環境,并且不想占用太多的硬體資源,那麼
Kind
會是你不錯的選擇。
參考文檔
- https://www.google.com
- http://t.cn/AiRVBwDS
- https://zhuanlan.zhihu.com/p/60464867
- https://yeya24.github.io/post/kind/
- http://dockerone.com/article/8974
- https://kind.sigs.k8s.io/docs/user/quick-start/
本文參與 騰訊雲自媒體分享計劃,歡迎熱愛寫作的你一起參與!
本文章分享自微信公衆号
奇妙的Linux世界
作者:iMike
原始發表時間:2019-09-20
如有侵權,請聯系 [email protected] 删除。