Migrazione dei dati da Zalando a CloudNativePG su cluster Linux x86_64 e Linux on IBM Z and LinuxONE

È possibile trasferire i dati da Zalando a CloudNativePG utilizzando la modalità pg_basebackup bootstrap all'interno di un cluster che opera in modalità replica. Per trasferire i dati, è necessario creare il cluster di replica di CloudNativePG (destinazione) che replica l'archivio dati di Zalando (origine).

Prerequisiti

Per eseguire il bootstrap da un cluster attivo, completare la seguente procedura:

  • Assicurarsi che la destinazione e l'origine abbiano la stessa versione principale di PostgreSQL .
  • Configurare streaming_replica l'utente con i ruoli di replica e di accesso nel database PostgreSQL di Zalando.

Modifica dell'archivio dati Zalando Postgres per la migrazione dei dati

Per modificare l'archivio dati Zalando Postgres ai fini della migrazione dei dati, procedere come segue:

  1. Connettiti al pod Zalando :

    1. Visualizza i dettagli del pod primario:

      kubectl get pods -o jsonpath={.items..metadata.name} -l application=spilo,spilo-role=master -n instana-postgres
       
    2. Eseguire i comandi direttamente nel pod:

      kubectl exec -it <primary_pod_name> -n instana-postgres
       
    3. Connettersi al database Postgres:

      psql -U postgres
       
    4. Elencare i ruoli e creare un streaming_replica utente con i ruoli di replica e di accesso nel database Zalando :

      \du
      CREATE ROLE streaming_replica WITH REPLICATION;
      ALTER ROLE streaming_replica WITH LOGIN PASSWORD '<password_retrived_from_zalando>';
       
    5. Uscire dal terminale interattivo di PostgreSQL:

      \q
       
  2. Creare due file vuoti denominati custom.conf e override.conf nella directory pgdata su tutti i pod, che si trovano accanto al file postgresql.conf .

    1. Elencare i baccelli:

      kubectl get pods -n instana-postgres
       
    2. Eseguire comandi direttamente sul pod. Eseguire il seguente comando su tutti i pod:

      kubectl exec -it <pod_name> -n instana-postgres
       
      cd /var/lib/postgresql/data/pgdata
      touch -f custom.conf
      touch -f override.conf
       
  3. Uscire dal terminale della capsula:

    exit
     

Creazione di un archivio dati Postgres utilizzando l'operatore CloudNativePG Postgres per la migrazione dei dati

