DEV Community

Dmitry Romanoff
Dmitry Romanoff

Posted on

Simulating Database Operations with PostgreSQL on Kubernetes

In this article, we'll walk through deploying a PostgreSQL database in a Kubernetes (k8s) environment and simulating various database operations using Python. We will set up a PostgreSQL instance along with ten pods that will perform updates, inserts, deletes, and selects on the database. This setup is perfect for testing scalability and performance.

Step 1: Create a Kubernetes Namespace

First, we need to create a dedicated namespace for our PostgreSQL deployment. This helps in organizing resources and managing them more efficiently.

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: postgres-sim
Enter fullscreen mode Exit fullscreen mode

Run the following command to apply the namespace configuration:

kubectl apply -f namespace.yaml
Enter fullscreen mode Exit fullscreen mode

Step 2: Deploy PostgreSQL

Next, we will create a PostgreSQL deployment and a service to expose it. Here’s how to do that:

# postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  namespace: postgres-sim
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:14
        env:
        - name: POSTGRES_DB
          value: mydb
        - name: POSTGRES_USER
          value: user
        - name: POSTGRES_PASSWORD
          value: password
        ports:
        - containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
  namespace: postgres-sim
spec:
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
Enter fullscreen mode Exit fullscreen mode

Deploy PostgreSQL by executing:

kubectl apply -f postgres-deployment.yaml
Enter fullscreen mode Exit fullscreen mode

Step 3: Prepare the Simulation Container

Now, let’s create a Docker container that will simulate the database operations. First, we'll set up a Dockerfile:

# Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY simulate.py .

RUN pip install psycopg2-binary

CMD ["python", "simulate.py"]
Enter fullscreen mode Exit fullscreen mode

Step 4: Create the Simulation Script

Now we will write the simulate.py script that performs the database operations.

# simulate.py
import psycopg2
import random
import time

# Connect to the database
conn = psycopg2.connect(
    dbname="mydb",
    user="user",
    password="password",
    host="postgres",
    port="5432"
)
cur = conn.cursor()

operations = ["insert", "update", "delete", "select"]

for _ in range(1000000):  # Simulate 1 million operations
    operation = random.choice(operations)
    if operation == "insert":
        cur.execute("INSERT INTO test_table (data) VALUES (%s)", (random.randint(1, 100),))
    elif operation == "update":
        cur.execute("UPDATE test_table SET data = %s WHERE id = %s", (random.randint(1, 100), random.randint(1, 10)))
    elif operation == "delete":
        cur.execute("DELETE FROM test_table WHERE id = %s", (random.randint(1, 10),))
    elif operation == "select":
        cur.execute("SELECT * FROM test_table LIMIT 1")
        print(cur.fetchone())

    conn.commit()
    time.sleep(1)

cur.close()
conn.close()
Enter fullscreen mode Exit fullscreen mode

Build and Push the Docker Image

Build the Docker image:

docker build -t my-python-simulation .
Enter fullscreen mode Exit fullscreen mode

Tag and push the image to your Docker repository:

docker tag my-python-simulation <your-docker-username>/my-python-simulation
docker push <your-docker-username>/my-python-simulation
Enter fullscreen mode Exit fullscreen mode

Step 5: Deploy the Simulation Pods

Now we will create a deployment for the simulation pods:

# simulation-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: db-simulation
  namespace: postgres-sim
spec:
  replicas: 10
  selector:
    matchLabels:
      app: db-simulation
  template:
    metadata:
      labels:
        app: db-simulation
    spec:
      containers:
      - name: simulation
        image: <your-docker-username>/my-python-simulation
Enter fullscreen mode Exit fullscreen mode

Apply the deployment:

kubectl apply -f simulation-deployment.yaml
Enter fullscreen mode Exit fullscreen mode

Step 6: Set Up the Database Table

To store our data, we need to create a table in PostgreSQL. You can access the PostgreSQL pod and run the necessary SQL commands:

kubectl exec -it <postgres-pod-name> -n postgres-sim -- psql -U user -d mydb

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    data INTEGER NOT NULL
);
Enter fullscreen mode Exit fullscreen mode

Step 7: Monitor the Pods

You can check the status of your pods to ensure everything is running smoothly:

kubectl get pods -n postgres-sim
Enter fullscreen mode Exit fullscreen mode

Conclusion

This setup not only helps in testing database performance but also provides insights into how your application handles concurrent database operations.

Feel free to explore further by adjusting the number of operations, modifying the simulation logic, or integrating more complex data handling scenarios!

Top comments (0)