文档章节

Kubernetes方法论:扩容和可靠性

Caicloud
 Caicloud
发布于 2016/06/08 20:38
字数 1627
阅读 35
收藏 3

RC:弹性扩容和管理微服务

如果pods是一个单元,部署和services是抽象层,那么谁来追踪pods的健康状况呢?

于是RC就这样出场了。

在pods被部署之后,他们需要扩容,需要被追踪。RC定义文件有pods数量的基线配置,这些pods在任何给定的点都是可得的。Kubernetes确保了需要的配置选项一直通过追踪pods数量来维护。它会杀死一些pods,又或者是创建一些来满足基线配置。

RC可以追踪pods的健康状况。如果一个pod变得难得到的,那么它就会被杀死,然后一些新的pod会被创建。因为一个RC实质上就是继承了pod的定义,YAML或者JSON清单可能包含重启策略,容器调查和健康检查端点的属性。

Kubernetes支持基于CPU利用率的pod自动弹性扩容,跟EC2自动扩容或者GCE自动扩容有些相似。在运行的时候,RC可以被操作来自动扩容pods,基于特定的CPU利用率阈值。pods的数量的最大值和最小值也可以在同样的命令下规定。

平网络:秘密武器

网络也是容器化过程中面临的复杂挑战之一。将一个容器暴露到外部世界的唯一方法就是通过主机的端口转发。但是扩容容器的时候就会变得复杂。Kubernetes不是将网络配置和集成留给管理员来做,而是自带一个网络模型,这个网络模型十分易于使用。

每个节点,service,pod和容器都有一个IP地址。节点的IP地址由物理路由器分配;结合分配的端口,它会变成端点来访问面向服务。虽然不是可路由的,但是Kubernetes服务也是可以获取IP地址的。所有的通信都是在没有NAT层的基础上产生的,使得网络平面化,透明化。

这个模型会带来一些好处:

  • 所有的容器不需要NAT也可以互相通信

  • 所有的节点不需要NAT也可以跟所有的pods和集群中的容器通信

  • 每个容器跟其他容器一样看到的都是相同的IP地址

关于通过RS来扩容pods最好的一点就是,端口映射是由Kubernetes处理的。所有属于service的pods都是通过相同的端口暴露到每个节点上的。即使没有pod在特定的节点上调度,request也会自动转发到合适的节点。

这个神奇的功能就是通过kube-proxy,iptables和etcd这些网络代理的结合来实现的。当前集群的状态就是用etcd来维护的,这也就意味着在运行的时候通过kube-proxy查询。通过操作在每个节点上的iptables,kube-proxy将request退信到正确的目的地。

Kube-proxy同样也处理services的基础负载均衡。Service端点也是用Docker links通过环境变量来管理。这些变量分解到端口,端口通过service暴露到外面。Kubernetes1.1包括了一个来使用本地iptables的选项,这个选项会带来80%的延迟。这个设计消除了CPU开销,因此提升了效率,也提升了可拓展性。

持久性:将状态带到容器

容器是短暂的。当他们从一个主机转移到另一个主机的时候,他们不包含状态。对于产品负载,持久是一个必须条件。任意有用的应用程序都有一个数据库在背后支持它。

默认设置下,pods也是短暂的。他们每次复活的时候都从空白状态开始。设置在同一个pod中运行的容器所共享的数据卷也是可以的。由emptyDir monilker确认,这个与Docker数据卷有点相似,在这里主机文件系统在容器内被暴露为一个目录。emptyDir数据卷追踪pods的生命周期。当pod 被删除的时候,数据卷也会被删除掉。因为这些数据卷只符合主机的,所以他们在其它节点上不可用。

为了在pods上带来持久性数据,不管他们在哪个节点上被调度,Kubernetes都支持PV和PVC requests。PVC和PV共享关系,就如同pod和节点一样。当一个pod被创建的时候,它可以通过claim联系到特定数据卷。PV可以基于各种各样的插件,比如GCE持久性硬盘,亚马逊弹性快存储(EBS),网络文件系统(NFS),小型计算机系统接口(ISCSI),GlusterFS和RBD。

设置持久化的工作流包括配置底层文件系统或者云数据卷,创建持久性数据卷,最后,创建claim来将pod跟数据卷关联起来。这个解耦方法可以将pod和数据卷完全分离,或者pod不需要知道确切的文件系统或者支持它的持久性引擎。有些文件系统,比如GlusterFS,也可以被容器化,使得配置更加容易,便捷。

结论

容器已经不是一个新型的概念了,谷歌数十年来都将它大部分网络规模的工作负载都放在容器中运行。他们在这个过程中吸取教训,并将这些教训融入Kubernetes的建设中,这些经验教训也可以被移植到其他的编排平台中,也可以移植到其它的编排工具中。Kubernetes早在十年前就已经解决了谷歌SRE面对的难题,这些正在影响着容器编排工具前进的道路。

最重要的是,Kubernetes在容器生态圈已经是一个焦点,对于其它相关服务,它的存在就好像是一个有价值的开源平台。理解Kubernetes目前的角色和作用对于编排工具市场是十分有必要的。

© 著作权归作者所有

Caicloud
粉丝 18
博文 77
码字总数 153394
作品 0
杭州
程序员
私信 提问
Kubernetes Ingress 高可靠部署最佳实践

简介 在Kubernetes集群中,Ingress是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力,您可以通过 Ingress 配置提供外部可访问的 URL、负载均衡、SSL、基于名称的虚拟主机等。...

云澔
2018/04/03
0
0
Kubernetes和Cloud Foundry越走越近

容器技术正在吞下整个软件界——而Kubernetes是容器界的王者。所以如果你参与的项目有相当规模,特别是企业内的项目,那与它打照面是早晚的事情。Cloud Foundry 就是一个很有意思的例子。它们...

Docker
2018/05/08
0
0
关于kubernetes我们还有什么可做的?

kubernetes在容器编排大战中由于应用的可移植性以及支持混合云/多云部署方式上的灵活性。加上开放可扩展的理念,使得周边社区非常活跃。从既有调研结果看,kubernetes已成为容器编排领域的标...

编程一生
06/11
0
0
使用CSI和Kubernetes实现动态扩容

Kubernetes本身具有包含了具有大量用例且功能强大的存储子系统。然而,如果我们利用Kubernetes建设关系数据库平台,就需要面临一个挑战:建立数据存储。本文用来讲述如何扩展CSI(容器存储接口...

店家小二
2018/12/14
0
0
动手Lab|利用CSI和Kubernetes实现动态扩容

简介 随着我们对客户的关注,尤其是对金融领域的客户,我们可以发现容器编排技术具有很大的发展空间。开发者们希望能通过开源解决方案来重新设计运行在虚拟化基础设施和裸金属上的独立应用程...

店家小二
2018/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java FOR-EACH循环

FOR-EACH循环使得代码更加的简短,也让代码更加易懂,其实他并没有加入什么新的功能。他的功能完全可以用简单的FOR循环代替。 for-each的用法: int a[] = {1,2,3,4,5,6} for(int s:a){ Syst...

无名氏的程序员
24分钟前
3
0
使用HTML5的History API

本文转载于:专业的前端网站➣使用HTML5的History API   HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL。这个功能很有用,例如通过一段JavaScript代...

前端老手
27分钟前
4
0
JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
今天
7
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
今天
99
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部