Google Kubernetes设计文档之服务篇-转
摘要:Kubernetes是Google开源的容器集群管理系统,构建于Docker之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等功能。 Pod是创建、调度和管理的最小部署单位,本文详细介绍这些Pod之间的通信和调度
概述
Kubernetes中 Pods不是一成不变的。它们可以随着时间进行迁移,特别是当受到ReplicationControllers支配时。虽然每个pod都有属于自己的IP地址,但是却不能保证每个Pod的IP地址随着时间的变化依然保持不变。这就导致了一个问题:如果在Kubernetes集群里,有一系列的pods(我们姑且称之为后端)为其他的pods(称为前端)提供功能,那前端该如何去找到后端?
服务
Kubernetes中的服务是一种抽象概念,它定义了一个pods逻辑集合以及访问它们的策略,有时它也被称为微服务(Micro-service)。服务的目标是提供一种桥梁,使得非Kubernetes原生应用程序,在无需为Kubernetes编写特定代码的前提下,轻松访问后端。服务会为用户提供一对IP地址和port端口,用于在访问时重定向到相应的后端。服务里Pods集合的选定是由一个标签选择器(label selector)来完成的。
举个例子,首先假设一个“镜像处理”后端,它运行着三个可用的副本。这些副本是无状态的,前端根本不关心自己具体使用的是后端的哪个副本。因此,尽管组成后端集合的实际pods可能已经发生了改变,但是前端用户完全不需要知晓这些改变。这种服务的抽象性实现了前端访问与后端服务的解耦。
定义服务
这里是一个使用服务的例子。在Kubernetes中,服务是REST对象,类似于pod。如pod一般,服务的定义,可以通过一个发给apiserver的POST请求,来完成创建一个新的实例。例如,假设你有一组pods,都暴露9376端口,并携带一个"app=MyApp"的标签。
{
"id": "myapp",
"selector": {
"app": "MyApp"
},
"containerPort": 9376,
"protocol": "TCP",
"port": 8765
}
上述定义将创建一个名为"myapp"的新服务,它使得所有带有"app=MyApp"标签的pod都监听TCP协议上的端口9376。而客户可以通过端口$MYAPP_SERVICE_PORT连接到$MYAPP_SERVICE_HOST,从而访问该服务。
服务是如何工作的?
在Kubernetes集群中的每个节点(node)上都运行着一个服务代理(service proxy)。该代理应用监听Kubernetes Master,以此来添加和删除服务对象及端点(endpoints,即满足服务标签选择器的pods),同时该代理应用还存储一个服务到端点列表的映射。它为每个服务在本地节点上打开一个端口,并转发该端口上的所有流量到后端。名义上是依据策略来执行的,但现在唯一支持的策略是轮转调度(round-robin)。
当一个pod被编入,Master为每一个存活的服务增加一组环境变量。我们支持 Docker-links-compatible变量(参见makeLinkVariables)以及更简单的{SVCNAME}_SERVICE_HOST和{SVCNAME}_SERVICE_PORT变量,其中的服务名要求大写,破折号将转换为下划线。具体的服务工作图如图1 。例如,服务"redis-master"监听TCP端口637,并分配IP地址10.0.0.11,将产生以下环境变量:
REDIS_MASTER_SERVICE_HOST=10.0.0.11
REDIS_MASTER_SERVICE_PORT=6379
REDIS_MASTER_PORT=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP=tcp://10.0.0.11:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_ADDR=10.0.0.11
这意味着要有先后次序,即一个pod希望访问的服务必须在pod本身创建之前被创建,否则环境变量不会被加载。不过支持DNS服务后,该限制将不再存在。
服务通过它的标签选择器,可以解析到0或多个端点。在服务的生命周期内,组成该服务的pods集合可以增加、缩减,或全部失效。用户只有在当他们正在使用的后端从服务中被移除时,才会遇到问题(即使如此,已经打开的连接也会因为某些协议的缘故,继续保持)。

图1.服务工作图
细节明细
前文的内容对于大多数只是想要使用服务的人来说应该已经足够了。然而,有很多发生在这背后的事情也值得去深入了解。
避免冲突
Kubernetes的一个主要理念是,用户不应该遭遇可能导致其操作失败的情景,尤其是用户本身并未引起错误。在此背景下,我们考虑网络端口的问题—不应该让用户选择一个可能与其他用户发生冲突的端口号。否则,将是隔离上的失败。
为了让用户能够选择他们的服务端口号,我们必须确保不会引起两个服务间的冲突。我们通过为每个服务分配自己的IP地址来做到这一点。
IP和Portal
不同于路由到一个固定的pod的IP地址,服务的IP实际上并不是由单个Master响应的。相反的,我们用iptables(Linux中的数据包处理逻辑)来定义这些需要透明重定向的“虚拟”IP地址。我们将服务IP和服务端口的元组称为Portal。当用户连接到portal上,其访问会被自动转移到一个相应的端点上。实际上,服务的环境变量是依据portal的IP和端口来设定的。此外,我们将增加DNS来支撑服务的访问。
举例来说,考虑上图所展示的应用处理过程。在创建后端服务时,Kubernetes Master分配一个Portal的IP地址,例如10.0.0.1。假设服务端口是1234,portal即为是10.0.0.1:1234。Master将存储该信息,它也被集群中所有的服务代理实例所获取。当代理监测到一个新的portal,它会打开一个新的随机端口,建立一个从Portal到新端口的iptables重定向,然后开始接受对其的连接。
当用户使用portal端口连接MYAPP_SERVICE_HOST时(不论他们将其视为静态端口或视为MYAPP_SERVICE_PORT),iptables规则生效,重定向数据包到服务代理自身的端口上。服务代理选择一个后端,并开始从客户端到后端的代理通信流量。具体原理如图2。
最终的结果是,用户可以选择他们想要的任何服务端口,而没有冲突的危险。客户可以轻松连接IP和端口,而无需了解到他们正在访问哪个pods。

