Erstellen eines „ Postgres “-Datenspeichers auf Linux on IBM Z and LinuxONE

Installieren Sie den Operator Postgres und richten Sie den Datenspeicher ein.

Vorbereitende Schritte

Stellen Sie sicher, dass Sie Ihren Online-und Offline-Host vorbereitet haben, um Images aus dem externen Repository zu extrahieren. Stellen Sie außerdem sicher, dass das richtige Helm -Repository hinzugefügt wurde.

Weitere Informationen finden Sie unter „Vorbereitung der Installation des Datenspeichers “.

Postgres Betreiber-Versionen und Image-Tags für die Bereitstellung

Die folgenden Images sind für die fixierten Helm -Diagramm-oder Operatorversionen erforderlich.

Tabelle 1. Operatordarstellungen und Bild-Tags
Plattform Operatorversionen Version des Helm-Diagramms Image mit Tag
Linux® on IBM Z® and LinuxONE 1.29.1 0.28.2

artifact-public.instana.io/self-hosted-images/3rd-party/operator/cloudnative-pg: v1.29.1_v0.34.0

artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cnpg-containers: 15_v0.39.0

Postgres online installieren mithilfe des Befehls „ CloudNativePG “

Führen Sie die folgenden Schritte aus, um den „ Postgres “-Operator in einer Online-Umgebung zu installieren.

  1. Erstellen Sie den Namensbereich instana-postgres .

    kubectl create namespace instana-postgres
     
  2. Erstellen Sie geheime Schlüssel für Image-Pull-Operationen für den Namensbereich instana-postgres .

    kubectl create secret docker-registry instana-registry --namespace instana-postgres \
      --docker-username=_ \
      --docker-password=<download_key> \
      --docker-server=artifact-public.instana.io
     
  3. Wenn Sie „ Postgres “ auf einem „ Red Hat® OpenShift® “-Cluster installieren, ermitteln Sie die Dateisystem-Gruppen-ID anhand des instana-postgres Namespace. Red Hat OpenShift erfordert, dass sich Dateisystemgruppen innerhalb eines für den Namensraum spezifischen Wertebereichs befinden.

    kubectl get namespace instana-postgres -o yaml
     

    Für den Befehl wird eine Ausgabe angezeigt, die dem folgenden Beispiel ähnelt:

    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
      .......
      name: instana-postgres
     

    Die openshift.io/sa.scc.supplemental-groups Anmerkung enthält den Bereich der zulässigen IDs. Der Bereich 1000750000/10000 umfasst 10.000 Werte, beginnend mit der ID 1000750000, d. h. er gibt den Bereich der IDs von 1000750000 bis 1000760000an. In diesem Beispiel könnte der 1000750000 Wert als Dateisystem-Gruppen-ID (UID) verwendet werden.

  4. Erstellen Sie die Toleranz und custom_values.yaml die Affinität und legen Sie diese fest. Überspringe diesen Schritt, wenn die Datei bereits erstellt wurde.

    tolerations:
    - key: node.instana.io/monitor
      operator: Equal
      effect: NoSchedule
      value: "true"
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: node-role.kubernetes.io/monitor
                  operator: In
                  values:
                  - "true"
     
  5. Installieren Sie Postgres Operator. Verwenden Sie die UID aus dem vorherigen Schritt als im <UID from namespace> folgenden Befehl:

    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 -f custom_values.yaml
     
  6. Erstellen Sie ein Passwort unter base64. Notieren Sie sich das Passwort. Das musst du später in der config.yaml Datei speichern.

    openssl rand -base64 24 | tr -cd 'a-zA-Z0-9' | head -c32; echo
     
  7. Erstellen Sie eine Ressource vom Typ Secret unter Verwendung des Passworts, das Sie im vorherigen Befehl erhalten haben.

    kind: Secret
    apiVersion: v1
    metadata:
      name: instanaadmin
    type: Opaque
    stringData:
      username: instanaadmin
      password: <user-generate-password>
     
  8. Erstellen Sie den geheimen Schlüssel „ Postgres “.

    kubectl apply -f postgres-secret.yaml -n instana-postgres
     
  9. Erstellen Sie eine Datei namens „ YAML “, beispielsweise mit der Clusterkonfiguration postgres.yaml „ Postgres “.

    apiVersion: postgresql.cnpg.io/v1
    kind: Cluster
    metadata:
      name: postgres
    spec:
      instances: 3
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: node-role.kubernetes.io/monitor
                    operator: In
                    values:
                      - "true"
        tolerations:
          - key: node.instana.io/monitor
            operator: Equal
            value: "true"
            effect: NoSchedule
      imageName: artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cnpg-containers:15_v0.39.0
      imagePullPolicy: IfNotPresent
      imagePullSecrets:
        - name: instana-registry
      postgresql:
        parameters:
          shared_buffers: 32MB
          pg_stat_statements.track: all
          auto_explain.log_min_duration: '10s'
        pg_hba:
          - local     all          all                            trust
          - host      all          all          0.0.0.0/0         md5
          - local     replication  standby                        trust
          - hostssl   replication  standby      all               md5
          - hostnossl all          all          all               reject
          - hostssl   all          all          all               md5
      managed:
        roles:
        - name: instanaadmin
          login: true
          superuser: true
          createdb: true
          createrole: true
          passwordSecret:
            name: instanaadmin
      bootstrap:
        initdb:
          database: instanaadmin
          owner: instanaadmin
          secret:
            name: instanaadmin
      superuserSecret:
        name: instanaadmin
      storage:
        size: 1Gi
      #    storageClass: "Optional"
     
  10. Stellen Sie den Cluster „ Postgres “ bereit.

    kubectl apply -f postgres.yaml -n instana-postgres
     
  11. Führen Sie die Schritte unter Postgres (online und offline)aus.

