A StatefulSet is a controller that helps you deploy and scale groups of K8s pods.When pods are deployed in order that they have a persistent storage volume and unique stable network identifier to restart and reschedules the pod .
StatefulSets comes with k8s v1.9 .
Manages the deployment and scaling of a set of pods and provides guarantees about the ordering and uniqueness of the pod . Firstly let us know what are the Stateful application . A Stateful application that store data to keep track of its state . Some Stateful application are MySQL , MongoDB , Cassandra etc.
StatefulSet create the pod with a unique naming conventions like if you create a StatefulSet with name Count . It will create a pod with name count-0 and for multiple replicas of a StatefulSets their name like Count-0 , Count -1 , Count -2 etc . The pod count-0 called Master and other pods count-1 , count-2 called Slave .
In StatefulSet every replica will have its own state and each pod will be creating its own PVC (Persistent Volume Claim ) so if we create statefulset with 3 replica it will create 3 pod and 3 PVC .
StatefulSets are valuable for applications that require :
- Stable and unique network identifiers.
- Stable ,persistent storage .
- Ordered , graceful deployment and scaling .
- Ordered , automated rolling updates .
Some example of reasons you had use a StatefulSet :
- A Redis pod that has access to a volume, but you want it to maintain access to the same volume even if it is redeployed or restarted .
- A Cassandra cluster and have each node maintain access to its data .
- A webapp that needs to communicate with its replicas using known predefined network identifiers .
In the above diagram there are 3 StatefulSet and each pod has its own Persistent Volume .
How to create a StatefulSet :
- StatefulSets currently require a Headless Service to be responsible for the network identity of the Pods.
Headless Service Manifest file :
apiVersion: v1 kind: Service metadata: name: nginx namespace: stateful-blog labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx
StatefulSet Manifest file :
apiVersion: apps/v1 kind: StatefulSet metadata: name: count namespace: stateful-blog spec: serviceName: "nginx" replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: k8s.gcr.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi
- In StatefulSet when Pods are being deployed they are created sequentially it means pods count-1 ,count-2 Pod is not launched untill the count-0 Pod is running .
- The StatefulSet controller created three PersistentVolumeClaims that are bound to three PersistentVolumes.
Delete the Resource:
kubectl delete sts count -n stateful-blog kubectl delete svc nginx -n stateful-blog
Compare with Deployment and StatefulSet :
- Deployments are usually used for stateless applications while StatefulSet are used for stateful applications.
- When we create a deployment it will create a ReplicaSet which will further create the pod . If you create deployment with name Count ,it will create count-<replica-set-id>-<pod-id> . If you create Statefulset it doesn’t create ReplicaSet it creates the Pod with a unique naming convention as we shown in above example .