Use cases
=========
.. raw:: html
CloudNativePG has been designed to work with applications that reside in
the same Kubernetes cluster, for a full cloud native experience.
However, it might happen that, while the database can be hosted inside a
Kubernetes cluster, applications cannot be containerized at the same
time and need to run in a *traditional environment* such as a VM.
Case 1: Applications inside Kubernetes
--------------------------------------
In a typical situation, the application and the database run in the same
namespace inside a Kubernetes cluster.
.. figure:: /images/apps-in-k8s.png
:width: 30%
:alt: Application and Database inside Kubernetes
Application and Database inside Kubernetes
The application, normally stateless, is managed as a standard
``Deployment`` , with multiple replicas spread over different Kubernetes
node, and internally exposed through a ``ClusterIP`` service.
The service is exposed externally to the end user through an ``Ingress``
and the provider’s load balancer facility, via HTTPS.
The application uses the backend PostgreSQL database to keep track of
the state in a reliable and persistent way. The application refers to
the read-write service exposed by the ``Cluster`` resource defined by
CloudNativePG, which points to the current primary instance, through a
TLS connection. The ``Cluster`` resource embeds the logic of single
primary and multiple standby architecture, hiding the complexity of
managing a high availability cluster in Postgres.
.. figure:: /images/architecture-in-k8s.png
:width: 40%
:alt: Close-up view of application and database inside Kubernetes
Close-up view of application and database inside Kubernetes
Case 2: Applications outside Kubernetes
---------------------------------------
Another possible use case is to manage your PostgreSQL database inside
Kubernetes, while having your applications outside of it (for example in
a virtualized environment). In this case, PostgreSQL is represented by
an IP address (or host name) and a TCP port, corresponding to the
defined Ingress resource in Kubernetes (normally a ``LoadBalancer``
service type as explained in the :ref:`Service management ` page).
The application can still benefit from a TLS connection to PostgreSQL.
.. figure:: /images/apps-outside-k8s.png
:width: 50%
:alt: Application outside Kubernetes
Application outside Kubernetes