跨集群服务 实现Kubernetes应用的高可用

简介: 我们在进行生产环境部署时得到的一个明确的需求,是Kubernetes用户希望服务部署能够zone、跨区域、跨集群甚至跨云边界(译者:如跨云供应商)。相比单集群多zone部署,跨集群服务提供按地域分布,支持混合云、多云场景,提升高可用等级。

我们在进行生产环境部署时得到的一个明确的需求,是Kubernetes用户希望服务部署能够zone、跨区域、跨集群甚至跨云边界(译者:如跨云供应商)。相比单集群多zone部署,跨集群服务提供按地域分布,支持混合云、多云场景,提升高可用等级。客户希望服务能够跨一到多个集群(可能是本地或者远程集群),并希望这些集群无论内部或外部都有一致稳定的连接。

在Kubernetes 1.3版本,我们希望降低跨集群跨地区服务部署相关的管理和运营难度。本文 介绍如何实现此目标。

注意:虽然本文示例使用谷歌容器引擎(GKE)来提供Kubernetes集群,您可以在任何的其他环境部署Kubernetes。

我们正式开始。第一步是在谷歌的四个云平台地区通过GKE创建Kubernetes集群。

  • asia-east1-b
  • europe-west1-b
  • us-east1-b
  • us-central1-b

我们通过下面的命令创建集群:

gcloud container clusters create gce-asia-east1 \
--scopes cloud-platform \
--zone asia-east1-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 asia-east1-b 1.2.4 104.XXX.XXX.XXX 3 RUNNING
gce-europe-west1 europe-west1-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
pasted_image_0.png

下一步是起动集群并在创建的其中一个集群中部署联邦控制模块(Control Plane)。您可以参考和依照Kelsey Hightower的示例进行这步配置。

联邦服务

从联邦API获取信息,因此您可以通过联邦API制定服务属性。

当服务创建后,联邦服务自动进行如下操作:

  1. 在联邦中注册的所有Kubernetes集群中创建服务;
  2. 监控服务碎片(以及它们所在集群)的健康状况;
  3. 在公共DNS提供商上面创建 DNS记录(如谷歌Cloud DNS,或者AWS Route 53),以此确定你的服务客户端能够在任何时候无缝的获得相关的健康服务终端,即使当集群,可用区或者地区出现服务中断的情况时。

在注册到联邦的Kubernetes集群中的服务客户端,当联邦服务在本地集群碎片工作正常时,会优先使用本地服务碎片,否则会在最近的其他集群中选取健康的服务碎片。

Kubernetes集群联邦能够联合不同的云供应商(比如GCP、AWS)以及私有云(如OpenStack)。您只需在相应的云供应商和位置创建您的集群,并且将每个集群的API Server地址和证书信息注册到联邦集群中。

在我们的示例中,我们在四个区域创建了集群,并且在其中的一个集群中部署了联邦控制模块,我们会用这个环境来部署我们的服务。具体请参考下图。

pasted_image_1.png

创建联邦服务

我们先查看联邦中所有注册好的集群:

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把带相关证书信息的请求提交至联邦API服务器。联邦服务会自动在联邦中所有集群创建相应的Kubernetes服务。

你可以通过检查每一个集群中的服务进行验证,比如:

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的上下文设置,并且你有集群部署在这个区(zone)。Kubernetes服务的名字和名空间自动与你上面创建的集群服务一致。

联邦服务状态会实时体现Kubernetes对应的服务状态,例如:

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地址会汇总所有注册的Kubernetes集群服务的LoadBalancer Ingress地址。为了让同一联邦服务在不通集群之间以及不同云供应商之间的网络正确工作,你的服务需要有外部可见的IP地址,比如Loadbalancer是常见的服务类型。

请注意我们还没有部署任何后台Pod来接收指向这些地址的网络流量(比如服务终端),所以此时联邦服务还不会认为这些服务碎片是健康的,所以联邦服务对应的DNS记录也尚未创建。

增加后台Pod

