使用 Kind 搭建你的本地 Kubernetes 叢集

TaoBeier發表於2019-03-26

Kind 是我很喜歡也一直在參與的專案,我計劃將 Kind 相關的文章寫成一個系列。(flag++) 這是第一篇。

Kind 介紹

Kind 是 Kubernetes In Docker 的縮寫,顧名思義是使用 Docker 容器作為 Node 並將 Kubernetes 部署至其中的一個工具。官方文件中也把 Kind 作為一種本地叢集搭建的工具進行推薦。

安裝

二進位制安裝

Kind 使用 Golang 進行開發,在倉庫的 Release 頁面,已經上傳了構建好的二進位制,支援多種作業系統,可直接按需下載進行使用。

e.g.

# 下載最新的 0.2.0 版本
wget -O /usr/local/bin/kind https://github.com/kubernetes-sigs/kind/releases/download/0.2.0/kind-linux-amd64 && chmod +x /usr/local/bin/kind
複製程式碼

通過原始碼安裝

如果你本地已經配置好了 Golang 的開發環境,那你可以直接通過原始碼進行安裝。

e.g.

go get -u sigs.k8s.io/kind
複製程式碼

執行完上述命令後,會將 kind 的可執行檔案放到 $(go env GOPATH)/bin 資料夾內,你可能需要將此目錄加入到 $PATH 中。

或者也可以先 clone 原始碼再通過 go build 進行構建。

依賴

  • Kind 的主要功能目前需要有 Docker 環境的支援,可參考 Docker 官方文件進行安裝。

  • 如果需要操作叢集,則需要安裝 kubectl 命令列。安裝方法可參考官方文件

搭建單節點叢集

以下的演示均使用最新的程式碼(即通過原始碼安裝)。

基礎用法

搭建單節點叢集是 Kind 最基礎的功能。

e.g.

master $ kind create cluster --name moelove
Creating cluster "moelove" ...
 ✓ Ensuring node image (kindest/node:v1.13.4) ?
 ✓ 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="moelove")"
kubectl cluster-info
複製程式碼

以上命令中, --name 是可選引數,如不指定,預設建立出來的叢集名字為 kind

我們根據命令執行完的輸出進行操作:

master $ export KUBECONFIG="$(kind get kubeconfig-path --name="moelove")"
master $ 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'.
master $ kubectl get nodes
NAME                    STATUS    ROLES     AGE       VERSION
moelove-control-plane   Ready     master    2m        v1.13.4
複製程式碼

以上命令中,kind get kubeconfig-path --name="moelove" 會返回該指定叢集配置檔案所在的路徑。

可以看到單節點的 Kubernetes 已經搭建成功。

注意

  • 預設情況下,Kind 會先下載 kindest/node:v1.13.4 映象,該映象目前託管於 Docker Hub 上,下載時間取決於網路狀況。
  • Kind 實際使用 kubeadm 進行叢集的建立,對 kubeadm 有所瞭解的人都知道它預設使用的映象在國內下載不到,所以需要自己解決網路問題。或者參考下面的方式:

Kind 在建立叢集的時候,支援通過 --config 的引數傳遞配置檔案給 Kind,在國內,我們可以通過使用國內映象源的方式來加速叢集的建立。(這個方法也適用於直接通過 kubeadm 搭建 Kubernetes 叢集)

我們先通過以下命令刪除剛才搭建的叢集:

master $ kind delete  cluster --name moelove
Deleting cluster "moelove" ...
$KUBECONFIG is still set to use /root/.kube/kind-config-moelove even though that file has been deleted, remember to unset it
複製程式碼

接下來,將下面的配置內容儲存至一個 YAML 檔案中,比如名為 kind-config.yaml

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta1
  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/v1beta1
  kind: InitConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
  imageRepository: registry.aliyuncs.com/google_containers
nodes:
- role: control-plane
複製程式碼

我們使用該配置檔案搭建叢集。

master $ kind create cluster --name moelove --config kind.yaml
Creating cluster "moelove" ...
 ✓ Ensuring node image (kindest/node:v1.13.4) ?
 ✓ 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="moelove")"
kubectl cluster-info
複製程式碼

上面通過 --config 將我們的配置檔案傳遞給 Kind 用於搭建叢集,推薦國內使用者使用這種方式

搭建高可用叢集

Kind 也支援搭建高可用的 K8S 叢集,不過只能通過配置檔案來實現。可以直接將下面的內容儲存至檔案中,再將配置檔案傳遞給 Kind 即可。

e.g.

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta1
  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/v1beta1
  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 叢集:

master $ kind create cluster --name moelove-ha --config kind-ha-config.yaml
Creating cluster "moelove-ha" ...
 ✓ Ensuring node image (kindest/node:v1.13.4) ?
 ✓ 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="moelove-ha")"
kubectl cluster-info
master $ export KUBECONFIG="$(kind get kubeconfig-path --name="moelove-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'.
複製程式碼

可以做下簡單的驗證:

master $ kubectl get nodes
NAME                        STATUS   ROLES    AGE     VERSION
moelove-ha-control-plane    Ready    master   3m42s   v1.13.4
moelove-ha-control-plane2   Ready    master   3m24s   v1.13.4
moelove-ha-control-plane3   Ready    master   2m13s   v1.13.4
moelove-ha-worker           Ready    <none>   96s     v1.13.4
moelove-ha-worker2          Ready    <none>   98s     v1.13.4
moelove-ha-worker3          Ready    <none>   95s     v1.13.4
複製程式碼

可以看到已經成功建立了多 master 的 Kubernetes 叢集。

總結

這是使用 Kind 搭建本地 Kubernetes 叢集的第一篇,同時本篇的內容也是《Kubernetes 從上手到實踐》第 4 節內容的補充,搭配食用效果更佳 :)


可以通過下面二維碼訂閱我的文章公眾號【MoeLove】

TheMoeLove

相關文章