Rainbond文档中心
无影响滚动升级无状态应用 编辑此页面

无状态应用可以包含多个实例,其中所有实例都相同,但各实例之间相互独立,互不依赖,任意一个 Web 请求完全与其他请求隔离,用户不需要保存应用的状态或者持久化数据,访问时系统会自动为多实例的应用分发请求,所有实例共享存储卷。Rainbond 针对无状态应用采用滚动升级策略。

应用场景

应用部署运行时,如果应用不需要任何稳定的状态标示、有序的部署、更新升级、删除和扩展,建议使用无状态(Deployment)方式部署。大多数 Web 类和 API 类都可以选用无状态应用。平台创建应用默认是无状态应用。

平台设置

源码构建还是镜像构建,配置流程一致,这里以镜像创建为例。

创建应用时设置应用类型

应用检测通过后可以配置高级设置

已创建应用修改应用类型

目前只能对已关闭应用进行应用类型修改。

在应用的其他设置–>基础信息里可配置应用类型,需要注意的是修改应用类型会丢失原有数据

滚动升级(RollingUpdate)

Rainbond 默认使用Deployment类型来部署 Web 类应用,   应用升级策略方面采用了滚动升级策略.所谓的滚动升级策略就是采用逐步替换的方式,使用新的实例逐步更新替换旧的实例,好处是不会中断服务,但会导致调用时出现应用版本不一致情况,输出内容不一致。

滚动更新策略

# 默认RollingUpdateStrategy
25% max unavailable, 25% max surge

部署可以确保在更新时只有一定数量的实例会被关闭,默认情况下,它确保至少比所需的实例数量少 25%(25% max unavailable)。 部署还可以确保在所需数量的实例之上只能创建一定数量的实例,默认情况下,它确保最多比所需数量的实例多 25%(25% max surge)。 如果你的实例数为 3,确保可用实例至少为 2,并且保证实例数总数最多为 4.

操作

滚动升级在平台体现在两个方面的操作流程,一个是构建并启动过程,另外一个就是伸缩过程

如果仔细查看上面的部署,您将看到它首先创建了一个新的 Pod,然后删除了一些旧的 Pod 并创建了新的 Pod。在有足够数量的新 Pod 出现之前,它不会杀死旧的 Pod,并且在足够数量的旧 Pod 被杀之前不会创建新的 Pod。它确保可用 Pod 的数量至少为 2,并且 Pod 的总数最多为 4。 也可以通过命名行方式查看具体 event 事件,来确定滚动更新具体流程。

Name:                   eb02a36a5f8d0b349b2254461393369e-deployment
Namespace:              34869bb254f6491e97d4993980a2cf85
Annotations:            deployment.kubernetes.io/revision=4
Selector:               name=gr93369e,service_id=eb02a36a5f8d0b349b2254461393369e,tenant_id=34869bb254f6491e97d4993980a2cf85
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   eb02a36a5f8d0b349b2254461393369e-deployment-9fcdf797 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  27m   deployment-controller  Scaled up replica set eb02a36a5f8d0b349b2254461393369e-deployment-84dc79c979 to 1 #第一次部署,新建实例数设置为1
  Normal  ScalingReplicaSet  25m   deployment-controller  Scaled up replica set eb02a36a5f8d0b349b2254461393369e-deployment-d5ff5fbd4 to 1 #构建操作,新建实例数设置为1
  Normal  ScalingReplicaSet  24m   deployment-controller  Scaled down replica set eb02a36a5f8d0b349b2254461393369e-deployment-84dc79c979 to 0 #构建操作,旧实例数设置为0
  Normal  ScalingReplicaSet  24m   deployment-controller  Scaled up replica set eb02a36a5f8d0b349b2254461393369e-deployment-66b58566c9 to 1 #伸缩操作,新建实例数设置为1
  Normal  ScalingReplicaSet  24m   deployment-controller  Scaled down replica set eb02a36a5f8d0b349b2254461393369e-deployment-d5ff5fbd4 to 0 #伸缩操作,旧实例数设置为0
  Normal  ScalingReplicaSet  30s   deployment-controller  Scaled up replica set eb02a36a5f8d0b349b2254461393369e-deployment-66b58566c9 to 3 #伸缩操作,新建实例数设置为3
  Normal  ScalingReplicaSet  22s   deployment-controller  Scaled up replica set eb02a36a5f8d0b349b2254461393369e-deployment-9fcdf797 to 1 #构建操作,新建实例数设置为1
  Normal  ScalingReplicaSet  20s   deployment-controller  Scaled down replica set eb02a36a5f8d0b349b2254461393369e-deployment-66b58566c9 to 2 #构建操作,旧实例数设置为2
  Normal  ScalingReplicaSet  20s   deployment-controller  Scaled up replica set eb02a36a5f8d0b349b2254461393369e-deployment-9fcdf797 to 2 #构建操作,新实例数设置为2
  Normal  ScalingReplicaSet  18s   deployment-controller  Scaled down replica set eb02a36a5f8d0b349b2254461393369e-deployment-66b58566c9 to 1 #构建操作,旧实例数设置为1
  Normal  ScalingReplicaSet  18s   deployment-controller  Scaled up replica set eb02a36a5f8d0b349b2254461393369e-deployment-9fcdf797 to 3 #构建操作,新实例数设置为3
  Normal  ScalingReplicaSet  16s   deployment-controller  Scaled down replica set eb02a36a5f8d0b349b2254461393369e-deployment-66b58566c9 to 0 #构建操作,旧实例数设置为0

无影响升级

无影响的前提,是已经多实例部署了。如果单实例部署,需要保证应用启动即服务。

配置应用健康检查

Rainbond 提供应用健康检查功能,用于查看应用和用户业务是否正常运行,设置健康检查可以在应用运行过程中,根据设置需要定时检查应用健康状态。如果不设置健康检测,我们默认应用和用户业务都是正常运行的;如果设置健康检测,我们会根据配置去探测应用或者业务是否正常运行,保证业务的可靠性。

默认我们提供了两种健康检查方式:

  • 应用启动时检查(应用实例存活检查): 探测应用实例是否已经启动,该检查方式用于检测实例是否存活或者服务是否启动,类似于执行ps检查进程是否存在。如果检查失败,会将应用状态设置为不健康;若检查成功不执行任何操作。
  • 应用运行时检查(应用业务就绪检查): 探测应用业务是否已经就绪,该检查方式用于检测实例是否准备好开始处理用户请求或者运行过程中业务是否异常退出情况。如果检查失败,会重启该实例;若检查成功不执行任何操作。

微服务架构下分布式 session 共享

在某些场景下,单实例情况下多数将 session 存在到内存中,所有用户请求由单实例进行响应处理,达到保持用户状态的需求。随着微服务架构的普及发展,需要对原有单一实例的应用进行改造拆分,实现应用向云平台迁移。拆分每一个微应用都具有自己的 Web 页面,这些 Web 页面都会通过浏览器客户端展现给用户,整个微应用架构可以近似地看作是一个大型的分布式应用,所以每个微应用都需要有 Session 对象,同时整个微应用架构中,同一用户的 Session 数据应该是一致的。因此,在微服务架构下,对 session 的处理不再保存在内存中, 而是在架构中引入独立的中间存储介质如 redis 或 memcache,将企业应用的 session 统一管理。

针对这类场景, 可以参考: Tomcat 基于 Redis 实现 Session 共享