为了渲染底层服务碎片的健康状况,我们需要为服务增加后台Pod。目前需要通过直接操作底层集群的API Server来完成(为节省您的时间,未来我们可以通过一条命令在联邦服务器中创建)。例如我们在底层集群中创建后台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供应商的接口来验证。比如,如果你使用谷歌Cloud DNS配置联邦, 你的DNS域为 ‘example.com’:

$ gcloud dns managed-zones describe example-dot-com 
creationTime: '2016-06-26T18:18:39.229Z'
description: Example domain for Kubernetes 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 <a dir="ltr" href="tel:21600%203600" x-apple-data-detectors="true" x-apple-data-detectors-type="telephone" x-apple-data-detectors-result="17">21600 3600</a> 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

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

不管您使用什么DNS供应商, 您可以使用DNS查询工具(例如 ‘dig’ 或者 ‘nslookup’)来查看联邦为您创建的DNS记录。

从联邦集群内部的pod发现联邦服务

默认情况下,Kubernetes集群有内置的本地域名服务器(KubeDNS),并且有智能的DNS搜索路径确保针对“myservice”、“myservice.mynamespace”、”bobsservice.othernamespace”等等被您运行在Pod中的的应用软件自动扩展和解析至相应的本地集群中的服务IP。

通过引入联邦服务以及跨集群服务发现,这个概念被扩展至全局,覆盖您联邦中所有的集群。为了利用这个扩展带来的便利性,您只需使用稍微不同的服务名(比如,myservice.mynamespace.myfederation)进行解析。

使用不同的DNS名同时避免了您现有的服务在您没有做明确的配置和选择情况下,意外的被解析到不同区(zone)或地域(region)网络,导致额外的网络费用或延迟。

因此,使用我们上面的NGINX 服务,以及刚刚介绍的联邦服务DNS名,我们构想一个示例:在可用性区域us-central1-a的集群中的pod需要访问我们的NGINX服务。与其使用传统的本地集群DNS名 (“nginx.mynamespace”,自动扩展为“nginx.mynamespace.svc.cluster.local”),现在可以使用联邦服务名“nginx.mynamespace.myfederation”。此名称会被自动扩展和解析至我的Nginx服务最近的健康节点,无论它在世界的哪里。如果本地集群存在健康服务碎片,那么本地集群IP地址(通常是10.x.y.z)会被返回(被集群本地KubeDNS)。这与非联邦服务解析完全一致。

