PostgreSQL  

PostgreSQL in Kubernetes: What Changes and Why Performance Feels Different

Introduction

Teams often move PostgreSQL into Kubernetes expecting familiarity. Same database. Same queries. Same workload. But soon after the migration, things feel off. Latency is inconsistent. Disk performance feels unpredictable. Restarts behave differently. Problems appear that never existed on VMs.

This creates confusion because PostgreSQL itself has not changed. The environment around it has.

This article explains what actually changes when PostgreSQL runs in Kubernetes, what engineers usually see in production, and why performance and reliability feel different even when configuration looks identical.

PostgreSQL Was Designed Before Kubernetes

PostgreSQL was built with assumptions:

  • Stable disks

  • Predictable memory ownership

  • Long-running processes

  • Clear separation between OS and database

Kubernetes breaks or reshapes many of these assumptions.

A real-world analogy: imagine moving a heavy industrial machine from a factory floor onto a moving truck. The machine is the same, but vibrations, power supply, and space constraints change how it behaves.

PostgreSQL in Kubernetes runs in a more dynamic, constrained environment.

Storage Is the Biggest Difference

In Kubernetes, storage is abstracted. PostgreSQL no longer talks directly to a physical disk or VM disk.

Instead, it talks to:

  • Network-backed volumes

  • Container storage interfaces

  • Storage classes with different latency profiles

This affects:

  • fsync behavior

  • WAL write latency

  • VACUUM and checkpoint speed

Small storage delays compound quickly in write-heavy workloads.

What Developers Usually See in Production

Teams commonly notice:

  • Inconsistent query latency

  • Slower writes during peak hours

  • Checkpoints causing sudden stalls

  • VACUUM taking longer than expected

  • Performance varying between pods

Because Kubernetes hides storage complexity, these problems feel random.

Memory Limits Change PostgreSQL Behavior

Kubernetes enforces memory limits strictly. PostgreSQL does not naturally expect to be OOM-killed by an external system.

If memory usage crosses the container limit:

  • The pod is killed

  • PostgreSQL has no chance to clean up

  • Recovery runs on restart

This is very different from VM environments where memory pressure is gradual.

Why Failures Feel Sudden

Kubernetes failures are sharp.

  • Pods are killed instantly

  • Storage hiccups appear as latency spikes

  • Node evictions trigger restarts

PostgreSQL transitions from healthy to restarting without much warning. To engineers, this feels unstable, even if Kubernetes is behaving as designed.

Connection Behavior in Kubernetes

Kubernetes encourages horizontal scaling at the application layer. This often leads to more application pods, each with its own connection pool.

The result:

  • Total connection count rises

  • PostgreSQL sees more concurrent sessions

  • Memory and CPU pressure increase

This amplifies the connection exhaustion problems discussed earlier in the series.

Real-World Example

A team migrates PostgreSQL from a VM to Kubernetes using persistent volumes. Performance tests pass. Production traffic ramps up.

During peak hours, write latency spikes. Checkpoints stall queries. Occasionally, the pod restarts due to memory limits. Engineers blame PostgreSQL tuning.

The real issue is storage latency variability combined with strict container limits.

Advantages and Disadvantages of PostgreSQL in Kubernetes

Advantages (When Designed Carefully)

When PostgreSQL is deployed thoughtfully in Kubernetes:

  • Infrastructure becomes reproducible

  • Failover automation improves

  • Operational workflows are standardized

  • Scaling the application layer is easier

  • Observability improves

Kubernetes can bring discipline and consistency.

Disadvantages (When Assumptions Are Not Adjusted)

When PostgreSQL is treated like a stateless service:

  • Performance becomes unpredictable

  • OOM kills cause frequent restarts

  • Storage latency dominates behavior

  • Failures feel random

  • Teams lose confidence in the system

At that point, Kubernetes feels hostile to databases.

How Teams Should Think About This

PostgreSQL in Kubernetes requires mindset changes.

Teams should stop asking:

“Why is PostgreSQL slower in Kubernetes?”

And start asking:

  • What assumptions did PostgreSQL make?

  • How does Kubernetes violate or change them?

  • Which layers now control reliability?

Success comes from respecting both systems.

Simple Mental Checklist

When running PostgreSQL in Kubernetes, check:

  • Is storage latency predictable under load?

  • Are memory limits aligned with worst-case usage?

  • How many total connections hit the database?

  • What triggers pod restarts?

  • Are database assumptions documented?

These questions prevent painful surprises.

Summary

PostgreSQL behaves differently in Kubernetes because the environment changes its core assumptions about storage, memory, and process stability. Performance issues feel sudden because Kubernetes enforces hard limits and abstracts critical layers. Teams that understand these differences and design intentionally can run PostgreSQL reliably in Kubernetes without constant surprises.