Linux on Power ( ppc64le ) クラスター上で、 Zalando から CloudNativePG へのデータ移行

レプリカモードで動作しているクラスタ内で pg_basebackup ブートストラップモードを使用することで、 Zalando から CloudNativePG へデータを転送できます。 データを転送するには、 Zalando データストア(ソース)をレプリケートする CloudNativePG レプリカクラスター(ターゲット)を作成する必要があります。

前提条件

ライブクラスターからブートストラップするには、次の手順を完了してください:

  • ターゲットとソースが同じメジャー PostgreSQL バージョンであることを確認してください。
  • ZalandoPostgreSQL データベースで、レプリケーションロールとログインロールを持つユーザー streaming_replica を設定します。

Zalando の Postgres データストアをデータ移行用に修正する

データ移行のために Zalando の Postgres データストアを変更するには、次の手順を完了してください:

  1. Zalando ポッドに接続します:

    1. プライマリポッドの詳細を表示する:

      kubectl get pods -o jsonpath={.items..metadata.name} -l application=spilo,spilo-role=master -n instana-postgres
      
    2. ポッド内で直接コマンドを実行する:

      kubectl exec -it <primary_pod_name> -n instana-postgres
      
    3. Postgres データベースに接続します:

      psql -U postgres
      
    4. Zalando データベースで、レプリケーションロールとログインロールを持つユーザー streaming_replica を作成し、その役割を列挙する:

      \du
      CREATE ROLE streaming_replica WITH REPLICATION;
      ALTER ROLE streaming_replica WITH LOGIN PASSWORD '<password_retrived_from_zalando>';
      
    5. PostgreSQL インタラクティブ端末を終了します:

      \q
      
  2. すべてのポッドの pgdata ディレクトリ内に、 ファイル postgresql.conf と同じ場所に override.conf 配置される および という custom.conf 名前の空のファイルを2つ作成します。

    1. ポッドをリストします。

      kubectl get pods -n instana-postgres
      
    2. ポッド上で直接コマンドを実行する。 すべてのポッドで次のコマンドを実行してください:

      kubectl exec -it <pod_name> -n instana-postgres
      
      cd /var/lib/postgresql/data/pgdata
      touch -f custom.conf
      touch -f override.conf
      
  3. ポッド端末からの退出:

    exit
    

データ移行のための CloudNativePGPostgres オペレータを使用した Postgres データストアの作成

Postgres オペレーターのオンラインインストール

  1. CloudNativePGPostgres オペレーターのオンライン展開には、以下の手順を完了してください:

    1. 名前 instana-postgres-01 空間を作成します:

      kubectl create namespace instana-postgres-01
      
    2. Red Hat OpenShift 上のファイルシステムグループIDを特定する。

      Red Hat OpenShift ファイルシステムグループは、名前空間固有の値の範囲内にある必要があります。 CloudNativePGKubernetes オペレータがデプロイされているクラスタで、次のコマンドを実行します:

      kubectl get namespace instana-postgres-01 -o yaml
      

      コマンドの実行結果は以下の例に類似した出力が表示されます:

      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
      

      注釈 openshift.io/sa.scc.supplemental-groups には許可されたIDの範囲が含まれています。 この範囲 1000750000/10000 はIDから始まる10,000 1000750000個の値を示しており、したがってIDの範囲をから 1000750000 まで指定します 1000760000。 この例では、値はファイルシステムのグループ 1000750000 IDとして使用される可能性があります。

    3. 以下の Helm コマンドを実行して、 CloudNativePGPostgres オペレータをインストールします:

      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. namespace 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
    
    注: シークレットを作成する前に、 <AGENT_KEY> の値を自身のエージェントキーで更新してください。
  3. 外部クラスタアクセス用に、 postgres-secret.yaml次のようなファイルを作成します:

    kind: Secret
    apiVersion: v1
    metadata:
      name: instanaadmin
    type: Opaque
    stringData:
      username: instanaadmin
      password: <user_generated_password_from_zalando>
    
  4. ファイルを postgres-secret.yaml 適用してください:

    kubectl apply -f postgres-secret.yaml -n instana-postgres-01
    
  5. CloudNativePGClusterreplica リソースをモードで作成します:

    1. 次のようにファイルを作成します(例 cnpg-postgres.yaml:)

      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. 次のコマンドを実行してファイルを cnpg-postgres.yaml 適用します:

      kubectl apply -f cnpg-postgres.yaml -n instana-postgres-01
      
  6. 最初の CloudNativePG ポッドのデバッグコンテナにSSH接続し、. postgresql.confを修正する。

    レプリカモードでのクラスター初期化後、初期Pod (postgres-1-pgbasebackup)のステータスは となります Completed。 最初の CloudNativePG ポッド(postgres-1)を起動する以降の試行は失敗します。 これは予期される動作です。

    ポッドの初期化 Cluster とその後の起動を確実に成功させるには、以下の手順を完了してください:

    1. 以下のコマンドを実行して、初期のPodを特定し、そのPodにSSH接続し、ボリューム pgdata を含むディレクトリに移動します:

      kubectl debug pod/postgres-1 --as-root -n instana-postgres-01
      
      cd /var/lib/postgresql/data/pgdata/
      
    2. 各ポッド内の ファイル postgresql.conf 内の および pg_ident pg_hba パスを変更します:

      • pg_hba スを次のパス /var/lib/postgresql/15/main/pg_hba.conf に変更してください:

        /var/lib/postgresql/data/pgdata/pg_hba.conf
        
      • pg_ident スを次のパス /var/lib/postgresql/15/main/pg_ident.conf に変更してください:

        /var/lib/postgresql/data/pgdata/pg_ident.conf
        
    3. ファイルの末尾に include 'override.conf'include 'custom.conf' を追加してください:

      echo "include 'custom.conf'" >> postgresql.conf
      echo "include 'override.conf'" >> postgresql.conf
      
  7. ポッドを再始動します。 ポッドが起動した後、すべてのポッドは最初のポッドから複製される。

  8. 新しい cnpg-cluster を使用してください。

    1. レプリカクラスタを無効化します:

      1. ファイルを cnpg-postgres.yaml 修正してください:

        ........
        replica:
        enabled: false
        source: zalando-postgres
        ..........
        
      2. ファイルを cnpg-postgres.yaml 再適用してください:

        kubectl apply -f cnpg-postgres.yaml -n instana-postgres-01
        
    2. 次のように、データベースに接続します。

      psql -U postgres
      
    3. 照合順序のバージョンを更新する:

      ALTER DATABASE template1 REFRESH COLLATION VERSION;
      
  9. コア仕様構成を更新する:

    1. Instana コアファイルで、以下の例に示すように設定 postgresConfig を更新してください:

      .....................
      postgresConfigs:
        - authEnabled: true
           hosts:
             - postgres-rw.instana-postgres-01
      .....................
      
    2. ファイルを core.yaml 再適用してください:

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