Generally, Kubernetes deployment is used to deploy applications. In contrast, a Stateful set is used to deploy Stateful applications, and all applications are made up of different states, depending on how they were configured. Databases, message queues, caches, etc., have a higher degree of State because they rely on storage. Authentication happens when users log into a website using their username and password. After authentication, the session ID and cookie are stored in the browser. For any subsequent requests that go into your web server, the web server can identify those requests and server the website components to any user.
Kubernetes Stateful Sets is a pod controller that always maintains its identity even after rescheduling the pods deployed, scaled, and deleted in a guaranteed order. Every Kubernetes pod in a Stateful set gets its stable storage. You can use a Stateful set for applications that require a stable name and state. The difference between stateful and replica sets is that when pods are created by replicas and rescheduled, they get a new name and IP address. The stateful set ensures that the pod keeps the same name and the same IP address, even when it gets rescheduled. Stateful sets also allow you to run multiple pod replicas; some replicas are not the same and can have their own set of volume claims or, more specifically, their own set of volume claim templates. When we use a Stateful set, each pod gets its persistent volume, and when the pods are restarted, it gets attached to the same persistent volume with the fixed name. The replicas also do not have random names; each pod gets assigned an index.
Let’s see how you can run MySQL using a Stateful Set
- Create your Persistent Volumes for your MySQL Stateful Set.
apiVersion: v1 kind: PersistentVolume metadata: name: mysql1 spec: accessModes: - ReadWriteOnce storageClassName: manual capacity: storage: 2Gi hostPath: path: /mysql1
- This will create two persistent volumes in your Node pool.
- View all running persistent volumes using the
kubectl get pvcommand.
- Next, view all running Persistent Volume Claim using the
kubectl get pvccommand.
- Next, create the secret for your node, which will be applied to the Stateful Set.
apiVersion: v1 kind: Secret metadata: name: mysql-password type: opaque stringData: MYSQL_ROOT_PASSWORD: password
- Apply the changes on your MySQL secret using the
kubectl apply -f secret.yamlcommand.
- Next, create your Stateful set for your Kubernetes resources with the headless Service. In the VolumeClaim template section, we define the persistent volume claim. So, when your Stateful set wants to create a new replica, it will use the template to create the persistent volume, and persistent volume claim resource for each part separately. When you’re done with the configuration, apply the changes using
kubectl apply statefulset.yaml
apiVersion: v1 kind: Service metadata: name: mysql labels: app: mysql spec: ports: - port: 3306 clusterIP: None selector: app: mysql --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-set spec: selector: matchLabels: app: mysql serviceName: "mysql" replicas: 2 template: metadata: labels: app: mysql spec: terminationGracePeriodSeconds: 10 containers: - name: mysql image: mysql:5.7 ports: - containerPort: 3306 volumeMounts: - name: mysql-store mountPath: /var/lib/mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-password key: MYSQL_ROOT_PASSWORD volumeClaimTemplates: - metadata: name: mysql-store spec: accessModes: - ReadWriteOnce storageClassName: "manual" resources: requests: storage: 5Gi
- Next, view your pods you created using the StatefulSet. You’ll see that your pods are running, and some will also be creating with the ContainerCreating tag.
- View all running pods using the
kubectl get podscommand.
- Next, connect the MySQL server using the pods you created.
apiVersion: v1 kind: Pod metadata: name: mysql-client spec: containers: - name: mysql-container image: alpine command: ['sh','-c', "sleep 1800m"] imagePullPolicy: IfNotPresent
- Next, confirm if your pod created using the
kubectl get podscommand
- Login to your pod using the
kubectl exec it mysql-client /bin/sh
- Next, add the MySQL client using by typing the
apk add mysql-clientin your terminal.
- Connect to the MySQL instance using
mysql -u root -p -h mysql-set-0.mysql.defualt. You’ll see that you’re logged on to your Server. After logging in, you can start creating your databases and tables.
Stateful sets create pods with stable identities and network identities because the host name never changes. Every pod name in a Stateful set combines the Stateful sets name and a number in an orderly sequence. With our Kubernetes headless service workflows, you can simply provide and enable a stable network identity for thousands of pods with just a simple command in a guaranteed order.