k8s的有状态应用 StatefulSets

StatefulSets有状态服务

目前来说我个人只在实验环境搞过有状态应用部署,用的是 mysql5.7 ,但是因为其对于主从集群的配置管理和存储的管理有些D ) 8 . l P G C特殊,所以这个方案更多的学习新技术,新的思想,毕竟 mysql 这种考虑主从集群不同配置和其对存储 IO 的要求比较高,不i N . d a v ; F U是很# ~ @ f m : m X建议使用网络 pv 存储,比较建议本地挂载硬盘。2 i . $能力水平目前有限,更多的还是需要学习深耕。

k8C i ^ I es官方文档~ z B p s A B地址:https://kubernetes.io/zh/docs/concepts/workloads/controllers/statefulset/

StatefulSet 是用来管理有状态应用工作负载 API 对象。

StatefulSet 用来管理 Deployment 和扩展一组 PoD l V gd,并且能为这= h O p , J j r些 Pod 提供序号和唯一性保证。

和 Deployment 相同的是,StatefulSet 管理了基于相同容器定义的一组 Pod。但和 Deploym1 2 L N ? Q H }ent 不同的是,StatefulSet 为它们的每个 Pod 维护; { t t v W t了一个固定的 ID。这些 Pod 是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。

StatefulSet 和其他控制器使用相同的工作模式。你在 StatefulSE T * x Q o (et 对象 中定义你期望的状态,然后 StatefuS 9 7 e 6lSet 的 控制器 就会/ t { p q y z I通过各种更新来达到那种你想要的状态。

StatefulSets 对于需要满足以下一个或多m g = l w 4 N a个需求的应用程序:

  • 稳定的、唯一的~ h X 3 q v网络标识符。
  • 稳定的、持久的存储。
  • 有序的、优雅的部署和缩放。
  • 有序的、自动的滚动更新。

在上面,稳定意味着 Pod 调度或重调度的整个过程是有持久性的。如果应用程序不需要任何稳& ? C m b 7 ` C! / ` = ~ # : m I的标识符或有序的部署、删除或伸缩,则应该使用由一} Z P j组无状态的副本控制器提供的工作负载来部署应用程序,比如 Deployment 或者 ReplicaSet T T K N I T ;t 可能更适用于您的% n ^无状` 3 h z J &态应用部署需要。

给定 Pod 的存储必须由 PersistentVolumeh ] 0 驱动 基于所请求的 storage class 来提供,或者由管理员预先提供。

删除或者收缩 St% Y # d ) gatefulSet 并不会删除它x e ( X w 0 @ ~关联的存储卷。w g % I T这样做是为了保证数据安全,它通常比自动清除 StatefulSet 所有相关的资源更有e : ( _ ^ C b =价值。

StatefulSet 当前需要无头服务 来负责 Pod 的网络标识。您需要负责创建此服务。

当删除 StatefulSets 时,StatefulSet 不提供任何终止 Pod 的保证P ( g a $ w h c。为了实现 StatefulSet 中的 Pod 可以有序和优雅的终止,可以在删除之前将 StatefulSet 缩放为 0。? 5 y , $
在默认 Pod 管理策略(OrderedRt 6 0 f 3 @eady) 时使用 滚动更新,可能进入需要 人工干预 才能修复的损坏状态。

StatefulSet Pod 具有唯一的标识,该标识包括顺序标识、稳定的网络标识和稳定的存储。该标识和 PoI 4 j | I m - (d 是绑定的,不管它被调度在哪个节点上。z ? 3 P X c L 5 /

对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号,从 0 到 N-1,该序号在 StatefulSet 上是唯一的。

StatefulSY l 4 V 3 r ] jet 中的每个 Pod 根据 State: e 0 ^ % Q w n wfulSet 的名称和 Pod 的序号派生出它的主机名。 组合主机名的格式为$(StatefulSet 名称)-$(序号)。上例将会创建三个名称分别为 web-0、web-1、web-2 的 Pod。 StatefulSet 可以使用 headless 服务 控制V 4 H D g * x -它的 Pod 的网络域。管理域的这个服务的格式为: $(服务名称).$(命名空间).svc.clusterX F a.local9 Z 0 T V .,其中 cluster.local 是集群域。 一旦每个 Pov l # L -d 创建成功,就会得到一个匹H G % * = [ / c配的 DNS 子域,格式为: $(pod 名称).$(所属服务的 DNS 域名),其中所属服务由 StatefulSet 的 serviceName 域来设定

Kubernetes 为每个 VolumeClaimTemplate 创建一个 PersistentVolumes。 在上面的 nginx 示例中,每个 Pod 将会得到基于 StorageClass my-storage-clasS D M { ] Ks 提供的 1 Gib 的 PersisteK U ntVolume。如果没有声明 StT - x rorageClass,就会使用默认的 StorageClass。 当一个] = 1 R Z Pod 被调度(重新调n j [ 0 # o 4 i p度)到节点上时,它的 volumeMounts 会挂载与其 PersistentVolumeClaims 相关联的 PersistentVolume。 请注意,当 Pod 或者 StatefulSec s St 被删除时,与 PersistentVolumeClaims 相关联的 Pe] t prsistz ~ 7 ^ U @ d + xentVolume 并不会1 j ] R w被删除。要删除它必须通过手动方式来完成。

当 StatefulSet 控制器 创建 Pod 时,它会添加一个标签 statefulset.kubernetes.io/pod-name,该标签设置为 Pod 名称。这个标签允许您给 StatefulSet 中的特定 Pod 绑定一个 Service。

  • 对于包含 N 个 副本的 StatefulSet,当部署 Pod 时,它们是依次创建的,顺序为 0..N-1。
  • 当删除 Pod 时,它们是逆序终止的,顺序为 N-1..0。
  • 在将缩放操作应用到 Pod 之前,它前面的所有 Pod 必须是 Running 和 Ready 状态。
  • 在 Pod 终止之前,所有的继任者必须完全关闭。