高可用性捕鱼大亨网络版集群

今天的帖子展示了如何建立一个可靠的,高可用性的分布式捕鱼大亨网络版集群。在Google Compute Engine(GCE)上运行此类群集的支持已作为Alpha功能添加到 捕鱼大亨网络版 1.5发布.

动机

我们将创建一个高可用性捕鱼大亨网络版集群,其主副本和工作程序节点分布在一个区域的三个区域中。这样的设置将确保群集在区域故障期间继续运行。

设置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\>

...

现在,让我们通过在其上执行暂停命令来模拟其中一个主副本的故障(kubernetes-master-137,区域europe-west1-c):

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

...

$ sudo halt

一段时间后,主副本将被标记为“未就绪”:

$ 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重新分配给其余的主服务器,并等待其传播(请参见 设计文件 更多细节)。

然后,我们将从欧洲-west1-c和欧洲-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

结论

我们已经展示了如何通过添加工作程序节点池和主副本来创建高可用性捕鱼大亨网络版集群。从捕鱼大亨网络版 1.5.2版开始,GCE的kube-up / kube-down脚本支持Alpha版本。此外,kops脚本中还支持AWS上的HA集群(请参阅 本文 更多细节)。

-Google软件工程师Jerzy Szczepkowski