本文已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否仍然正确。

高可用 Kubernetes 集群

今天这篇文章将展示如何设置一个可靠、高可用的分布式 Kubernetes 集群。在 Kubernetes 1.5 版本中,对在 Google Compute Engine (GCE) 上运行此类集群的支持已作为 Alpha 功能添加。

动机

我们将创建一个高可用的 Kubernetes 集群,其主节点副本和工作节点将分布在同一区域的三个可用区中。这样的设置将确保集群在一个可用区发生故障时仍能继续运行。

设置 HA 集群

以下说明适用于 GCE。首先,我们将设置一个跨越一个可用区 (europe-west1-b) 的集群,它将包含一个主节点和三个工作节点,并且将是 HA 兼容的(未来允许在多个可用区添加更多主节点副本和更多工作节点)。为了实现这一点,我们将导出以下环境变量

$ 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

为了完成 HA 集群的设置,我们将添加两个主节点副本,一个在 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 重新分配给副本前面的负载均衡器,并等待其生效(更多详情请参阅设计文档)。

验证 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 个主节点副本(调度已禁用)和 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

...

关闭 HA 集群

要关闭集群,我们将首先关闭 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 上创建 HA 集群(更多详情请参阅本文)。