k8s StatefulSet 初指南 入门概念

背景

近期工作中需要在内部发布平台兼容k8s原生资源——StatefulSet的发布,特此在这作一系列记录。目前发布系统已经支持deployment和service的增删改查。

什么是有状态

有状态应用允许用户重复返回该应用并恢复之前的操作,比如电子邮件或者网上银行应用。

有状态的应用会记录之前事务的上下文,这些上下文可能会对当前或未来事务产生影响。

所以,有状态的应用必须确保每个用户始终访问同一个应用程序实例,或者有某种在实例之间同步数据的机制。

有状态进程的优点是,应用程序可以存储每个事务的历史和上下文,跟踪最近的活动、配置偏好和窗口位置等元素,并允许用户恢复事务。

有状态的事务的表现就像始终和同一台服务器进行对话一样

StatefulSet

StatefulSet是k8s的原生资源之一,它针对的是有状态的服务。有状态意味着每一个k8s调度的最小单位——Pod是唯一的。每一个Pod需要拥有唯一的标识,唯一的IP,唯一的内存状态,唯一的存储等等。官方建议在拥有以下一个或多个条件时使用StatefulSet:

  • 稳定的、唯一的网络标识符。
  • 稳定的、持久的存储。
  • 有序的、优雅的部署和扩缩。
  • 有序的、自动的滚动更新。

简言之,StatefulSet用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储持久标识符

对比deployment

和 Deployment 类似, StatefulSet 管理基于相同容器规约的一组 Pod。但不同之处在于:

  • StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的, 但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。

同Deployment一样,StatefulSet也无法保证任何一个 Pod 永远能够正常运行,当单个 Pod 出现故障时,重新调度会将此故障的 Pod 重新拉起。由于 Pod 拥有一个永久不变的ID,使用存储卷Volume为工作负载提供持久存储时,将ID和存储卷进行对应也是能够实现的。尽管Pod的IP会变,但相同的ID对应之前的存储,使得重新拉起的Pod拥有和之前一样的“状态”。

Headless Service

什么是headless service呢?官方解释是:

  • 有时不需要或不想要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 "None" 来创建 Headless Service
  • 你可以使用一个无头 Service 与其他服务发现机制进行接口,而不必与 Kubernetes 的实现捆绑在一起。
  • 对于无头 Services 并不会分配 Cluster IP,kube-proxy 不会处理它们, 而且平台也不会为它们进行负载均衡和路由。 DNS 如何实现自动配置,依赖于 Service 是否定义了选择算符。

是否可以不创建Headless Service?

可以不创建。仅创建一个StatefulSet类型的对象是可以成功的。Service的本质还是用于服务发现,如果不创建Headless Service,在集群内部通过域名解析实例会出现问题,即无法通过 [serviceName].[nameSpace].svc.cluster.local解析到对应实例的IP地址。

StatefulSet仅保证它所管辖的Pod有唯一的ID,但并不保证IP不变化,重新调度后Pod的服务发现可以由Headless Service提供。Headless Service不创建用于集群内访问的ClusterIP,访问Service名称时返回后端Pods IP地址,用于适配自有的服务发现机制。

PV & PVC

StatefulSet是否可以不挂载Volume?

可以不挂载直接创建。使用存储卷Volume为工作负载提供持久存储,可以使用 StatefulSet 作为解决方案的一部分,并不是完全强绑定的。有状态不仅意味着挂载有状态的持久存储,内存有状态也属于有状态。

给定 Pod 的存储必须由 PersistentVolume 驱动(就是PV和PVC) 基于所请求的 storage class 来提供,或者由管理员预先提供。

云厂商

有些云厂商为了适配用户需求,支持StatefulSet固定ip的操作,例如腾讯云,在创建可以固定ip的StatefulSet时会带上如下的annotation

tke.cloud.tencent.com/enable-static-ip: "true"

需要注意的是StatefulSet自身是没有保证IP不变的功能!
需要注意的是StatefulSet自身是没有保证IP不变的功能!
需要注意的是StatefulSet自身是没有保证IP不变的功能!

参考

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值