烟台网站制作山海云,长沙电信网站备案,云南文山网站建设费用,专业公司标志设计StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象
StatefulSet 用来管理某 Pod 集合的部署和扩缩#xff0c; 并为这些 Pod 提供持久存储和持久标识符
和 Deployment 类似#xff0c; StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同…StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象
StatefulSet 用来管理某 Pod 集合的部署和扩缩 并为这些 Pod 提供持久存储和持久标识符
和 Deployment 类似 StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是 StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的 但是不能相互替换无论怎么调度每个 Pod 都有一个永久不变的 ID
如果希望使用存储卷为工作负载提供持久存储可以使用 StatefulSet 作为解决方案的一部分。 尽管 StatefulSet 中的单个 Pod 仍可能出现故障 但持久的 Pod 标识符使得将现有卷与替换已失败 Pod 的新 Pod 相匹配变得更加容易
使用 StatefulSet
StatefulSet 对于需要满足以下一个或多个需求的应用程序很有价值
稳定的、唯一的网络标识符。稳定的、持久的存储。有序的、优雅的部署和扩缩。有序的、自动的滚动更新。 在上面描述中“稳定的”意味着 Pod 调度或重调度的整个过程是有持久性的。 如果应用程序不需要任何稳定的标识符或有序的部署、删除或扩缩 则应该使用由一组无状态的副本控制器提供的工作负载来部署应用程序比如 Deployment 或者 ReplicaSet 可能更适用于你的无状态应用部署需要
限制
给定 Pod 的存储必须由 PersistentVolume Provisioner 基于所请求的 storage class 来制备或者由管理员预先制备。删除或者扩缩 StatefulSet 并不会删除它关联的存储卷。 这样做是为了保证数据安全它通常比自动清除 StatefulSet 所有相关的资源更有价值。StatefulSet 当前需要无头服务来负责 Pod 的网络标识。你需要负责创建此服务。当删除一个 StatefulSet 时该 StatefulSet 不提供任何终止 Pod 的保证。 为了实现 StatefulSet 中的 Pod 可以有序且体面地终止可以在删除之前将 StatefulSet 缩容到 0。在默认 Pod 管理策略(OrderedReady) 时使用滚动更新 可能进入需要人工干预才能修复的损坏状态
示例
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:selector:matchLabels:app: nginx # 必须匹配 .spec.template.metadata.labelsserviceName: nginxreplicas: 3 # 默认值是 1minReadySeconds: 10 # 默认值是 0template:metadata:labels:app: nginx # 必须匹配 .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: nginximage: registry.k8s.io/nginx-slim:0.8ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ ReadWriteOnce ]storageClassName: my-storage-classresources:requests:storage: 1Gi上述示例中
nginx 的 Headless Service 用来控制网络域名。web 的 StatefulSet 有一个 Spec它表明将在独立的 3 个 Pod 副本中启动 nginx 容器。volumeClaimTemplates 将通过 PersistentVolume 制备程序所准备的 PersistentVolumes 来提供稳定的存储
稳定的网络 ID
StatefulSet 中的每个 Pod 根据 StatefulSet 的名称和 Pod 的序号派生出它的主机名。 组合主机名的格式为 ( S t a t e f u l S e t 名称 ) − (StatefulSet 名称)- (StatefulSet名称)−(序号)。 上例将会创建三个名称分别为 web-0、web-1、web-2 的 Pod。 StatefulSet 可以使用无头服务控制它的 Pod 的网络域。管理域的这个服务的格式为 ( 服务名称 ) . (服务名称). (服务名称).(名字空间).svc.cluster.local其中 cluster.local 是集群域。 一旦每个 Pod 创建成功就会得到一个匹配的 DNS 子域格式为 ( p o d 名称 ) . (pod 名称). (pod名称).(所属服务的 DNS 域名)其中所属服务由 StatefulSet 的 serviceName 域来设定。
取决于集群域内部 DNS 的配置有可能无法查询一个刚刚启动的 Pod 的 DNS 命名。 当集群内其他客户端在 Pod 创建完成前发出 Pod 主机名查询时就会发生这种情况。 负缓存 (在 DNS 中较为常见) 意味着之前失败的查询结果会被记录和重用至少若干秒钟 即使 Pod 已经正常运行了也是如此。
如果需要在 Pod 被创建之后及时发现它们可使用以下选项
直接查询 Kubernetes API比如利用 watch 机制而不是依赖于 DNS 查询缩短 Kubernetes DNS 驱动的缓存时长通常这意味着修改 CoreDNS 的 ConfigMap目前缓存时长为 30 秒
更新策略
StatefulSet 的 .spec.updateStrategy 字段让你可以配置和禁用掉自动滚动更新 Pod 的容器、标签、资源请求或限制、以及注解。有两个允许的值
OnDelete 当 StatefulSet 的 .spec.updateStrategy.type 设置为 OnDelete 时 它的控制器将不会自动更新 StatefulSet 中的 Pod。 用户必须手动删除 Pod 以便让控制器创建新的 Pod以此来对 StatefulSet 的 .spec.template 的变动作出反应 RollingUpdate RollingUpdate 更新策略对 StatefulSet 中的 Pod 执行自动的滚动更新。这是默认的更新策略
滚动更新
当 StatefulSet 的 .spec.updateStrategy.type 被设置为 RollingUpdate 时 StatefulSet 控制器会删除和重建 StatefulSet 中的每个 Pod。 它将按照与 Pod 终止相同的顺序从最大序号到最小序号进行每次更新一个 Pod
Kubernetes 控制平面会等到被更新的 Pod 进入 Running 和 Ready 状态然后再更新其前身。 如果你设置了 .spec.minReadySeconds查看最短就绪秒数 控制平面在 Pod 就绪后会额外等待一定的时间再执行下一步
分区滚动更新
通过声明 .spec.updateStrategy.rollingUpdate.partition 的方式RollingUpdate 更新策略可以实现分区。 如果声明了一个分区当 StatefulSet 的 .spec.template 被更新时 所有序号大于等于该分区序号的 Pod 都会被更新。 所有序号小于该分区序号的 Pod 都不会被更新并且即使它们被删除也会依据之前的版本进行重建。 如果 StatefulSet 的 .spec.updateStrategy.rollingUpdate.partition 大于它的 .spec.replicas则对它的 .spec.template 的更新将不会传递到它的 Pod。 在大多数情况下你不需要使用分区但如果你希望进行阶段更新、执行金丝雀或执行分阶段上线则这些分区会非常有用
最大不可用 Pod
特性状态 Kubernetes v1.24 [alpha] 你可以通过指定 .spec.updateStrategy.rollingUpdate.maxUnavailable 字段来控制更新期间不可用的 Pod 的最大数量。 该值可以是绝对值例如“5”或者是期望 Pod 个数的百分比例如10%。 绝对值是根据百分比值四舍五入计算的。 该字段不能为 0。默认设置为 1
该字段适用于 0 到 replicas - 1 范围内的所有 Pod。 如果在 0 到 replicas - 1 范围内存在不可用 Pod这类 Pod 将被计入 maxUnavailable 值