学习 Kubernetes StatefulSets 篇四

/ K8s / 没有评论 / 96浏览

202016202759-k8s

Kubernetes StatefulSets

StatefulSets(有状态系统服务设计)在 Kubernetes 1.7 中还是beta特性,同时StatefulSets是1.4 版本中PetSets的替代品。PetSets的用户参考1.5 升级指南

使用StatefulSets

在具有以下特点时使用 StatefulSets

Pod 调度运行时,如果应用不需要任何稳定的标示、有序的部署、删除和扩展,则应该使用一组无状态副本的控制器来部署应用,例如 DeploymentReplicaSet更适合无状态服务需求。

限制

组件

示例:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: gcr.io/google_containers/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: my-storage-class
      resources:
        requests:
          storage: 1Gi

部署和扩展

不要将 StatefulSetpod.Spec.TerminationGracePeriodSeconds 值设置为0,这样设置不安全,建议不要这么使用。更多说明,请参考force deleting StatefulSet Pods.

在上面示例中,会按顺序部署三个 podname: web-0、web-1、web-2)。web-0Running and Ready状态后开始部署web-1,web-1Running and Ready 状态后部署 web-2,期间如果 web-0 运行失败,web-2是不会被运行,直到 web-0 重新运行,web-1、web-2才会按顺序进行运行。

如果用户通过 StatefulSet 来扩展修改部署 pod 副本数,比如修改 replicas=1,那么 web-2 首先被终止。在 web-2 完全关闭和删除之前,web-1 是不会被终止。如果在 web-2被终止和完全关闭后,但 web-1 还没有被终止之前,此时 web-0 运行出错了,那么直到 web-0 再次变为 Running and Ready 状态之后,web-1 才会被终止。

Pod管理

Kubernetes 1.7 及更高版本中,StatefulSet 放宽了排序规则,同时通过 .spec.podManagementPolicy 字段保留其uniquenessidentity guarantees

OrderedReady Pod Management

OrderedReady Pod ManagementStatefulSets 的默认行为。它实现了上述 “部署/扩展” 行为。

Parallel Pod Management

Parallel Pod Management 告诉 StatefulSet 控制器同时启动或终止所有 Pod

Update Strategies

Kubernetes 1.7 及更高版本中,StatefulSet.spec.updateStrategy 字段允许配置和禁用 StatefulSetPodscontainerslabelsresource request/limitsannotations 的滚动更新。

删除

spec.updateStrategy 未指定时的默认策略,OnDelete 更新策略实现了传统(1.6和以前)的行为。当 StatefulSet .spec.updateStrategy.type 设置为 OnDelete,StatefulSet 控制器将不会自动更新 StatefulSet 中的 Pod,用户必须手动删除 Pods 以使控制器创建新的 Pod

滚动更新

RollingUpdate 更新策略实现了自动化,使 StatefulSet 中的 Pod 滚动更新。当 StatefulSet .spec.updateStrategy.type 设置为 RollingUpdateStatefulSet控制器将删除并重新创建 StatefulSet 中的每个 Pod。它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的顺序)来更新每个 Pod

Partitions

通过指定 .spec.updateStrategy.rollingUpdate.partition 来分割 RollingUpdate 更新策略。如果指定了 partition,则当更新 StatefulSet 时,将更新具有大于或等于 partition 的序数的所有 Pods .spec.template,小于 partition 的序数的所有 Pod 将不会被更新。如果一个 StatefulSet.spec.updateStrategy.rollingUpdate.partition 大于它.spec.replicas,它的更新 .spec.template 将不会被传 Pods。在通常数情况下,不需要使用 partition,但如果需要进行更新,推出金丝雀或执行分阶段推出,可以使用 partition

了解更多 StatefulSet: Kubernetes 中对有状态应用的运行和伸缩