Skip to content

015集群服务命名规范

k8s集群的服务分类

在K8S运行的服务,从简单到复杂可以分成三类:无状态服务、普通有状态服务和有状态集群服务。下面分别来看K8S是如何运行这三类服务的。

1、无状态服务(Stateless Service)

1)定义:是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。

2)随意扩容和缩容:这些节点可以随意扩容或者缩容,只要简单的增加或减少副本的数量就可以。K8S使用RC(或更新的Replica Set)来保证一个服务的实例数量,如果说某个Pod实例由于某种原因Crash了,RC会立刻用这个Pod的模版新启一个Pod来替代它,由于是无状态的服务,新启的Pod与原来健康状态下的Pod一模一样。在Pod被重建后它的IP地址可能发生变化,为了对外提供一个稳定的访问接口,K8S引入了Service的概念。一个Service后面可以挂多个Pod,实现服务的高可用。

3)多个实例可以共享相同的持久化数据:例如数据存储到mysql。

相关的k8s资源有:ReplicaSet、ReplicationController、Deployment等,由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容的时候并不会明确缩容某一个pod,而是随机的,因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以。

2、普通有状态服务(Stateful Service)

和无状态服务相比,它多了状态保存的需求。即有数据存储功能。这类服务包括单实例的mysql。

因为无状态的容器异常重启就会造成数据丢失,也无法多副本部署,无法实现负载均衡。

比如java应用服务的Session数据默认存储在磁盘上,比如 /tmp 目录,而多副本负载均衡时,多个java容器的目录是彼此隔离的。比如存在两个副本A和B,用户第一次请求时候,流量被转发到A,并生成了SESSION,而第二次请求时,流量可能被负载均衡器转发到B上,而B是没有SESSION数据的,所以就会造成会话超时等BUG。

如果采用主机卷的方式,多个容器挂载同一个主机目录,就可以共享SESSION数据,但是如果多主机负载均衡场景,就需要将SESSION存储于外部数据库或Redis中了。

Kubernetes提供了以Volume和Persistent Volume为基础的存储系统,可以实现服务的状态保存。

普通状态服务只能有一个实例,因此不支持“自动服务容量调节”。一般来说,数据库服务或者需要在本地文件系统存储配置文件或其它永久数据的应用程序可以创建使用有状态服务。要想创建有状态服务,必须满足几个前提:

1)待创建的服务镜像(image)的Dockerfile中必须定义了存储卷(Volume),因为只有存储卷所在目录里的数据可以被备份

2)创建服务时,必须指定给该存储卷分配的磁盘空间大小

3)如果创建服务的同时需要从之前的一个备份里恢复数据,那么还要指明该存储卷用哪个备份恢复。

无状态服务和有状态服务主要有以下几点区别: 实例数量:无状态服务可以有一个或多个实例,因此支持两种服务容量调节模式;有状态服务只能有一个实例,不允许创建多个 实例,因此也不支持服务容量调节模式。

存储卷:无状态服务可以有存储卷,也可以没有,即使有也无法备份存储卷里面的数据;有状态服务必须要有存储卷,并且在创建服务时,必须指定给该存储卷分配的磁盘空间大小。

数据存储:无状态服务运行过程中的所有数据(除日志和监控数据)都存在容器实例里的文件系统中,如果实例停止或者删除,则这些数据都将丢失,无法找回;而对于有状态服务,凡是已经挂载了存储卷的目录下的文件内容都可以随时进行备份,备份的数据可以下载,也可以用于恢复新的服务。但对于没有挂载卷的目录下的数据,仍然是无法备份和保存的,如果实例停止或者删除,这些非挂载卷里的文件内容同样会丢失。

3、有状态集群服务(Stateful cluster Service)

与普通有状态服务相比,它多了集群管理的需求,即有状态集群服务要解决的问题有两个:

一个是状态保存,另一个是集群管理。

这类服务包括kafka、zookeeper等。

上面巴拉巴拉小魔仙,说了一堆废话了一小会,不想看其实可以跳过,知道有这么一回事就行

环境命名规范

参考阿里云云效, 因为我觉的阿里的命名确实很统一且简洁

后端服务

shell
pod-[环境编码]-[资源名称全称]

例如: cutejava-tiny-service服务

# 日常环境
pod-daily-cutejava-tiny-service

# 预发环境
pod-stage-cutejava-tiny-service

# 生产环境
pod-online-cutejava-tiny-service

前端服务

shell
pod-[环境编码]-[资源名称缩写]

例如: cutejava-tiny-service服务

# 日常环境
pod-daily-cutejava

# 预发环境
pod-stage-cutejava

# 生产环境
pod-online-cutejava