本文发布已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
高可用 Kubernetes 集群
今天的帖子展示了如何设置一个可靠、高可用的分布式 Kubernetes 集群。在 Kubernetes 1.5 版本中,添加了在 Google Compute Engine (GCE) 上运行此类集群的 alpha 功能。
动机
我们将创建一个高可用的 Kubernetes 集群,主节点副本和工作节点分布在同一区域的三个区域中。这种设置将确保集群在区域发生故障时继续运行。
设置高可用集群
以下说明适用于 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
为了完成高可用集群的设置,我们将在 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 上的高可用集群(有关更多详细信息,请参见本文)。
- 下载 Kubernetes
- 在 GitHub 上参与 Kubernetes 项目
- 在 Stack Overflow 上提出问题(或回答问题)
- 在 Slack 上与社区联系
- 在 Twitter 上关注我们 @Kubernetesio 获取最新更新