本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

高可用 Kubernetes 叢集

今天的文章將展示如何設定一個可靠、高可用的分散式Kubernetes叢集。在Google Compute Engine (GCE) 上執行此類叢集的支援作為alpha功能在Kubernetes 1.5版本中新增。

動機

我們將建立一個高可用的Kubernetes叢集,其中主節點副本和工作節點分佈在一個區域的三個可用區中。這種設定將確保叢集在某個可用區發生故障時仍能繼續執行。

設定高可用叢集

以下說明適用於GCE。首先,我們將設定一個跨越一個可用區(europe-west1-b)的叢集,包含一個主節點和三個工作節點,並且是高可用相容的(將來允許在多個可用區中新增更多主節點副本和更多工作節點)。為此,我們將匯出以下環境變數:

$ export KUBERNETES\_PROVIDER=gce

$ export NUM\_NODES=3

$ export MULTIZONE=true

$ export ENABLE\_ETCD\_QUORUM\_READ=true

並執行kube-up指令碼(請注意,整個叢集最初將放置在europe-west1-b可用區)

$ KUBE\_GCE\_ZONE=europe-west1-b ./cluster/kube-up.sh

現在,我們將在europe-west1-c和europe-west1-d可用區中新增兩個額外的工作節點池,每個池包含三個節點(有關新增工作節點池的更多詳細資訊,請參閱此處

$ KUBE\_USE\_EXISTING\_MASTER=true KUBE\_GCE\_ZONE=europe-west1-c ./cluster/kube-up.sh


$ KUBE\_USE\_EXISTING\_MASTER=true KUBE\_GCE\_ZONE=europe-west1-d ./cluster/kube-up.sh

為了完成高可用叢集的設定,我們將新增兩個主節點副本,一個在europe-west1-c可用區,另一個在europe-west1-d可用區。

$ KUBE\_GCE\_ZONE=europe-west1-c KUBE\_REPLICATE\_EXISTING\_MASTER=true ./cluster/kube-up.sh


$ KUBE\_GCE\_ZONE=europe-west1-d KUBE\_REPLICATE\_EXISTING\_MASTER=true ./cluster/kube-up.sh

請注意,新增第一個副本需要更長時間(約15分鐘),因為我們需要將主節點的IP重新分配給副本前面的負載均衡器,並等待其傳播(有關更多詳細資訊,請參閱設計文件)。

驗證高可用叢集是否按預期工作

我們現在可以列出叢集中存在的所有節點。

$ kubectl get nodes

NAME                      STATUS                AGE

kubernetes-master         Ready,SchedulingDisabled 48m

kubernetes-master-2d4     Ready,SchedulingDisabled 5m

kubernetes-master-85f     Ready,SchedulingDisabled 32s

kubernetes-minion-group-6s52 Ready                 39m

kubernetes-minion-group-cw8e Ready                 48m

kubernetes-minion-group-fw91 Ready                 48m

kubernetes-minion-group-h2kn Ready                 31m

kubernetes-minion-group-ietm Ready                 39m

kubernetes-minion-group-j6lf Ready                 31m

kubernetes-minion-group-soj7 Ready                 31m

kubernetes-minion-group-tj82 Ready                 39m

kubernetes-minion-group-vd96 Ready                 48m

如我們所見,我們有3個主節點副本(已停用排程)和9個工作節點。

我們將部署一個示例應用程式(nginx伺服器)以驗證我們的叢集是否正常工作。

$ kubectl run nginx --image=nginx --expose --port=80

等待一段時間後,我們可以驗證部署和服務是否已正確建立並正在執行。

$ kubectl get pods

NAME                READY STATUS RESTARTS AGE

...

nginx-3449338310-m7fjm 1/1 Running 0     4s

...


$ kubectl run -i --tty test-a --image=busybox /bin/sh

If you don't see a command prompt, try pressing enter.

# wget -q -O- http://nginx.default.svc.cluster.local

...

\<title\>Welcome to nginx!\</title\>

...

現在,讓我們透過在其上執行halt命令來模擬其中一個主節點副本的故障(kubernetes-master-137,可用區europe-west1-c)。

$ gcloud compute ssh kubernetes-master-2d4 --zone=europe-west1-c

...

$ sudo halt

一段時間後,主節點副本將被標記為“NotReady”。

$ kubectl get nodes

NAME                      STATUS                   AGE

kubernetes-master         Ready,SchedulingDisabled 51m

kubernetes-master-2d4     NotReady,SchedulingDisabled 8m

kubernetes-master-85f     Ready,SchedulingDisabled 4m

...

然而,叢集仍然可以執行。我們可以透過檢查我們的nginx伺服器是否正常工作來驗證這一點。

$ kubectl run -i --tty test-b --image=busybox /bin/sh

If you don't see a command prompt, try pressing enter.

# wget -q -O- http://nginx.default.svc.cluster.local

...

\<title\>Welcome to nginx!\</title\>

...

我們還可以執行另一個nginx伺服器。

$ kubectl run nginx-next --image=nginx --expose --port=80

新伺服器也應該正常工作。

$ kubectl run -i --tty test-c --image=busybox /bin/sh

If you don't see a command prompt, try pressing enter.

# wget -q -O- http://nginx-next.default.svc.cluster.local

...

\<title\>Welcome to nginx!\</title\>

...

現在讓我們重置損壞的副本。

$ gcloud compute instances start kubernetes-master-2d4 --zone=europe-west1-c

一段時間後,副本應該重新連線到叢集。

$ kubectl get nodes

NAME                      STATUS                AGE

kubernetes-master         Ready,SchedulingDisabled 57m

kubernetes-master-2d4     Ready,SchedulingDisabled 13m

kubernetes-master-85f     Ready,SchedulingDisabled 9m

...

關閉高可用叢集

要關閉叢集,我們首先將關閉D區和E區的主節點副本。

$ KUBE\_DELETE\_NODES=false KUBE\_GCE\_ZONE=europe-west1-c ./cluster/kube-down.sh


$ KUBE\_DELETE\_NODES=false KUBE\_GCE\_ZONE=europe-west1-d ./cluster/kube-down.sh

請注意,第二次移除副本將需要更長時間(約15分鐘),因為我們需要將副本前面的負載均衡器的IP重新分配給剩餘的主節點,並等待其傳播(有關更多詳細資訊,請參閱設計文件)。

然後,我們將從europe-west1-c和europe-west1-d區域中移除額外的工作節點。

$ KUBE\_USE\_EXISTING\_MASTER=true KUBE\_GCE\_ZONE=europe-west1-c ./cluster/kube-down.sh


$ KUBE\_USE\_EXISTING\_MASTER=true KUBE\_GCE\_ZONE=europe-west1-d ./cluster/kube-down.sh

最後,我們將關閉剩餘的主節點和最後一組節點(europe-west1-b區域)。

$ KUBE\_GCE\_ZONE=europe-west1-b ./cluster/kube-down.sh

結論

我們展示瞭如何透過新增工作節點池和主節點副本,可以建立一個高可用的Kubernetes叢集。截至Kubernetes 1.5.2版本,GCE的kube-up/kube-down指令碼中支援此功能(作為alpha版本)。此外,kops指令碼中還支援AWS上的高可用叢集(有關更多詳細資訊,請參閱本文)。