跨集群服务-为您的捕鱼大亨网络版应用程序实现更高的可用性

编者注:这篇文章是 系列深入文章 捕鱼大亨网络版 1.3的新功能

随着捕鱼大亨网络版用户扩展其生产部署,我们已经明确意识到了跨区域,区域,集群和云边界部署服务的强烈愿望。跨群集的服务提供了地理分布,支持混合和多云场景,并提高了单群集多区域部署之外的高可用性级别。希望其服务跨越一个或多个(可能是远程)集群的客户,需要能够以一致的方式从集群内部和外部访问它们。

在捕鱼大亨网络版 1.3中,我们的目标是最小化摩擦点并减少与将具有地理分布的服务部署到多个集群相关的管理/运营开销。这篇文章解释了如何做到这一点。

注意:尽管此处使用的示例利用了Google Container Engine(GKE )以配置捕鱼大亨网络版集群,它们可以在您想要部署捕鱼大亨网络版的任何地方工作。

让我们开始吧。创建的第一步是使用GKE将捕鱼大亨网络版集群创建到4个Google Cloud Platform(GCP)区域中。

  • 亚洲东部1-b
  • 欧洲西部1-b
  • us-east1-b
  • us-central1-b

让我们运行以下命令来构建集群:

gcloud container clusters create gce-asia-east1 \

  --scopes cloud-platform \

  --zone 亚洲东部1-b

gcloud container clusters create gce-europe-west1 \

  --scopes cloud-platform \

  --zone=europe-west1-b

gcloud container clusters create gce-us-east1 \

  --scopes cloud-platform \

  --zone=us-east1-b

gcloud container clusters create gce-us-central1 \

  --scopes cloud-platform \

  --zone=us-central1-b

让我们验证集群是否已创建:

gcloud container clusters list

NAME              ZONE            MASTER\_VERSION  MASTER\_IP       NUM\_NODES  STATUS  
gce-asia-east1    亚洲东部1-b    1.2.4           104.XXX.XXX.XXX 3          RUNNING  
gce-europe-west1  欧洲西部1-b  1.2.4           130.XXX.XX.XX   3          RUNNING  
gce-us-central1   us-central1-b   1.2.4           104.XXX.XXX.XX  3          RUNNING  
gce-us-east1      us-east1-b      1.2.4           104.XXX.XX.XXX  3          RUNNING

下一步是引导集群,并在已配置的集群之一上部署联合控制平面。如果您想继续,请参阅Kelsey Hightower的 教程 其中涉及了所有步骤。

联合服务

联合服务 被定向到联合身份验证API端点,并指定服务的所需属性。

创建联邦服务后,它将自动:

  • 在集群联合基础上的每个集群中创建匹配的捕鱼大亨网络版服务,
  • 监视那些服务“碎片”(及其驻留的集群)的运行状况,以及
  • 在公共DNS提供商(例如Google Cloud DNS或AWS Route 53)中管理一组DNS记录,从而确保您的联合服务的客户端始终可以无缝地找到合适的健康服务端点,即使在发生集群的情况下,可用区或区域中断。

联合捕鱼大亨网络版集群(即Pods)内部的客户端将自动在其集群中找到该联合服务的本地分片(如果存在且运行状况良好),或者在其他集群中最接近的健康分片(如果不存在)。

捕鱼大亨网络版集群的联合可以包括运行在不同云提供商(例如GCP,AWS)和本地(例如OpenStack)上的集群。您需要做的就是在适当的云提供商和/或位置中创建集群,并在您的联合API服务器中注册每个集群的API端点和凭据。

在我们的示例中,我们在4个区域中创建了集群,并在其中一个集群中部署了联合控制平面API,我们将使用它们来提供服务。请参见下图以直观表示。

创建联合服务

让我们列出联盟中的所有集群:

kubectl --context=federation-cluster get clusters

NAME               STATUS    VERSION   AGE  
gce-asia-east1     Ready               1m  
gce-europe-west1   Ready               57s  
gce-us-central1    Ready               47s  
gce-us-east1       Ready               34s

让我们创建一个联合服务对象:

kubectl --context=federation-cluster create -f services/nginx.yaml

'--context = federation-cluster'标志告诉kubectl使用适当的凭据将请求提交到Federation API端点。联盟服务将在联盟基础的所有集群中自动创建并维护匹配的捕鱼大亨网络版服务。

您可以通过检入每个基础集群来验证这一点,例如:

kubectl --context=gce-asia-east1a get svc nginx  
NAME      CLUSTER-IP     EXTERNAL-IP      PORT(S)   AGE  
nginx     10.63.250.98   104.199.136.89   80/TCP    9m

