Implementa una aplicación en contenedores con almacenamiento persistente de NetApp
Implementa una aplicación en contenedores en tu clúster del servicio Kubernetes de vSphere utilizando almacenamiento persistente NetApp ONTAP. Los siguientes ejemplos muestran cómo implementar una base de datos PostgreSQL utilizando almacenamiento NAS (ontap-nas) o SAN iSCSI (ontap-san).
La siguiente configuración YAML establece POSTGRES_USER y POSTGRES_PASSWORD directamente en el manifiesto. En entorno de producción, se recomienda utilizar los Secrets de Kubernetes para gestionar información confidencial, como las credenciales de la base de datos.
Puedes implementar una aplicación en contenedor de PostgreSQL respaldada por un volumen persistente NFS aprovisionado por el controlador ontap-nas. El siguiente ejemplo muestra cómo crear un PersistentVolumeClaim (PVC) y una Deployment para PostgreSQL.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
storageClassName: sc-nas # Specify the StorageClass for dynamic provisioning
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
securityContext:
fsGroup: 999 # Ensures proper permissions for the mounted volume (PostgreSQL default user is 999)
containers:
- name: postgres
image: postgres:15
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 999 # PostgreSQL default user ID
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault
env:
- name: POSTGRES_DB
value: "postgres"
- name: POSTGRES_USER
value: "<username>"
- name: POSTGRES_PASSWORD
value: "<password>"
- name: PGDATA
value: "/var/lib/postgresql/data/pgdata"
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-storage
subPath: postgres-data # Ensures data is stored in a subdirectory to avoid permission issues
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
selector:
app: postgres
Utiliza el siguiente YAML para implementar una aplicación en contenedor de PostgreSQL respaldada por un volumen persistente iSCSI aprovisionado por el controlador ontap-san. La Recreate estrategia de implementación garantiza que el pod se termine por completo antes de que se inicie uno nuevo, lo cual es necesario para los volúmenes iSCSI ReadWriteOnce y evita la corrupción de datos durante los reinicios de los pods. Esta configuración admite la persistencia de datos tras la eliminación y recreación de pods, y es compatible con las instantáneas de volumen de Trident y con las operaciones de backup y restauración.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-block-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: sc-iscsi # Must map to an ontap-san driver
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-block-app
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
# 1. POD LEVEL SECURITY CONTEXT
securityContext:
runAsNonRoot: true
runAsUser: 999 # Official Postgres image default user ID
runAsGroup: 999 # Official Postgres image default group ID
fsGroup: 999
seccompProfile:
type: RuntimeDefault
containers:
- name: postgres
image: postgres:15
# 2. CONTAINER LEVEL SECURITY CONTEXT
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
env:
- name: POSTGRES_DB
value: "postgres"
- name: POSTGRES_USER
value: "<username>"
- name: POSTGRES_PASSWORD
value: "<password>"
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
ports:
- containerPort: 5432
name: postgres
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-block-storage
subPath: postgres-data
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
volumes:
- name: postgres-block-storage
persistentVolumeClaim:
claimName: postgres-block-pvc
---
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
selector:
app: postgres
Valida la implementación de la base de datos
Tras implementar la aplicación, comprueba que los pods se encuentren en estado de ejecución y que la base de datos esté operativa. Utiliza los siguientes comandos para comprobar el estado de los pods, los PVC y los servicios. Asegúrate de que los pods estén en ejecución y de que los PVC estén vinculados a los volúmenes correspondientes.
kubectl get all -n <namespace>
kubectl get pvc -n <namespace>
Dependiendo del protocolo utilizado, el almacenamiento backend es un volumen, qtree o LUN. Puedes verificar el almacenamiento aprovisionado en el sistema ONTAP describiendo el PersistentVolume (PV) para obtener el nombre interno del volumen y luego usarlo en los comandos de la CLI de ONTAP para obtener los detalles del almacenamiento. Usa el siguiente comando para describir el PV y obtener el nombre interno del volumen:
kubectl describe pv/<pv-name>
Copia el nombre del volumen interno de la salida y ejecuta el siguiente comando para obtener los detalles de almacenamiento desde la CLI de ONTAP.
Para volúmenes NAS:
volume show -vserver <vserver> -volume <internal-volume-name>
En el caso de los LUN de SAN, ejecuta el siguiente comando para obtener los detalles del LUN desde la CLI de ONTAP:
lun show -vserver <vserver> -volume <internal-volume-name>
Si has utilizado las opciones de montaje nconnect en la clase de almacenamiento NAS o NAS Economy, puedes comprobar el número de conexiones TCP activas desde el nodo de trabajo al servidor de almacenamiento.
En primer lugar, enumera las configuraciones del backend de Trident para encontrar el nombre del backend, luego descríbelo para obtener el nombre del vserver y el LIF de datos:
kubectl get tbc -n trident
kubectl describe tbc <backend-name> -n trident
A continuación, inicia sesión en el clúster ONTAP y ejecuta el siguiente comando, sustituyendo el LIF de datos que aparece en la salida anterior:
network connections active show -local-address <data-lif> -local-port 2049
Después de que los pods estén en estado de ejecución, conéctate a la base de datos y verifica las operaciones de datos.
-
Reenvía el puerto del servicio PostgreSQL a tu ordenador local:
kubectl port-forward svc/postgres-service 5432:5432 -n <namespace> -
Desde otro terminal, conéctate a la base de datos mediante psql:
psql "postgresql://<username>:<password>@127.0.0.1:5432/postgres" -
Crea una base de datos y una tabla, luego llena la tabla con datos:
CREATE DATABASE employee;Cambia a la nueva base de datos (metacomando de psql):
\c employeeCrea la tabla, inserta una fila y consulta los resultados:
CREATE TABLE employees ( id SERIAL PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, department VARCHAR(50), hire_date DATE DEFAULT CURRENT_DATE, salary NUMERIC(10, 2) ); INSERT INTO employees (first_name, last_name, email, department, salary) VALUES ('John', 'Doe', 'john.doe@example.com', 'Engineering', 85000.00); SELECT * FROM employees;
Demostración en vídeo
El siguiente vídeo muestra cómo instalar Trident en un clúster de Kubernetes de vSphere y cómo implementar una base de datos PostgreSQL con almacenamiento persistente usando Trident.