⎈ k8s knowledge compiler

StatefulSets [page]deterministic

A StatefulSet runs a group of Pods, and maintains a sticky identity for each of those Pods. This is useful for managing applications that need persistent storage or a stable, unique network identity.

concepts

StatefulSet is the workload API object used to manage stateful applications.

[definition:statefulset]

## Using StatefulSets

StatefulSets are valuable for applications that require one or more of the following:

* Stable, unique network identifiers. * Stable, persistent storage. * Ordered, graceful deployment and scaling. * Ordered, automated rolling updates.

In the above, stable is synonymous with persistence across Pod (re)scheduling. If an application doesn't require any stable identifiers or ordered deployment, deletion, or scaling, you should deploy your application using a workload object that provides a set of stateless replicas. [Deployment](/docs/concepts/workloads/controllers/deployment/) or [ReplicaSet](/docs/concepts/workloads/controllers/replicaset/) may be better suited to your stateless needs.

## Limitations

* The storage for a given Pod must either be provisioned by a [PersistentVolume Provisioner](/docs/concepts/storage/dynamic-provisioning/) based on the requested _storage class_, or pre-provisioned by an admin. * Deleting and/or scaling a StatefulSet down will _not_ delete the volumes associated with the StatefulSet. This is done to ensure data safety, which is generally more valuable than an automatic purge of all related StatefulSet resources. * StatefulSets currently require a [Headless Service](/docs/concepts/services-networking/service/#headless-services) to be responsible for the network identity of the Pods. You are responsible for creating this Service. * StatefulSets do not provide any guarantees on the termination of pods when a StatefulSet is deleted. To achieve ordered and graceful termination of the pods in the StatefulSet, it is possible to scale the StatefulSet down to 0 prior to deletion. * When using [Rolling Updates](#rolling-updates) with the default [Pod Management Policy](#pod-management-policies) (`OrderedReady`), it's possible to get into a broken state that requires [manual intervention to repair](#forced-rollback).

## Components

The example below demonstrates the components of a StatefulSet.

```yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx # has to match .spec.template.metadata.labels serviceName: "nginx" replicas: 3 # by default is 1 minReadySeconds: 10 # by default is 0 template: metadata: labels: app: nginx # has to match .spec.selector.matchLabels spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.24 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 ```

> Note: This example uses the `ReadWriteOnce` access mode, for simplicity. For production use, the Kubernetes project recommends using the `ReadWriteOncePod` access mode instead.

In the above example:

* A Headless Service, named `nginx`, is used to control the network domain. * The StatefulSet, named `web`, has a Spec that indicates that 3 replicas of the nginx container will be launched in unique Pods. * The `volumeClaimTemplates` will provide stable storage using [PersistentVolumes](/docs/concepts/storage/persistent-volumes/) provisioned by a PersistentVolume Provisioner.

The name of a StatefulSet object must be a valid [DNS label](/docs/concepts/overview/working-with-objects/names#dns-label-names).

### Pod Selector

You must set the `.spec.selector` field of a StatefulSet to match the labels of its `.spec.template.metadata.labels`. Failing to …(trimmed)

Sources

concepts/workloads/controllers/statefulset.md · docStatefulSets

Related (25)

references Controllercontroller conf=1
references Garbage Collectiongarbage collector conf=1
references Control Planecontrol plane conf=1
defines StatefulSet conf=1
part_of Using StatefulSetsdescribes conf=1
part_of Limitationsdescribes conf=1
part_of Componentsdescribes conf=1
part_of Pod Identitydescribes conf=1
part_of Deployment and Scaling Guaranteesdescribes conf=1
part_of Update strategiesdescribes conf=1
part_of Rolling Updatesdescribes conf=1
part_of Revision historydescribes conf=1
part_of PersistentVolumeClaim retentiondescribes conf=1
part_of {{% heading "whatsnext" %}}describes conf=1
part_of Pod Selectordescribes conf=1
part_of Volume Claim Templatesdescribes conf=1
part_of Minimum ready secondsdescribes conf=1
part_of Ordinal Indexdescribes conf=1
part_of Start ordinaldescribes conf=1
part_of Stable Network IDdescribes conf=1
part_of Stable Storagedescribes conf=1
part_of Pod Name Labeldescribes conf=1
part_of Pod index labeldescribes conf=1
part_of Pod Management Policiesdescribes conf=1
part_of Partitioned rolling updates {#partitions}describes conf=1

← all Docs