随着云原生应用的不断被接受,应用容器化方式部署也越来越普及,下面就如何基于华为CCE kubernetes集群中高可用部署容器应用集群展开探讨。
容器化集群的基本条件
集群实例无状态化:这里的“无状态化”指容器实例本身不缓存或永久存储数据,即无论容器本身无论如何重新创建,也不会因为容器被删除之后重新创建而丢失集群数据或状态。
无依赖本地存储:集群中的容器数据不会保存在某个节点上,即无论容器迁移到何处,也不会因为容器被删除之后重新创建而丢失集群数据或状态。
容器化集群高可用部署的要求
要实现容器化集群的基本条件,则集群的缓存与永久性存储都必须放到集群之外,那就需用到分布式缓存、分布式存储、分布式数据库。
容器高可用还需要考虑的是基础设施的高可用,如果所有容器都部署到同一个节点(虚拟机或物理机)上,即使容器集群本身实现了高可用,一旦节点异常,整个集群也不可用。所以,要求集群的容器分布到不同的节点之上。
以下是容器化集群高可用部署的基本拓扑图:
容器化集群高可用部署在华为CCE的实现
-
如何实现容器必须分散到不同节点上?
利用华为CCE的亲和性策略,使用得部署的应用集群与自己反亲和,即集群所有的POD都不可能同时部署到一个节点上。
-
如果实现数据持久化?
分布式数据库与分布式缓存,都是通过专门的中间件服务实现,这里就打开讲。这里主要分析应用落盘的数据。
应用的集群模式分为二类,一种叫多主模式,另一种叫单主模式。
多主模式指集群中所有实例都同时Active,通过负载均衡把请求分发到集群的不同实例中,集群中任何一个主实例出现故障,不影响其他主实例运行。这种集群适合使用k8s的replicaset(由deployment创建),由于应用实例都是Active状态,所以实例之间需要数据共享,这就要求所以需要一个分布式文件系统(如NFS)提供多读多写。
单主模式指集群中只有一个主能提供服务,有一个或多个备是Standby状态,集群通过主备实例切换或主实例选举来保证高可用。这种集群适合k8s的Statefulset,每个实例都有自己的状态。这样集群需要每个实例单独挂载一个存储(云硬盘),应用集群需要自已实现数据的同步,当主出现故障时,需要选举出新的主实例,同时proxy把流量切换到新的主实例。
![image.png](https://upload-images.jianshu.io/upload_images/10630044-744ad53acff7c927.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
如何实现升级?
集群的高可用,还需要考虑应用升级过程中如何保持业务的可用性。
kubernetes提供了一种比较方便的方式为滚动升级,在升级过程中,对集群中的实例进行逐渐替换成新版本,保证了服务可的用行。但这种升级模式是理想化的,为什么呢?这里有一个假设是新老版本的接口未发生变化,才能在升级过程中,不会影响上下游的服务。
一旦大版本的更新(有新业务特性或接口变更),则需要使用灰度发布。通过灰度发布的策略,把流量有区别地分发到新老版本。
如何对节点进行维护?