数据中台数据中台
申请试用
新闻动态
了解袋鼠云最新动态
新闻动态>云原生中有状态应用容器化实践,如何去状态化?>
云原生中有状态应用容器化实践,如何去状态化?
20211220|文章来源:-

袋鼠云隶属于杭州玳数科技有限公司,成立于2015年11月。公司以云原生一站式数据中台PaaS“数栈DTinsight”产品为核心,数据中台解决方案、数据可视化服务、数据化运维解决方案等系列矩阵全方位帮助客户建设数字化基础设施,实现数字化转型。

在现代微服务架构中,要确保服务的弹性,要将服务设计成无状态化的,这里的无状态化并不是说这个服务没有状态了,只是说该服务的实例可以从某些地方取回执行所需要的应用状态。换句话说,我们把一个应用上到k8s上的过程其实就是一个去状态化的过程,在这个过程中的解决手段就是将应用的执行和执行所需的数据进行分离,让应用无状态化。

接下来先给大家介绍下在k8s中解决以上状态的一些手段。

 

1.持久化状态

就像上文提到的,将需要持久化的数据存到数据库中,是分离持久化状态的一个最常见的方式。大部分的简单应用通过这个方式就可以做到无状态化。那数据库呢?数据库需要将数据文件存在磁盘上,如果pod发生了漂移,数据库执行程序和数据文件之间的关系就丢失了。

 

所以数据库的分离持久化状态需要做到两件事情:

(1)数据文件可以存下来

(2)数据文件和执行程序之间关系可以维持住

 

第一件事情可以通过将数据文件直接存在某几个固定的node节点上,声明localpv。

第二件事则是需要pod和pv进行绑定,在pod上声明pvc,使用storageclass绑定pv和pvc。这里还需要保证的是当pod发生漂移了还能找到对应的pvc,可以使用statefulset,这样pod-0绑定的就是pvc-0。

 

数据文件持久化了,执行程序和数据文件的关系也维持住了。要弹性增加副本,只要增加pod和localpv就行, 创建pv也可以交给provisioner来自动创建。当然数据库要能在k8s上弹性扩缩容还要分离集群状态。

 

2.配置状态

我们可以通过修改配置来改变程序的运行状态,但是如果配置文件在容器中,pod一旦发生了漂移,之前修改的配置都不再生效,程序的执行数据有问题就可能造成程序的崩溃,比如数据库的连接配置。要分离配置状态则需要配置文件独立定义,并在容器启动后覆盖容器内的配置文件。

 

在k8s中分离配置状态的常用方式就是使用configmap,如果存在需要加密的数据则使用secret。

 

3.集群状态(拓扑状态)

很多分布式应用,多个实例之间是存在依赖关系的,比如主从关系,主备关系。要分离集群状态,比如mysql:

(1)启动的pod可以知道自己是master还是slave

(2)pod可以有唯一访问标识,可以通过这个唯一访问标识访问特定的pod

第一件事被statefulset管理的pod都会有一个顺序编号,那就可以通过脚本来根据编号规定这个pod是master还是slave。

第二件事通过headless service,会产生和pod名相关的dns,这样也就有了唯一访问标识。

这就给我们提供了充分的条件,去编写初始化脚本初始化集群。

 

4.会话状态

某些应用需要会话数据维持用户登录状态。如果会话数据过期或者丢失需要再次登录。要分离会话状态有两种方式:

(1)将会话数据保存到分布式缓存中或者数据库中。

(2)通过粘滞会话,根据客户端ip做会话保持,将请求路由到固定pod上。

 

第一种方式其实就是通过编写程序将会话状态变成了持久化状态,通过分离持久化状态来做到去状态化,这也是现在大多数流行的应用中的做法。

第二种方式如果会话只需要保持一小段时间,并且不是什么大并发的应用,那可以通过service的sessionAffinity将某个客户端的请求路由到固定的pod上,这种方式会有一个会话保持时间,超时则需要用户再次登录。当然在超时期间pod就发生了漂移也会需要用户再次登录。

 

5.连接状态

一些服务需要通过长链接与其他服务进行交互,比如通过grpc协议。如果仅仅只是通过service负载后端的pods,那就会存在一个问题,客户端和其中一个pod建立连接后,只要这个连接没有断开,客户端就不会再和其他pod建立连接,那么其实后端pod的横向扩展也就失去了意义。要分离连接状态,就需要对长链接进行负载均衡,基本有两种方式:

(1)利用nginx的长连接负载均衡能力来维持这些长连接。

(2)利用envoy实现客户端的长连接负载均衡。

第一种方式可以通过ingress, ingress对grpc直接有支持,声明backend-protocol为grpc,会利用nginx的长连接负载均衡能力来达到分离连接状态的目的;

第二种方式则是将发出请求拦截到sidecar envoy,利用envoy的能力在客户端做L7层负载均衡。

 

此刻起,和袋鼠云一起让数据产生更大价值
此刻起,和袋鼠云一起让数据产生更大价值