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

本文讲的是跨集群服务——实现Kubernetes应用的高可用【编者的话】本文是Kubernetes 1.3版本新功能深入介绍系列文章中的一篇,原文作者Quintion Hoole是Kubernetes集群联邦的技术主管,负责集群联邦的设计和开发。本文主要介绍跨集群服务的创建和和使用,该功能是集群联邦在Kubernetes 1.3版本的核心功能。

我们在进行生产环境部署时得到的一个明确的需求,是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

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

联邦服务

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

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

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

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

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

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

创建联邦服务

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

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,有三个选择)很多客户端会返回其中一个可选地址。

社区

我们希望听到更多关于跨集群服务功能的反馈,请加入社区并帮我们:

请试用跨集群服务,并告知我们您的宝贵意见!

作者:Quinton Hoole(谷歌研发主管)、Allan Naim(谷歌产品经理)

原文链接:Cross Cluster Services - Achieving Higher Availability for your Kubernetes Applications(翻译:孟凡杰)

================================================
译者介绍

孟凡杰, eBay云平台研发工程师,与Quinton一起开发了Federation Service Controller。

原文发布时间为:2016-07-21

本文作者:孟凡杰

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:跨集群服务——实现Kubernetes应用的高可用

时间: 2024-10-07 19:24:04

跨集群服务——实现Kubernetes应用的高可用的相关文章

DockOne微信分享(一零三):Kubernetes 有状态集群服务部署与管理

本文讲的是DockOne微信分享(一零三):Kubernetes 有状态集群服务部署与管理[编者的话]本次分享将深入介绍Kubernetes如何满足有状态集群服务对容器编排系统提出的新需求,包括如何使用Kubernetes的动态存储请求与分配机制来实现服务状态的持久化存储,以及与高效部署和运行有状态集群服务相关的Kubernetes新特性,如Init Container.PetSet (StatefulSet)等.最后通过一个MySQL集群实例详解在Kubernetes中如何轻松部署一个高可用的

ODPS跨集群迁移与数据同步经验分享

本文来自于<程序员>与阿里云联合出品的<凌云>杂志. 作者:余晋       随着业务的迅猛发展,阿里各业务部门如淘宝.天猫.一淘.B2B等每天都会产生大量的数据,日均增量数百TB.2013年初,阿里内部的生产集群PA所在机房的存储量最多可扩容到数十PB,而当时已使用75 % 的存储量.存储容量告急,迫切需要将生产集群PA上的大量数据迁移到其他集群.        此时,如何安全地跨集群迁移几十PB的数据和其上相关业务,是我们面临的第一个挑战.数据迁移之后,两个集群间存在大量的数据

青云QingCloud推出HBase集群服务 支持SQL等高级功能

为了更好地满足用户对大数据基础平台的需求,企业级基础云服务商青云QingCloud(qingcloud.com)日前宣布正式推出HBase集群服务,包含HBase数据库服务.HDFS分布式文件系统.Phoenix查询引擎三大组件.在原生HBase的基础上,QingCloud在配置的易用性.监控告警.在线伸缩等方面进行全面优化,并支持二级索引.SQL和JDBC API,以及完全ACID事务等高级功能,用户能够在2-3分钟内创建一个HBase集群,并能够在控制台直接修改配置文件并应用,极大地减轻了H

apache-Apache 集群服务错误,大神们快来

问题描述 Apache 集群服务错误,大神们快来 最近几天服务总是莫名其妙的变得很慢,或者干脆连接不上服务器,查询发现如下错误: 下面两个是apache的error.log报的错误 下面是mod_jk.log里面的错误: [Sat Feb 28 09:29:52 2015][1033140:1157808] [info] jk_open_socket::jk_connect.c (627): connect to 172.16.2.5:8009 failed (errno=61) [Sat Fe

MySQL 集群服务简介

MySQL Cluster.me 开始提供基于 Galera Replication 技术的 MySQL 和 MariaDB 集群服务. 在本文中我们将会讨论 MySQL 和 MariaDB 集群服务的主要特性. MySQL 集群服务 什么是 MySQL 集群 如果你曾经疑惑过如何提升 MySQL 数据库的可靠性和可扩展性,或许你会发现其中一个解决办法就是通过基于Galera Cluster 技术的 MySQL 集群解决方案. 这项技术使得你可以在一个或者多个数据中心的多个服务器上获得经过同步的

Oracle 11gR2 RAC集群服务启动与关闭总结

<Oracle 11gR2 RAC集群服务启动与关闭总结> 新年新群招募: 中国Oracle精英联盟 170513055 群介绍:本群是大家的一个技术分享社区,在这里可以领略大师级的技术讲座,还有机会参加Oracle举办的技术沙龙,与兴趣相投的小伙伴一起笑谈风云起,感悟职场情! 引言:这写篇文章的出处是因为我的一名学生最近在公司搭建RAC集群,但对其启动与关闭的顺序和原理不是特别清晰,我在教学工作中也发现了很多学员对RAC知识了解甚少,因此我在这里就把RAC里面涉及到的最常用的启动与关闭顺序和

如何利用Redis扩展数据服务、实现分片及高可用?

今天,我们来聊聊如何扩展数据服务,如何实现分片(sharding)以及高可用(high availability).   分布式系统不存在完美的设计,处处都体现了trade off.   因此我们在开始正文前,需要确定后续的讨论原则,仍然以分布式系统设计中的CAP原则为例.由于主角是Redis,那性能表现肯定是最高设计目标,之后讨论过程中的所有抉择,都会优先考虑CAP中的AP性质.     ◆  ◆  ◆  ◆  ◆     两个点按顺序来,先看分片.   何谓分片?简单来说,就是对单机Redi

web集群服务的负载均衡方案选择与实现

web 集群系统,是由一群同时运行同一个web应用的服务器组成的集群系统,在外界看来,就像是一个服务器一样.为了均衡集群服务器的负载,达到优化系统性能的目的,集群服务器将众多的访问请求,分散到系统中的不同节点进行处理.从而实现了更高的有效性和稳定性,而这也正是基于Web的企业应用所必须具备的特性. 高可靠性可以看作为系统的一种冗余设定.对于一个特定的请求,如果所申请的服务器不能进行处理的话,那么其他的服务器能不能对之进行有效的处理呢?对于一个高效的系统,如果一个Web服务器失败的话,其他的服务器

在JBoss集群中建立JMS集群服务

JMS集群的意义在于提升系统在处理消息时的并发能力,建立这样的集群,有三个步骤: 1.配置JMS消息持久化所使用的数据库 2.配置分布式的jndi环境 3.配置分布式JMS集群 在JBoss集群中,系统采用hibernate的方式来保存消息,所以能够兼容hibernate支持的所有数据库. JBoss默认采用 hsql,在我们的例子中,将使用oracle 9.2.首先需要配置连接到数据库的jndi数据源. 方法是把doc\examples\jca下的 oracle-ds.xml文件拷贝到serv