Skip to Content

OpenShift Kubernetes Stateful Set: Managing Stateful Applications with Ease

Introduction

Kubernetes is well known for managing stateless applications effectively, but what about applications that require stable network identities, persistent storage, and ordered deployment? This is where Stateful Sets come into play. In OpenShift, Stateful Sets provide a way to deploy and manage stateful applications like databases, message queues, and distributed systems.

This blog post will explain what Stateful Sets are, why they matter, and how to deploy them efficiently in an OpenShift environment, with a specific example using Oracle Database.

What is a Stateful Set?

A Stateful Set is a Kubernetes resource used to manage stateful applications. Unlike Deployments, which treat all pods as identical instances, Stateful Sets ensure:

  • Stable network identities: Each pod in a Stateful Set gets a unique and stable hostname.
  • Persistent storage: Storage volumes are not automatically deleted when a pod is terminated.
  • Ordered deployment and scaling: Pods are started and terminated sequentially, ensuring proper startup dependencies.
  • Graceful pod termination: Ensures that application shutdown processes are completed properly before a pod is replaced.

Use Cases for Stateful Sets

Stateful Sets are best suited for applications that require stable storage and ordered operations. Examples include:

  • Databases: Oracle Database, PostgreSQL, MySQL, MongoDB
  • Messaging Systems: Kafka, RabbitMQ
  • Distributed File Systems: Ceph, GlusterFS
  • Identity and Directory Services: OpenLDAP, Keycloak

Deploying a Stateful Set in OpenShift

Let's go through a detailed example of deploying a Stateful Set in OpenShift for an Oracle Database instance.

Step 1: Define a Persistent Volume Claim (PVC)

Stateful Sets require persistent storage to maintain data across pod restarts. Here’s an example PVC definition for Oracle Database storage:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oracle-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: ocs-storage

Step 2: Create a StatefulSet for Oracle Database

Now, let’s define a StatefulSet for Oracle Database that utilizes the PVC.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: oracle-statefulset
spec:
  serviceName: "oracle"
  replicas: 1
  selector:
    matchLabels:
      app: oracle-db
  template:
    metadata:
      labels:
        app: oracle-db
    spec:
      containers:
      - name: oracle-db
        image: container-registry.oracle.com/database/enterprise:19.3.0
        ports:
        - containerPort: 1521
        - containerPort: 5500
        env:
        - name: ORACLE_SID
          value: "ORCLCDB"
        - name: ORACLE_PDB
          value: "ORCLPDB1"
        - name: ORACLE_PWD
          valueFrom:
            secretKeyRef:
              name: oracle-secret
              key: password
        volumeMounts:
        - name: oracle-storage
          mountPath: /opt/oracle/oradata
  volumeClaimTemplates:
  - metadata:
      name: oracle-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 50Gi

Step 3: Expose the Stateful Set

To allow communication with the Oracle Database instance, create a service:

apiVersion: v1
kind: Service
metadata:
  name: oracle-service
spec:
  type: ClusterIP
  selector:
    app: oracle-db
  ports:
  - name: sqlnet
    port: 1521
    targetPort: 1521
  - name: emexpress
    port: 5500
    targetPort: 5500

Step 4: Deploy and Verify

Apply the configurations to your OpenShift cluster:

oc apply -f pvc.yaml
oc apply -f statefulset.yaml
oc apply -f service.yaml

Check the running pods:

oc get pods -l app=oracle-db

You should see an Oracle Database pod running with a stable name like oracle-statefulset-0.

To check Oracle logs and confirm the database is up, use:

oc logs oracle-statefulset-0

Best Practices for Stateful Sets in OpenShift

  1. Use Persistent Volume Claims (PVCs) Wisely: Ensure that each replica gets a dedicated PVC instead of using shared storage.
  2. Choose the Right Storage Class: OpenShift supports various storage options like OpenShift Container Storage (OCS), CephFS, NFS, and AWS EBS; pick the one that fits your needs.
  3. Secure Credentials: Store database passwords securely using Kubernetes secrets instead of hardcoding them in the Stateful Set definition.
  4. Optimize Scaling: When scaling up or down, remember that Stateful Sets manage pods sequentially, which might slow down operations.
  5. Use Headless Services: Required for proper DNS resolution between pods.
  6. Monitor Your Stateful Applications: Use OpenShift’s monitoring tools like Prometheus and Grafana to track performance and availability.
  7. Regular Backups: Ensure database data integrity by implementing scheduled backups using OpenShift jobs or external backup solutions.

Conclusion

Stateful Sets are a powerful way to deploy stateful applications in OpenShift while ensuring stability and persistence. Deploying an Oracle Database using Stateful Sets allows for proper data management, high availability, and scalable architecture.

By following best practices and leveraging OpenShift’s robust features, you can deploy resilient stateful applications with ease.

Are you looking to optimize your OpenShift deployments? ComputingEra can help you design, implement, and maintain stateful applications on OpenShift with best-in-class practices. Contact us today!

OpenShift Kubernetes Stateful Set: Managing Stateful Applications with Ease
COMPUTINGERA, Yassin February 14, 2025
Share this post
Unlocking the Power of FortiAnalyzer: A Comprehensive Guide to Network Security and Analytics