這篇文章已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
高可用性 Kubernetes 叢集
今天的文章說明如何設定可靠、高可用性的分散式 Kubernetes 叢集。在 Google Compute Engine (GCE) 上執行此類叢集的功能已在 Kubernetes 1.5 版本中以 Alpha 功能新增。
動機
我們將建立高可用性的 Kubernetes 叢集,其中 master 副本和 worker 節點分散在一個區域的三個區域中。這樣的設定將確保叢集在區域故障期間繼續運作。
設定 HA 叢集
以下說明適用於 GCE。首先,我們將設定一個跨越一個區域 (europe-west1-b) 的叢集,其中包含一個 master 和三個 worker 節點,並且將與 HA 相容(允許未來在多個區域中新增更多 master 副本和更多 worker 節點)。為了實作這一點,我們將匯出以下環境變數
$ 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 區域中新增兩個額外的 worker 節點池,每個池包含三個節點(關於新增 worker 節點池的更多詳細資訊,請參閱此處)
$ 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
為了完成 HA 叢集的設定,我們將新增兩個 master 副本,一個在 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 分鐘),因為我們需要將 master 的 IP 重新指派給副本前面的負載平衡器,並等待其傳播(更多詳細資訊請參閱設計文件)。
驗證 HA 叢集是否如預期運作
我們現在可以列出叢集中存在的所有節點
$ 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 個 master 副本(已停用排程)和 9 個 worker 節點。
我們將部署範例應用程式 (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 命令來模擬其中一個 master 副本的故障 (kubernetes-master-137,區域 europe-west1-c)
$ gcloud compute ssh kubernetes-master-2d4 --zone=europe-west1-c
...
$ sudo halt
過一會兒,master 副本將被標記為 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
...
關閉 HA 叢集
為了關閉叢集,我們將首先關閉 C 區和 D 區中的 master 副本
$ 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 重新指派給剩餘的 master,並等待其傳播(更多詳細資訊請參閱設計文件)。
然後,我們將從 europe-west1-c 和 europe-west1-d 區域中移除額外的 worker 節點
$ 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
最後,我們將關閉剩餘的 master 和最後一組節點 (europe-west1-b 區域)
$ KUBE\_GCE\_ZONE=europe-west1-b ./cluster/kube-down.sh
結論
我們已展示如何透過新增 worker 節點池和 master 副本來建立高可用性的 Kubernetes 叢集。截至 Kubernetes 1.5.2 版本,kube-up/kube-down 腳本支援 GCE (作為 Alpha 功能)。此外,kops 腳本也支援 AWS 上的 HA 叢集(更多詳細資訊請參閱這篇文章)。
- 下載 Kubernetes
- 在 GitHub 上參與 Kubernetes 專案
- 在 Stack Overflow 上張貼問題(或回答問題)
- 在 Slack 上與社群聯繫
- 在 Twitter 上追蹤我們 @Kubernetesio 以取得最新更新