Offline-Installation von „ Postgres “ mithilfe des PG-Operators „ CloudNative “

Installieren Sie Postgres Operator in einer Offlineumgebung.

Wenn Sie die Postgres -Images noch nicht aus der externen Registry extrahiert haben, als Sie für die Installation vorbereitethaben, können Sie sie jetzt extrahieren. Führen Sie die folgenden Befehle auf Ihrem Bastionshost aus: Kopieren Sie die Bilder anschließend auf Ihren „ Instana “-Host, der sich in Ihrer isolierten Umgebung befindet.

docker pull artifact-public.instana.io/self-hosted-images/3rd-party/operator/cloudnative-pg:v1.29.1_v0.34.0
docker pull artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cnpg-containers:15_v0.39.0
         

Führen Sie die folgenden Schritte auf Ihrem „ Instana “-Host aus.

  1. Versehen Sie die Images erneut mit Ihrer internen Image-Registry.

    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/operator/cloudnative-pg:v1.29.1_v0.34.0 <internal-image-registry>/operator/cloudnative-pg:v1.29.1_v0.34.0
    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cnpg-containers:15_v0.39.0 <internal-image-registry>/datastore/cnpg-containers:15_v0.39.0
                   
  2. Übertragen Sie die Images mit Push-Operation in Ihre interne Image-Registry auf Ihrem Bastionshost.

    docker push <internal-image-registry>/operator/cloudnative-pg:v1.29.1_v0.34.0
    docker push <internal-image-registry>/datastore/cnpg-containers:15_v0.39.0
                   
  3. Erstellen Sie den Namensbereich instana-postgres .

    kubectl create namespace instana-postgres
     
  4. Optional: Erstellen Sie ein Bildabrufgeheimnis, wenn Ihre interne Bildregistrierung eine Authentifizierung erfordert.

    kubectl create secret docker-registry <secret_name> --namespace instana-postgres \
    --docker-username=<registry_username> \
    --docker-password=<registry_password> \
    --docker-server=<internal-image-registry>:<internal-image-registry-port>
    --docker-email=<registry_email>
     
  5. Wenn Sie „ Postgres “ auf einem „ Red Hat® OpenShift® “-Cluster installieren, ermitteln Sie die Dateisystem-Gruppen-ID anhand des instana-postgres Namespace. Red Hat OpenShift erfordert, dass sich Dateisystemgruppen innerhalb eines für den Namensraum spezifischen Wertebereichs befinden.

    kubectl get namespace instana-postgres -o yaml
     

    Für den Befehl wird eine Ausgabe angezeigt, die dem folgenden Beispiel ähnelt:

    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
      .......
      name: instana-postgres
     

    Die openshift.io/sa.scc.supplemental-groups Anmerkung enthält den Bereich der zulässigen IDs. Der Bereich 1000750000/10000 umfasst 10.000 Werte, beginnend mit der ID 1000750000, d. h. er gibt den Bereich der IDs von 1000750000 bis 1000760000an. In diesem Beispiel könnte der 1000750000 Wert als Dateisystem-Gruppen-ID (UID) verwendet werden.

  6. Erstellen Sie die Toleranz und custom_values.yaml die Affinität und legen Sie diese fest. Überspringe diesen Schritt, wenn die Datei bereits erstellt wurde.

    tolerations:
    - key: node.instana.io/monitor
      operator: Equal
      effect: NoSchedule
      value: "true"
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: node-role.kubernetes.io/monitor
                  operator: In
                  values:
                  - "true"
     
  7. Installieren Sie Postgres Operator. Ersetzen Sie im folgenden Befehl den Wert <download_key> durch Ihren eigenen Agentenschlüssel. Wenn Sie ein Image-Pull-Secret für Ihr internes Registry erstellt haben, fügen Sie --docker-server=<internal-image-registry>:<internal-image-registry-port> zum folgenden Befehl hinzu.

    • Red Hat OpenShift Cluster

      Verwenden Sie die UID aus dem vorherigen Schritt in <UID from namespace> den folgenden Befehlen:

      helm install cnpg cloudnative-pg-1.28.0.tgz --set image.repository=image-registry.openshift-image-registry.svc:5000/instana-postgres/cloudnative-pg-operator --set image.tag=v1.29.1_v0.34.0 --version=0.28.2 --set containerSecurityContext.runAsUser=<UID from namespace> --set containerSecurityContext.runAsGroup=<UID from namespace> -n instana-postgres -f custom_values.yaml
       
    • Kubernetes-Cluster

      helm install cnpg cloudnative-pg-operator --set image.repository=<internal-image-registry>/operator/cloudnative-pg --set image.tag=v1.29.1_v0.34.0 --version=0.28.2 -n instana-postgres
       
  8. Erstellen Sie ein Passwort unter base64. Notieren Sie sich das Passwort. Das musst du später in der config.yaml Datei speichern.

    openssl rand -base64 24 | tr -cd 'a-zA-Z0-9' | head -c32; echo
     
  9. Erstellen Sie eine Ressource vom Typ Secret unter Verwendung des Passworts, das Sie im vorherigen Befehl erhalten haben.

    kind: Secret
    apiVersion: v1
    metadata:
      name: instanaadmin
    type: Opaque
    stringData:
      username: instanaadmin
      password: <user-generate-password>
     
  10. Erstellen Sie den geheimen Schlüssel „ Postgres “.

    kubectl apply -f postgres-secret.yaml -n instana-postgres
     
  11. Erstellen Sie eine Datei namens „ YAML “, beispielsweise mit der Clusterkonfiguration postgres.yaml „ Postgres “.

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgres
spec:
  instances: 3
  imageName: <internal-image-registry>/datastore/cnpg-containers:15_v0.39.0
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: node-role.kubernetes.io/monitor
                operator: In
                values:
                  - "true"
    tolerations:
      - key: node.instana.io/monitor
        operator: Equal
        value: "true"
        effect: NoSchedule
  imagePullPolicy: IfNotPresent
 # Optional: if you created an image pull secret for your internal registry, uncomment the following lines and update the image pull secret information.
 # imagePullSecrets:
 #   - name: <internal-image-registry-pull-secret>
  postgresql:
    parameters:
      shared_buffers: 32MB
      pg_stat_statements.track: all
      auto_explain.log_min_duration: '10s'
    pg_hba:
      - local     all          all                            trust
      - host      all          all          0.0.0.0/0         md5
      - local     replication  standby                        trust
      - hostssl   replication  standby      all               md5
      - hostnossl all          all          all               reject
      - hostssl   all          all          all               md5
  managed:
    roles:
    - name: instanaadmin
      login: true
      superuser: true
      createdb: true
      createrole: true
      passwordSecret:
        name: instanaadmin
  bootstrap:
    initdb:
      database: instanaadmin
      owner: instanaadmin
      secret:
        name: instanaadmin
  superuserSecret:
    name: instanaadmin
  storage:
    size: 1Gi
  #    storageClass: "Optional"
 
  1. Stellen Sie den Cluster „ Postgres “ bereit.
    kubectl apply -f postgres.yaml -n instana-postgres
     
  2. Führen Sie die Schritte unter Postgres (online und offline)aus.