图2.服务中IP和portal原理图
外部服务
对于用户应用程序的某些部分(如前端),用户希望在外部可访问的IP地址(公网IP)上暴露一个服务。
如果你希望你的服务暴露在一个公网IP地址上,你可以选择提供一个服务可以响应的"publicIPs"列表。这些IP地址将被绑定上服务端口,同时被映射到由服务选择的pods集合上。你随后需要负责确保到该公网IP地址的通信流量被发送到一个或多个kubernetes工作节点。与映射内部IP地址一致,每个主机上的每一条IPTables规则,将公网特定IP地址的数据包映射到内部的服务代理。
对于提供外部负载均衡设备的云服务提供商,还有一个更简单的方式来达到同样的效果。在这类供应商(如GCE)上,你可以让publicIPs为空,作为代替,你可以在服务上设置createExternalLoadBalancer标志。这会启动一个云服务提供商的特定负载均衡设备(假设它由你的云提供商支持),并用适当的值来填充这个公网IP值域。
缺点
我们预计,portals使用的iptables将在小规模上可用,而无法扩展到有着成千上万服务的大型集群。查看 portals的原始设计方案,可了解更多详情。
Google Kubernetes设计文档之服务篇-转的更多相关文章
- 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素
朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...
- DDD领域驱动设计 - 设计文档模板
设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ...
- 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- Msmq设计文档(赋源代码)
Msmq设计文档(赋源代码) Msmq设计文档 文件状态: [√] 草稿 [ ] 正式发布 [ ] 正在修改 文件标识: ECI-MSMQ v01 当前版本: 0.5 作 者: ...
- Storm项目:流数据监控1《设计文档…
博客公告: (1)本博客全部博客文章搬迁至<博客虫>http://blogchong.com/ (2)文章相应的源代码下载链接參考博客虫站点首页的"代码GIT". (3 ...
- VM架构设计文档初稿v0.01
VM架构设计文档初稿v0.01 文档介绍 本文档是经过讨论,作为VM新架构设计开发中的重要依据.对该架构的整个系统的结构进行详实细致的描述.阐述框架结构,说明该架构所采取的设计策略和所有技术,并对相关 ...
- Atitit.atiagent agent分销系统 代理系统 设计文档
Atitit.atiagent agent分销系统 代理系统 设计文档 1. 启动项目1 2. 首也2 3. 登录功能2 4. 用户中心2 5. 充值查询3 6. 授权下级代理4 7. 我的提成5 ...
- Net 通用权限管理系统源码 带数据库设计文档,部署说明文档
Net 通用权限管理系统源码 带数据库设计文档,部署说明文档 包括数据库设计文档部署安装文档源码数据库文件 下载地址:http://www.mallhd.com/archives/1389
- Access数据库自动生成设计文档
在做Access数据库设计时,常常直接在access文件中建表,建字段,然后写设计文档时,又得重新再写一遍字段和表间关系.其实access数据库自己就支持自动生成数据库文档. 操作方法如下: 数据库工 ...
随机推荐
- 关于iReport报表的分页
问题:二手车认证系统的检测报告采用iReport开发,开发者自定义了一张超级长的纸张,导致打印时自动缩放到了一张A4纸上.需要修改使之能够合理的分页打印,这是来到新公司的第一个任务. 解决方案一: 1 ...
- SQLite 批量insert - 如何加速SQLite的插入操作
本人翻译, 原文见: http://tech.vg.no/2011/04/04/speeding-up-sqlite-insert-operations/ 我正在开发一个Android程序, 它使用S ...
- Ninja Blocks物联网平台简介
Ninja Blocks是一个物联网控制平台,其平台架构包括硬件层.处理器层.软件层以及平台层,请看下图: 最底层是硬件层,包括传感器(Sensors)和驱动器(Actuators),例如温度传感器. ...
- iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示
iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端. 打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面. ...
- android: 活动和服务进行通信
9.3.3 活动和服务进行通信 上一小节中我们学习了启动和停止服务的方法,不知道你有没有发现,虽然服务是在活 动里启动的,但在启动了服务之后,活动与服务基本就没有什么关系了.确实如此,我们在 活 ...
- 内存缓存LruCache实现原理
自己项目中一直都是用的开源的xUtils框架,包括BitmapUtils.DbUtils.ViewUtils和HttpUtils四大模块,这四大模块都是项目中比较常用的.最近决定研究一下xUtils的 ...
- android自适应屏幕方向和大小
一:不同的layout Android手机 屏幕 大小不一,有480x320, 640x360, 800x480.怎样才能让App自动 适应不同的屏幕 呢? 其实很简单,只需要在res目录下 ...
- Windows 7 中设置VPN(PPTP连接方式)
第一步:打开控制面板-网络和共享中心(如图) 第二步:点击-设置新的连接或网络(如图) 第三步:选择-连接到工作区-下一步(如图) 第四步:如果已经存在其他连接,则在这一步选择”否,创建新连接“:如果 ...
- 为EasyUI 的Tab 标签添加右键菜单
在网上看了很多demo 自己实现了一个效果如下 ps jquery1.7.2 jQuery EasyUI 1.3.6easyui QQ群:15129679 <!doctype html> ...
- RSA算法 Android JAVA C#互通
RSA算法属非对称加密算法,在实际使用中,往往客户端使用公钥进行加密传递敏感数据,服务端server使用私钥进行解密,这样防止中间人从网络获取敏感数据的明文. Android端主要代码如下: pack ...