基本概念
有状态工作负载:即kubernetes中的“StatefulSet”,有状态工作负载支持实例有序部署和删除,支持持久化存储,适用于实例间存在互访的场景,如ETCD、mysql-HA等。
操作场景
在运行过程中会保存数据或状态的工作负载称为“有状态工作负载(statefulset)”。例如Mysql,它需要存储产生的新数据。
因为容器可以在不同主机间迁移,所以在宿主机上并不会保存数据,这依赖于云容器引擎提供的高可用存储卷,将存储卷挂载在容器上,从而实现有状态工作负载的数据持久化。
前提条件
在创建容器工作负载前,您需要存在一个可用集群。若没有请参照集群开通中内容创建。
若工作负载需要被外网访问,请确保集群中至少有一个节点已绑定弹性IP,或已购买负载均衡实例。
创建多个工作负载时,请确保容器使用的端口不冲突 ,否则部署会失败。
操作步骤及说明
创建StatefulSet与创建Deployment的过程类似,但主要有以下几个方面的差异,需要注意:
数据卷
除了Deployment能够使用的六种类型的数据卷之外,StatefulSet还多了新建PVC这种类型的数据卷挂载,而且这种类型的数据卷仅StatefulSet能够使用。一般情况下,如果我们使用StatefulSet来做数据的持久化,即可使用新建PVC这种数据卷。
使用这种数据卷挂载的时候,我们需要提前创建好存储类,然后点击上面的新建pvc。
新建pvc时的参数需要留意,只有同时满足下述条件,新建PVC才能成功绑定到我们提前创建的持久存储卷上:
- 名称可以任意填写 -StorageClass;名称要选择我们提前创建好的持久存储类。
- 所需容器:不能超过我们提前创建好的持久存储卷的容量。
- 访问模式:要和我们提前创建的持久存储卷的访问模式一致。
高级设置-升级方式
StatefulSet的另外一个差异点就是升级方式和Deployment不同,(升级方式需要点开工作负载的高级设置):
1、删除升级:如果设置StatefulSet的升级方式为删除升级,那么我们全量替换升级StatefulSet时,全量替换更新的内容在我们重新部署Pods前是不会生效的。
2、滚动升级(不推荐这种升级方式):如果设置StatefulSet的升级方式为滚动升级,那么我们全量替换升级StatefulSet时,k8s会自动帮我们删除重建StatefulSet的每一个Pod,此时有一个可选的参数Partition。一般建议不设置Partition。
以下场景可以设置Partition:执行预发布 - 执行金丝雀更新 - 执行按阶段的更新。
Partition含义:只有序号大于或等于partition值时, Pod 将被删除重建,即序号小于partition值,Pod会维持原状不更新。
partition默认值为0,意味着所有的Pod都会被删除重建(序号的含义:假设StatefulSet有3个副本,即对应三个Pod,那么StatefulSet的这三个Pod会依次命名为0, 1, 2号,这里的编号即是序号)。 序号小于partition的Pod不会被升级,即使手动删除该Pod,重新创建出来的也是旧版本的Pod。
服务名称
强烈建议创建有状态工作负载的同时创建Headless服务,同时创建有状态工作负载和服务时可以忽略这个参数 。这个参数仅对于分开创建有状态工作负载和服务的用户有效 - 如果分开创建有状态工作负载和服务,那么请务必设置这个参数,并且后续创建服务时,服务名称必须和这个参数保持一致。