无状态应用进程客户端的每次连接均可独立地处理,一次请求和响应即构成一个完整的事务,它们不受已完成的连接或现有其他连接的影响,且意外中断或关闭时仅需要重新建立连接即可,因而,无状态应用的Pod对象可随时由其他由同一模板创建的Pod平滑替代,这也正是Deployment控制器编排应用的方式。
在云原生应用的体系里有两组常用的近义词:第一组是无状态(stateless)、牲畜(cattle)、无名(nameless)和可丢弃(disposable),它们都可用于表述无状态应用;另一组是有状态(stateful)、宠物(pet)、具名(having name)和不可丢弃(non-disposable),它们都可用于表示有状态应用。
Kubernetes系统使用专用的StatefulSet控制器编排有状态应用。StatefulSet表示一组具有唯一持久身份和稳定主机名的Pod对象,任何指定该类型Pod的状态信息和其他弹性数据都存放在与该StatefulSet相关联的永久性磁盘存储空间中。StatefulSet旨在部署有状态应用和集群化应用,这些应用会将数据保存到永久性存储空间,它适合部署Kafka、MySQL、Redis、ZooKeeper以及其他需要唯一持久身份和稳定主机名的应用。
一个典型的、完整可用的StatefulSet资源通常由两个组件构成:Headless Service和StatefulSet资源。Headless Service用于为各Pod资源固定、唯一的标识符生成可解析的DNS资源记录,StatefulSet用于编排Pod对象,并借助volumeClaimTemplate以静态或动态的PV供给方式为各Pod资源提供专有且固定的存储资源。
与Deployment略有不同的是,StatefulSet对应用规模的扩容意味着按索引顺序增加更多的Pod资源,而缩容则表示按逆序依次删除索引号最大的Pod资源,直到规模数量满足目标设定值为止。需要特别说明的,多数有状态应用都不支持规模性安全、快速的缩减操作,因此StatefulSet控制器不支持并行缩容机制,而是要严格遵守一次仅能终止一个Pod资源的法则,以免导致数据讹误。这通常也意味着,存在错误且未恢复的Pod资源时,StatefulSet资源会拒绝启动缩容操作。
StatefulSet资源的滚动更新还支持分区(partition)机制,用户可基于某个用于分区的索引号对Pod资源进行分区,所有大于等于此索引号的Pod对象会被滚动更新,而小于此索引号的则不会被更新,而且,即便在此期间该范围内的某Pod对象被删除,它也一样会被基于旧版本的Pod模板重建。若给定的分区号大于副本数量,意味着不存在大于此分区号的Pod资源索引号,因此,所有的Pod对象均不会被更新,这对于期望暂存发布、金丝雀发布或分段发布来说是有用的设定。
Operator就是一个开发规范和SDK,它合理地利用Kubernetes API的CRD功能扩展出二级抽象,又巧妙地回归到Kubernetes的“控制器”逻辑,从而提供了一个有状态应用的实现接口,用户可利用它开发专用于管理某个特定有状态应用的运维控制器,并按需回馈给社区。
标签:状态,控制器,StatefulSet,应用,Pod,K8S,资源 From: https://blog.51cto.com/key3feng/5775956