天天看點

使用 Kind 在 5 分鐘内快速部署一個 Kubernetes 高可用叢集

什麼是 Kind

Kind

(Kubernetes in Docker) 是一個

Kubernetes

孵化項目,

Kind

是一套開箱即用的

Kubernetes

環境搭建方案。顧名思義,就是将

Kubernetes

所需要的所有元件,全部部署在一個

Docker

容器中,可以很友善的搭建

Kubernetes

叢集。

Kind

已經廣泛的應用于

Kubernetes

上遊及相關項目的

CI

環境中,官方文檔中也把

Kind

作為一種本地叢集搭建的工具推薦給大家。

項目位址:https://github.com/kubernetes-sigs/kind

Kind 可以做什麼?

  1. 快速建立一個或多個

    Kubernetes

    叢集
  2. 支援部署高可用的

    Kubernetes

    叢集
  3. 支援從源碼建構并部署一個

    Kubernetes

    叢集
  4. 可以快速低成本體驗一個最新的

    Kubernetes

    叢集,并支援

    Kubernetes

    的絕大部分功能
  5. 支援本地離線運作一個多節點叢集

Kind 有哪些優勢?

  1. 最小的安裝依賴,僅需要安裝

    Docker

    即可
  2. 使用方法簡單,隻需

    Kind Cli

    工具即可快速建立叢集
  3. 使用容器來模似

    Kubernetes

    節點
  4. 内部使用

    Kubeadm

    的官方主流部署工具
  5. 通過了

    CNCF

    官方的

    K8S Conformance

    測試

Kind 是如何工作的?

使用 Kind 在 5 分鐘内快速部署一個 Kubernetes 高可用叢集

Kind

使用容器來模拟每一個

Kubernetes

節點,并在容器裡面運作

Systemd

。 容器裡的

Systemd

托管了

Kubelet

Containerd

,然後容器内部的

Kubelet

把其它

Kubernetes

元件:

Kube-Apiserver

Etcd

CNI

等等元件運作起來。

Kind

内部使用了

Kubeadm

這個工具來做叢集的部署,包括高可用叢集也是借助

Kubeadm

提供的特性來完成的。在高用叢集下還會額外部署了一個

Nginx

來提供負載均衡

VIP

安裝 Kind

安裝 Kind 依賴元件

Kind

把部署

Kubernetes

環境的依賴降低到了最小,僅需要機器安裝

Docker

即可。

  1. 安裝 Docker

這裡以

Linux

系統為例:

$ curl -sSL https://get.daocloud.io/docker | sh           

複制

更多平台的安裝方法可參考官方文檔:https://docs.docker.com/install/

  1. 安裝 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

進行開發,原生支援良好的跨平台特性,通常隻需要直接下載下傳建構好的二進制檔案就可使用。

  1. 通過二進制安裝
  • 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/

  1. 通過源碼安裝

如果本地環境已經配置好 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

    叢集并輸出一些操作叢集的提示資訊。
  1. 預設情況下,

    Kind

    會先下載下傳

    kindest/node:v1.15.3

    鏡像。如果你想指定不同版本,可以使用

    --image

    參數,類似這樣:

    kind create cluster --image kindest/node:v1.15.3

  2. kindest/node

    這個鏡像目前托管于 Docker Hub 上,下載下傳時可能會較慢。同樣的問題

    Kind

    進行叢集的建立也是存在的,

    Kind

    實際使用

    Kubeadm

    進行叢集的建立。對

    Kubeadm

    有所了解的同學都知道它預設使用的鏡像在國内是不能通路的,是以一樣需要自行解決網絡問題。
  3. 如果你存在上面說的網絡問題,最好配置一個國内的加速器或者鏡像源。如果你還不知道如何配置加速器和鏡像源可以參考:「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

叢集。

  1. 建立多節點 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           

複制

  1. 建立多節點 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

叢集,建立方式和多節點叢集類似,也是通過配置檔案來實作。

  1. 建立高可用 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           

複制

這裡,我們通過直接在配置檔案裡使用國内容器鏡像源的方式解決了官方容器鏡像源不可用的問題,同時也達到了加速叢集建立的目的。
  1. 建立高可用 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

鏡像。

  1. Base 鏡像

Base 鏡像目前使用了

ubuntu:19.04

作為基礎鏡像,并做了下面的調整:

  • 安裝

    Systemd

    相關的包,并調整一些配置以适應在容器内運作。
  • 安裝

    Kubernetes

    運作時的依賴包,比如:

    Conntrack

    Socat

    CNI

    等。
  • 安裝容器運作環境,比如:

    Containerd

    Crictl

    等。
  • 配置自己的

    ENTRYPOINT

    腳本,以适應和調整容器内運作的問題。

更多具體的建構邏輯可以參考:https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile

  1. 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

會是你不錯的選擇。

參考文檔

  1. https://www.google.com
  2. http://t.cn/AiRVBwDS
  3. https://zhuanlan.zhihu.com/p/60464867
  4. https://yeya24.github.io/post/kind/
  5. http://dockerone.com/article/8974
  6. https://kind.sigs.k8s.io/docs/user/quick-start/

本文參與 騰訊雲自媒體分享計劃,歡迎熱愛寫作的你一起參與!

本文章分享自微信公衆号

奇妙的Linux世界

作者:iMike

原始發表時間:2019-09-20

如有侵權,請聯系 [email protected] 删除。