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
- Use Persistent Volume Claims (PVCs) Wisely: Ensure that each replica gets a dedicated PVC instead of using shared storage.
- 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.
- Secure Credentials: Store database passwords securely using Kubernetes secrets instead of hardcoding them in the Stateful Set definition.
- Optimize Scaling: When scaling up or down, remember that Stateful Sets manage pods sequentially, which might slow down operations.
- Use Headless Services: Required for proper DNS resolution between pods.
- Monitor Your Stateful Applications: Use OpenShift’s monitoring tools like Prometheus and Grafana to track performance and availability.
- 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!