Installazione online di Operator per l' Postgres

  1. Per distribuire l'Operatore CloudNativePG Postgres online, completare i seguenti passaggi:

    1. Creare lo spazio dei nomi instana-postgres-01 :

      kubectl create namespace instana-postgres-01
       
    2. Determinare l'ID del gruppo di file system su Red Hat OpenShift.

      Red Hat OpenShift richiede che i gruppi di file system siano compresi in un intervallo di valori specifici per il namespace. Sul cluster in cui è distribuito l'Operatore CloudNativePG Kubernetes, eseguire il seguente comando:

      kubectl get namespace instana-postgres-01 -o yaml
       

      Per il comando viene visualizzato un output simile al seguente:

      apiVersion: v1
      kind: Namespace
      metadata:
        annotations:
          .......
          openshift.io/sa.scc.uid-range: 1000750000/10000
        creationTimestamp: "2024-01-14T07:04:59Z"
        labels:
          kubernetes.io/metadata.name: instana-postgres-01
          .......
        name: instana-postgres-01
       

      L'annotazione openshift.io/sa.scc.supplemental-groups contiene l'intervallo di ID consentiti. L'intervallo 1000750000/10000 indica 10.000 valori che iniziano con ID 1000750000, quindi specifica l'intervallo di ID da 1000750000 a 1000760000. In questo esempio, il valore 1000750000 potrebbe essere utilizzato come ID gruppo del file system.

    3. Installare l'Operatore CloudNativePG Postgres eseguendo i seguenti comandi Helm:

      helm repo add instana https://artifact-public.instana.io/artifactory/rel-helm-customer-virtual --username=_ --password=<AGENT_KEY>
       
      helm repo update
       
      helm install cnpg instana/cloudnative-pg --set image.repository=artifact-public.instana.io/self-hosted-images/3rd-party/operator/cloudnative-pg --set image.tag=v1.29.1_v0.34.0 --version=0.28.2 --set imagePullSecrets[0].name=instana-registry --set containerSecurityContext.runAsUser=<UID from namespace> --set containerSecurityContext.runAsGroup=<UID from namespace> -n instana-postgres-01
       
  2. Crea i segreti di pull dell'immagine per lo spazio dei nomi instana-postgres-01 :

    kubectl create secret docker-registry instana-registry -n instana-postgres-01 \
    --docker-username=_ \
    --docker-password=<AGENT_KEY> \
    --docker-server=artifact-public.instana.io
     
    Nota: prima di creare il segreto, aggiornare il valore < AGENT_KEY> con la chiave dell'agent.
  3. Creare un file, come postgres-secret.yaml, per l'accesso al cluster esterno:

    kind: Secret
    apiVersion: v1
    metadata:
      name: instanaadmin
    type: Opaque
    stringData:
      username: instanaadmin
      password: <user_generated_password_from_zalando>
     
  4. Applicare il file 'postgres-secret.yaml:

    kubectl apply -f postgres-secret.yaml -n instana-postgres-01
     
  5. Creare una risorsa CloudNativePG Cluster in modalità replica:

    1. Creare un file, come ad esempio cnpg-postgres.yaml, come segue:

      apiVersion: postgresql.cnpg.io/v1
      kind: Cluster
      metadata:
        name: postgres
      spec:
        instances: 3
        imageName: artifact-public.instana.io/self-hosted-images/3rd-party/cnpg-containers:15_v0.39.0
        imagePullPolicy: IfNotPresent
        imagePullSecrets:
          - name: instana-registry
        enableSuperuserAccess: true
        replicationSlots:
          highAvailability:
            enabled: true
        managed:
          roles:
          - name: instanaadmin
            login: true
            superuser: true
            createdb: true
            createrole: true
            replication: true
            passwordSecret:
              name: instanaadmin
        postgresql:
          pg_hba:
            - local     all          all                            trust
            - host      replication  postgres          all          trust
            - host      replication  streaming_replica 0.0.0.0/0    trust
            - host      all          all               0.0.0.0/0    trust
            - local     replication  standby                        trust
            - hostssl   replication  standby      all               md5
            - hostnossl all          all          all               reject
            - hostssl   all          all          all               md5
        bootstrap:
          pg_basebackup:
            source: zalando-postgres
        replica:
          enabled: true
          source: zalando-postgres
      
        externalClusters:
        - name: zalando-postgres
          connectionParameters:
            host: postgres.instana-postgres.svc
            user: postgres
          password:
            name: instanaadmin
            key: password
      
        superuserSecret:
          name: instanaadmin
      
        storage:
          size: 20Gi
          storageClass: nfs-client
       
    2. Applicare il file cnpg-postgres.yaml immettendo il seguente comando:

      kubectl apply -f cnpg-postgres.yaml -n instana-postgres-01
       
  6. SSH nel contenitore di debug del primo pod CloudNativePG per modificare postgresql.conf.

    Dopo l'inizializzazione del raggruppamento in modalità replica, lo stato del pod iniziale (postgres-1-pgbasebackup) sarà Completed. I tentativi successivi di avviare il primo CloudNativePG Pod (postgres-1) falliranno. Questo è un comportamento previsto.

    Per garantire una corretta inizializzazione di Cluster e un successivo avvio del pod, completare la seguente procedura:

    1. Immetti i seguenti comandi per individuare il Pod iniziale, SSH in esso e vai alla directory che contiene il volume pgdata :

      kubectl debug pod/postgres-1 --as-root -n instana-postgres-01
       
      cd /var/lib/postgresql/data/pgdata/
       
    2. Modificare i percorsi pg_hba e pg_ident all'interno del file postgresql.conf in ciascun pod:

      • Modificare il pg_hba percorso da /var/lib/postgresql/15/main/pg_hba.conf al seguente:

        /var/lib/postgresql/data/pgdata/pg_hba.conf
         
      • Modificare il pg_ident percorso da /var/lib/postgresql/15/main/pg_ident.conf al seguente:

        /var/lib/postgresql/data/pgdata/pg_ident.conf
         
    3. Aggiungere include 'custom.conf' e include 'override.conf' alla fine del file:

      echo "include 'custom.conf'" >> postgresql.conf
      echo "include 'override.conf'" >> postgresql.conf
       
  7. Riavviare il pod. Dopo l'avvio del baccello, tutti i baccelli si replicano a partire dal primo.

  8. Utilizzare il nuovo cnpg-cluster.

    1. Disabilita il cluster di replica:

      1. Modificare il file cnpg-postgres.yaml :

        ........
        replica:
        enabled: false
        source: zalando-postgres
        ..........
         
      2. Riapplicare il file cnpg-postgres.yaml :

        kubectl apply -f cnpg-postgres.yaml -n instana-postgres-01
         
    2. Connettersi al database:

      psql -U postgres
       
    3. Aggiornare la versione di ordinamento:

      ALTER DATABASE template1 REFRESH COLLATION VERSION;
       
  9. Aggiornare la configurazione della specifica core:

    1. Nel file ` Instana ` di Core, aggiorna la postgresConfig configurazione come illustrato nell'esempio seguente:

      .....................
      postgresConfigs:
        - authEnabled: true
           hosts:
             - postgres-rw.instana-postgres-01
      .....................
       
    2. Riapplicare il file core.yaml :

      kubectl apply -f core.yaml -n instana-core