如果服务在本地集群不存在(或者服务存在但本地没有健康的后台pod),DNS查询会自动扩充至`”nginx.mynamespace.myfederation.svc.us-central1-a.example.com”。实际的行为是查找离当前可用性区域最近的服务碎片的外部IP。该扩展被KubeDNS自动触发执行,返回相关的CNAME记录。这会遍历上面示例中的DNS记录,直到找到本地us-central1 区域联邦服务的外部IP。

通过明确指定DNS名,直接指向非本地可用区域(AZ)和地域(region)的服务碎片,而不依赖于自动DNS扩展,是可行的。例如,
“nginx.mynamespace.myfederation.svc.europe-west1.example.com” 会被解析至位于欧洲的所有健康服务碎片,即使通过nslookup解析出的服务位于美国,并无论在美国是否有该服务的健康碎片。这对远程监控和其它类似应用很有用。

从联邦集群外部发现联邦服务

对于外部客户端,前文描述的DNS自动扩展已不适用。外部客户端需要指定联邦服务的全名(FQDN),可以是区域,地域或全局名。为方便起见,最好为您的服务手工创建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.

这样您的客户端可以一直使用左侧的短名形式,并且会被自动解析到它所在大陆的最近的健康节点上。集群联邦会帮您处理服务的failover。

处理后台Pod和整个集群的失败情况

标准Kubernetes服务集群IP已经确保无响应的Pod会被及时从服务中移除。Kubernetes联邦集群系统自动监控集群以及联邦服务所有碎片对应的终端的健康状况,并按需增加和删除服务碎片。

因为DNS缓存造成的延迟(缓存超时,或者联邦服务DNS记录TTL默认设置为三分钟,但可以调节) 可能需要这么长时间才能在某集群或服务碎片出现问题时,正确将客户端,请求failover到可用集群上。然而,因为每个服务终端可以返回多个ip地址,(如上面的us-central1,有三个选择)很多客户端会返回其中一个可选地址。

本文转自中文社区-跨集群服务 实现Kubernetes应用的高可用

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
15天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第26天】 在动态且不断增长的云计算环境中,维护高性能的 Kubernetes 集群是一个挑战。本文将探讨一系列实用的策略和工具,旨在帮助运维专家监控、分析和优化 Kubernetes 集群的性能。我们将讨论资源分配的最佳实践,包括 CPU 和内存管理,以及集群规模调整的策略。此外,文中还将介绍延迟和吞吐量的重要性,并提供日志和监控工具的使用技巧,以实现持续改进的目标。
|
1天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes详解(六)——Pod对象部署和应用
在Kubernetes系列中,本文聚焦Pod对象的部署和管理。首先,通过`kubectl run`命令创建Pod,如`kubectl run pod-test --image=nginx:1.12 --port=80 --replicas=1`。接着,使用`kubectl get deployment`或`kubectl get pods`查看Pod信息,添加`-o wide`参数获取详细详情。然后,利用Pod的IP地址进行访问。最后,用`kubectl delete pods [Pod名]`删除Pod,但因Controller控制器,删除后Pod可能自动重建。了解更多细节,请参阅原文链接。
8 5
|
2天前
|
Kubernetes Java API
Kubernetes详解(三)——Kubernetes集群组件
Kubernetes详解(三)——Kubernetes集群组件
12 1
|
3天前
|
Kubernetes 关系型数据库 MySQL
MySQL在Kubernetes上的高可用实现
【5月更文挑战第1天】
|
4天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
5天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
27 1
|
7天前
|
运维 监控 Kubernetes
Kubernetes 集群的监控与维护策略
【5月更文挑战第4天】 在当今微服务架构盛行的时代,容器化技术已成为软件开发和部署的标准实践。Kubernetes 作为一个开源的容器编排平台,因其强大的功能和灵活性而广受欢迎。然而,随着 Kubernetes 集群规模的扩大,集群的监控和维护变得日益复杂。本文将探讨 Kubernetes 集群监控的重要性,分析常见的监控工具,并提出一套有效的集群维护策略,以帮助运维人员确保集群的健康运行和高可用性。
39 10
|
8天前
|
存储 运维 监控
Kubernetes 集群的持续监控与优化策略
【5月更文挑战第3天】在微服务架构和容器化部署日益普及的背景下,Kubernetes 已成为众多企业的首选容器编排平台。然而,随着集群规模的增长和业务复杂度的提升,有效的集群监控和性能优化成为确保系统稳定性和提升资源利用率的关键。本文将深入探讨针对 Kubernetes 集群的监控工具选择、监控指标的重要性解读以及基于数据驱动的性能优化实践,为运维人员提供一套系统的持续监控与优化策略。
|
11天前
|
运维 Kubernetes 监控
Kubernetes 集群的监控与维护策略
【4月更文挑战第30天】 在现代云计算环境中,容器化技术已成为应用程序部署和管理的重要手段。其中,Kubernetes 作为一个开源的容器编排平台,以其强大的功能和灵活性受到广泛欢迎。然而,随之而来的是对 Kubernetes 集群监控和维护的复杂性增加。本文将探讨针对 Kubernetes 集群的监控策略和维护技巧,旨在帮助运维人员确保集群的稳定性和高效性。通过分析常见的性能瓶颈、故障诊断方法以及自动化维护工具的应用,我们将提供一套实用的解决方案,以优化 Kubernetes 环境的性能和可靠性。
|
11天前
|
运维 Kubernetes 监控
Kubernetes集群的持续性能优化策略
【4月更文挑战第30天】 在动态且不断扩展的云计算环境中,保持应用性能的稳定性是一个持续的挑战。本文将探讨针对Kubernetes集群的持续性能优化策略,旨在为运维工程师提供一套系统化的性能调优框架。通过分析集群监控数据,我们将讨论如何诊断常见问题、实施有效的资源管理和调度策略,以及采用自动化工具来简化这一过程。