跨集群服务-为您的捕鱼大亨网络版应用程序实现更高的可用性
编者注:这篇文章是 系列深入文章 捕鱼大亨网络版 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