技术进阶:Kubernetes高级架构与应用状态部署

举报
云容器大未来 发表于 2018/11/08 16:58:14 2018/11/08
【摘要】 在了解Kubernetes应用状态部署前,我们先看看Kubernetes的高级架构,方便更好的理解Kubernetes的状态。Kubernetes 的高级架构包括应用程序部署模型,服务发现和负载均衡,内部/外部路由分离、persistentvolume 的使用,部署节点守护程序,部署有状态分布式系统,作业后台运行,部署数据库,配置管理,凭证管理,滚动更新,自动缩放和包管理。 A、Kubern...

在了解Kubernetes应用状态部署前,我们先看看Kubernetes的高级架构,方便更好的理解Kubernetes的状态。

Kubernetes 的高级架构

包括应用程序部署模型,服务发现和负载均衡,内部/外部路由分离、persistentvolume 的使用,部署节点守护程序,部署有状态分布式系统,作业后台运行,部署数据库,配置管理,凭证管理,滚动更新,自动缩放和包管理。

Snap41.jpg

 A、Kubernetes的基本设计策略之一就是,无需更改应用程序代码,就能部署在虚拟机上运行的现有应用程序。另外,任何运行在虚拟机上的应用程序都可以通过容器化组件在 Kubernetes 上实现部署。这是通过容器分组、容器编排、覆盖网络、基于第 4 层虚拟IP、服务发现、支持守护程序运行、部署有状态应用程序组件、以及扩展容器编排系统这些核心功能实现的。

B、Kubernetes 可以提供一组可动态扩展的主机,可以应用容器运行 workload,并使用一组称为 master 的管理主机来提供管理整个容器基础架构的 API。这些 workload 包括长期运行服务,批处理作业和容器主机的守护程序。为了提供容器到容器的路由,所有容器主机都用覆盖网络连接在一起。部署在 Kubernetes 上的应用程序在集群网络中是动态可见的,并可通过传统负载均衡器向外部网络暴露。集群管理器的状态存储在一个高度分布的 key/value 存储(etcd)中,该存储在 master上运行。

Kubernetes应用状态部署

在K8s运行的服务,分为无状态服务和有状态服务,下面分别看看K8s是如何运行这两类不同的服务的

01

“无状态”服务

无状态服务,即 Web 服务器、代理和应用程序代码这样的应用程序,它们可以处理数据但不进行存储。编排过程中,开发者比较喜欢使用它们,因为它们易于部署且易于扩展。如果流量上升,则只需添加更多的负载平衡。更重要的是,它们是“不变动的”;上游容器镜像和基础架构中正在运行的容器其实几乎没有区别。这意味着它们可以随时被替代,而且容器实例切换过程中几乎不需要耗费“切换成本”。

无状态服务,K8s使用Replicaset来保证一个服务的实例数量,如果说某个Pod实例由于某个原因被crash了,RC会立即用一个Pod的模板新启一个Pod来替代它,由于是无状态的服务,新启的Pod与原来健康状态下的Pod是一模一样。当Pod被重建后它的IP地址可能发生变化,为了对外提供一个稳定的访问接口,K8s引入了Service的概念,一个Service后面可以挂多个Pod,实现服务的高可用。

在Kubernetes中,Deployment和Replicasets都是运用无状态服务的有效手段。

02

有状态”服务

有状态的服务,即路由器、CDN(内容传送网络)、streaming 服务器和认证服务器。从部署开始,这些容器就开始与上游镜像不同了,时间越长它们的差异越大。这种差异就被称为“state(状态)”。事实上,每个运行的应用程序都至少有一个小状态(差异),但对于“无状态”应用程序来说,状态(差异)很小,而且可以进行快速替换。

普通有状态服务,和无状态服务相比,它多了状态保存的需求,K8s提供了以Volmume和Peristent Volmume为基础的存储系统,可以实现服务的状态保存。

而在容器化应用程序最困难的任务之一,就是设计有状态分布式组件的部署体系结构。由于无状态组件可能没有预定义的启动顺序、集群要求、点对点 TCP 连接、唯一的网络标识符、正常的启动和终止要求等,因此可以很容易地进行容器化。诸如数据库,大数据分析系统,分布式 key/value 存储和 message brokers 可能有复杂的分布式体系结构,都可能用到上述功能。

Kubernetes 引入了 StatefulSets 资源来支持这种复杂的需求,用来管理POD部署和扩容,并为这些pod提供顺序和唯一性的保证。

03

StatefulSet部署—有状态应用

用于解决各个pod实例独立生命周期管理,提供各个实例的启动顺序和唯一性。

使用StatefulSet的前提是:

1、Kubernetes集群的版本≥1.5;

2、安装好DNS集群插件,版本≥15。

StatefulSet为什么适合有状态的程序,看看它的特性:

A、稳定,唯一的网络标识符。可以发现集群内部的其他成员。

B、稳定的持久化存储。通过Kubernetes的PV/PVC或者外部存储(预先提供)来实现。

C、启动或关闭时有序。有序的,优雅的部署和扩展。有序,优雅的删除和终止。有序的自动滚动更新。实现部署和扩容保证。 

04

运用StatefulSet会带来什么好处呢?

部署和扩容的保证

对于带有N个副本集的StatefulSet,当pod被部署,它们将按0到N-1的顺序被创建。

当一Pod被删除时,它们将按照N-1到0的顺序被终止。

在进行Pod扩容前,所有依赖的Pod应该都已在运行和准备好。

在Pod被终止前,所有的依赖它的Pod都必须完全停止。

如果你的系统是微服务构成的生态系统,就会比较繁琐的交付新服务,如果更近一步,服务是有状态的,那么kubernetes的自动化和健壮性特性会对你有很大的帮助,StatefulSet的目的就是给众多的有状态负载提供正确的控制器支持。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。