Bereitstellung und Überprüfung von „ Postgres “ (online und offline)

Führen Sie die folgenden Schritte aus, um die Postgres -Instanz zu implementieren und den Datenspeicher zu erstellen.

  1. Speichern Sie das zuvor generierte Passwort in der config.yaml Datei.

    datastoreConfigs:
      ...
      postgresConfigs:
        - user: instanaadmin
          password: <USER_GENERATED_PASSWORD>
          adminUser: instanaadmin
          adminPassword: <USER_GENERATED_PASSWORD>
      ...
     
  2. Erstellen Sie die Ressource postgresql .

    kubectl apply -f postgres.yaml --namespace=instana-postgres
     
  3. Überprüfen Sie die Postgres -Operatorbereitstellung.

    kubectl get all -n instana-postgres
     

    Wenn der Postgres -Operator erfolgreich implementiert wurde, lautet das Ergebnis des Befehls wie folgt:

    NAME                                      READY    STATUS    RESTARTS    AGE
    pod/postgres-1                             1/1     Running     0         100s
    pod/postgres-2                             1/1     Running     0         69s
    pod/postgres-3                             1/1     Running     0         41s
    pod/cnpg-cloudnative-pg-64bbc87958-fqnrl   1/1     Running     0         11m
    
    NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT
    service/cnpg-webhook-service   ClusterIP   172.30.66.183    <none>        443/TCP
    service/postgres-r             ClusterIP   172.30.163.146   <none>        5432/TCP
    service/postgres-ro            ClusterIP   172.30.226.75    <none>        5432/TCP
    service/postgres-rw            ClusterIP   172.30.235.178   <none>        5432/TCP
    
    NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/cnpg-cloudnative-p   1/1     1            1           11m
    
    NAME                                           DESIRED   CURRENT   READY   AGE
    replicaset.apps/cnpg-cloudnative-pg-64bbc87958   1         1         1       11m
     
  4. Stellen Sie sicher, dass die Pods auf den gewünschten Knoten eingeplant sind.

    kubectl get pods -n instana-postgres -o wide
     

    Das folgende Beispiel zeigt eine Beispielausgabe.

    NAME                                   READY   STATUS    RESTARTS   AGE   IP              NODE                                           NOMINATED NODE   READINESS GATES
    cnpg-cloudnative-pg-7cdf76c49c-kztxr   1/1     Running   0          22d   10.254.20.122   worker0.instana-load-testing.cp.fyre.ibm.com   <none>           <none>
    postgres-1                             1/1     Running   0          22d   10.254.20.124   worker0.instana-load-testing.cp.fyre.ibm.com   <none>           <none>
    postgres-3                             1/1     Running   0          22d   10.254.16.93    worker1.instana-load-testing.cp.fyre.ibm.com   <none>           <none>
    postgres-4                             1/1     Running   0          22d   10.254.24.65    worker3.instana-load-testing.cp.fyre.ibm.com   <none>           <none>
     

Daten von Zalando auf CloudNativePG migrieren

Im pg_basebackup Bootstrap-Modus können Sie einen neuen „ PostgreSQL “-Cluster (Ziel) erstellen, der den genauen physischen Zustand einer bestehenden „ PostgreSQL “-Instanz (Quelle) repliziert.

Sie können über eine gültige Streaming-Replikationsverbindung von einem aktiven Cluster aus starten und dabei die Quellinstanz von PostgreSQL entweder als primären oder als Standby-Server von PostgreSQL verwenden.

Informationen zur Migration von Daten aus einem Cluster unter Zalando PostgreSQL über den pg_basebackup Bootstrap-Modus in einen Replikationscluster unter CloudNativePG finden Sie unter „Migration von Daten von Zalando zu CloudNativePG “.