以上假设您在客户端中为该区域中的群集配置了名为“ gce-asia-east1a”的上下文。基础服务的名称和名称空间将自动与您在上面创建的联合服务的名称和名称空间匹配。

联合服务的状态将自动反映基础捕鱼大亨网络版服务的实时状态,例如:

kubectl --context=federation-cluster describe services nginx  

Name:                   nginx  
Namespace:              default  
Labels:                 run=nginx  
Selector:               run=nginx  
Type:                   LoadBalancer  
IP:           
LoadBalancer Ingress:   104.XXX.XX.XXX, 104.XXX.XX.XXX, 104.XXX.XX.XXX, 104.XXX.XXX.XX  
Port:                   http    80/TCP  
Endpoints:              \<none\>  
Session Affinity:       None  
No events.

联合服务的'LoadBalancer Ingress'地址与所有基础捕鱼大亨网络版服务的'LoadBalancer Ingress'地址相对应。为了使服务分片之间的集群间和云提供商之间的网络正常工作,您的服务需要具有一个外部可见的IP地址。服务类型:此处通常使用负载均衡器。

另请注意,我们尚未设置任何后端Pod以接收定向到这些地址的网络流量(即“服务端点”),因此联合服务尚未将其视为健康的服务分片,因此尚未添加它们该联合服务的DNS记录的地址。

添加后端容器

为了使基础服务碎片健康,我们需要在它们后面添加后端Pod。目前,这是直接针对基础集群的API端点完成的(尽管将来,联合服务器将能够使用单个命令为您完成所有这些操作,从而省去了麻烦)。例如,要在我们的基础集群中创建后端Pod:

for CLUSTER in asia-east1-a europe-west1-a us-east1-a us-central1-a  
do  
kubectl --context=$CLUSTER run nginx --image=nginx:1.11.1-alpine --port=80  
done

验证公共DNS记录

一旦Pod成功启动并开始侦听连接,每个集群中的捕鱼大亨网络版(通过自动运行状况检查)将报告它们为该集群中服务的正常端点。集群联合会反过来将这些服务“碎片”中的每一个视为健康,并通过自动配置相应的公共DNS记录将其置于服务中。您可以使用首选接口访问已配置的DNS提供程序以进行验证。例如,如果您的联盟配置为使用Google Cloud DNS和托管DNS域“ example.com”:

$ gcloud dns managed-zones describe example-dot-com   

creationTime: '2016-06-26T18:18:39.229Z'  
description: Example domain for 捕鱼大亨网络版 Cluster Federation  
dnsName: example.com.  
id: '3229332181334243121'  
kind: dns#managedZone  
name: example-dot-com  
nameServers:  
- ns-cloud-a1.googledomains.com.  
- ns-cloud-a2.googledomains.com.  
- ns-cloud-a3.googledomains.com.  
- ns-cloud-a4.googledomains.com.  

$ gcloud dns record-sets list --zone example-dot-com  

NAME                                                                                                 TYPE      TTL     DATA  
example.com.                                                                                       NS     21600  ns-cloud-e1.googledomains.com., ns-cloud-e2.googledomains.com.  
example.com.                                                                                      SOA     21600 ns-cloud-e1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 1209600 300  
nginx.mynamespace.myfederation.svc.example.com.                            A     180     104.XXX.XXX.XXX, 130.XXX.XX.XXX, 104.XXX.XX.XXX, 104.XXX.XXX.XX  
nginx.mynamespace.myfederation.svc.us-central1-a.example.com.     A     180     104.XXX.XXX.XXX  
nginx.mynamespace.myfederation.svc.us-central1.example.com.  
nginx.mynamespace.myfederation.svc.us-central1.example.com.         A    180     104.XXX.XXX.XXX, 104.XXX.XXX.XXX, 104.XXX.XXX.XXX  
nginx.mynamespace.myfederation.svc.asia-east1-a.example.com.       A    180     130.XXX.XX.XXX  
nginx.mynamespace.myfederation.svc.asia-east1.example.com.  
nginx.mynamespace.myfederation.svc.asia-east1.example.com.           A    180     130.XXX.XX.XXX, 130.XXX.XX.XXX  
nginx.mynamespace.myfederation.svc.europe-west1.example.com.  CNAME    180   nginx.mynamespace.myfederation.svc.example.com.  
... etc.

注意:如果您的联盟配置为使用AWS Route53,则可以使用等效的AWS工具之一,例如:

$aws route53 list-hosted-zones

and

