Skip to main content
NetApp container solutions
Se proporciona el idioma español mediante traducción automática para su comodidad. En caso de alguna inconsistencia, el inglés precede al español.

Implementa una aplicación en contenedores con almacenamiento persistente de NetApp

Colaboradores banum-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.

Implementa PostgreSQL con almacenamiento NAS (controlador ontap-nas)

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
Implementa PostgreSQL con almacenamiento SAN (controlador ontap-san iSCSI)

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>
Carga de trabajo implementada con almacenamiento persistente

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>
Nombre interno del volumen para volumen NAS
Figura 1. Mostrar ejemplo
Nombre interno del volumen para SAN LUN

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>
Salida de la CLI de ONTAP para un volumen NAS

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>
Salida de la CLI de ONTAP para un LUN de SAN

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
Salida de la CLI de ONTAP para las conexiones activas
Figura 2. Mostrar ejemplo

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.

Pasos
  1. Reenvía el puerto del servicio PostgreSQL a tu ordenador local:

    kubectl port-forward svc/postgres-service 5432:5432 -n <namespace>
  2. Desde otro terminal, conéctate a la base de datos mediante psql:

    psql "postgresql://<username>:<password>@127.0.0.1:5432/postgres"
  3. 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 employee

    Crea 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.

Poner en marcha cargas de trabajo en un clúster de vSphere Kubernetes Service respaldado por almacenamiento persistente ONTAP usando Trident