$aws route53 list-resource-record-sets --hosted-zone-id Z3ECL0L9QLOVBX

无论使用哪种DNS提供程序,任何DNS查询工具(例如“ dig”或“ nslookup”)都将允许您查看联合会为您创建的记录。

从联合群集中的Pod中发现联合服务

默认情况下,捕鱼大亨网络版集群预先配置了集群本地DNS服务器('KubeDNS')和智能构建的DNS搜索路径,这些路径共同确保DNS查询(例如“ myservice”,“ myservice.mynamespace”,“ bobsservice.othernamespace”)由Pods内部运行的软件发布的“ etc”会自动扩展并正确解析为本地群集中运行的服务的相应服务IP。

随着联合服务和跨集群服务发现的引入,该概念已扩展到涵盖在全球集群联盟中任何其他集群中运行的捕鱼大亨网络版服务。要利用此扩展范围,请使用稍有不同的DNS名称(例如myservice.mynamespace.myfederation)来解析联合服务。使用不同的DNS名称还可以避免现有应用程序意外穿越跨区域或跨区域网络,并且可能招致不必要的网络费用或延迟,而无需您明确选择使用此行为。

因此,使用上面的NGINX示例服务和刚才描述的联合服务DNS名称格式,我们来看一个示例:us-central1-a可用区中的群集中的Pod需要联系我们的NGINX服务。现在,可以使用服务的联合DNS名称,即nginx,而不是使用服务的传统群集本地DNS名称(“ nginx.mynamespace”,该名称会自动扩展为“ nginx.mynamespace.svc.cluster.local”)。 mynamespace.myfederation”。无论在世界何处,它都会自动扩展并解析为我的NGINX服务中最接近的健康碎片。如果本地群集中存在健康的碎片,则将返回该服务的群集本地(通常为10.x.y.z)的IP地址(由群集本地的KubeDNS)。这完全等同于非联合服务解析。

如果该服务在本地群集中不存在(或存在但没有正常的后端Pod),则DNS查询将自动扩展到“ nginx.mynamespace.myfederation.svc.us-central1-a.example.com”。在幕后,这是找到最靠近我的可用区域的碎片之一的外部IP。此扩展由KubeDNS自动执行,它返回关联的CNAME记录。在上面的示例中,这导致遍历DNS记录的层次结构,并最终到达本地us-central1区域中联合服务的外部IP之一。

通过明确指定适当的DNS名称而不依赖于自动DNS扩展,还可以将服务碎片定位到Pod本地以外的可用区域和区域中。例如,即使发出查询的Pod位于美国,“ nginx.mynamespace.myfederation.svc.europe-west1.example.com”仍将解析欧洲目前所有健康的服务分片,而无论是否在美国是否有健康的服务碎片。这对于远程监视和其他类似应用程序很有用。

从联合群集之外的其他客户端发现联合服务

对于外部客户端,不再有描述的自动DNS扩展。外部客户端需要指定联合服务的标准DNS名称之一,可以是区域名称,区域名称或全局名称。为了方便起见,通常最好在服务中手动配置其他静态CNAME记录,例如:

eu.nginx.acme.com        CNAME nginx.mynamespace.myfederation.svc.europe-west1.example.com.  
us.nginx.acme.com        CNAME nginx.mynamespace.myfederation.svc.us-central1.example.com.  
nginx.acme.com             CNAME nginx.mynamespace.myfederation.svc.example.com.

这样,您的客户就可以始终使用左侧的缩写形式,并始终被自动路由到其本国大陆上最接近的健康分片。 捕鱼大亨网络版 Cluster Federation自动为您处理所有必需的故障转移。

处理后端Pod和整个群集的故障

标准的捕鱼大亨网络版服务集群IP已确保无响应的单个Pod端点以低延迟自动退出服务。 捕鱼大亨网络版集群联合系统会自动监视集群的运行状况以及联合服务的所有分片后面的端点,并根据需要使分片进入和退出服务。由于DNS缓存固有的延迟(默认情况下,缓存超时或联合服务DNS记录的TTL配置为3分钟,但可以调整),所有客户端完全故障转移到以下时间可能要花费很长时间。在灾难性故障的情况下使用替代群集。但是,给定每个区域服务端点可以返回的离散IP地址的数量(例如,参见上面的us-central1,它具有三种选择),许多客户端将在比给定的时间更短的时间内自动故障转移到另一种IP组态。

社区

我们希望听到有关捕鱼大亨网络版跨集群服务的反馈。要加入社区:

请尝试跨集群服务,让我们知道它的运行情况!

-Google工程主管Quinton Hoole和Google产品经理Allan Naim