Linux に Postgres データストアを作成する。 x86_64

Postgres オペレーターをインストールし、データ・ストアをセットアップします。

準備

外部リポジトリーからイメージをプルするために、オンラインおよびオフラインのホストが準備されていることを確認します。 また、正しい Helm リポジトリーが追加されていることも確認してください。

詳しくは、 データ・ストアのインストールの準備を参照してください。

Postgres オペレーターのバージョンと配備用の画像タグ

ピン留めされた Helm チャートまたはオペレーターのバージョンには、以下のイメージが必要です。

表 1. Postgres オペレーターのバージョンと画像タグ
プラットフォーム オペレーターのバージョン Helm チャートのバージョン タグ付きのイメージ
Linux® x86_64 1.21.1 0.21.1

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

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

CloudNativePG オペレータを使用した Postgres のオンライン・インストール

Postgres データストアをオンライン環境にインストールするには、以下の手順を実行します。

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

    kubectl create namespace instana-postgres
    
  2. 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. Postgres を Red Hat® OpenShift® クラスタにインストールする場合は、 instana-postgres ネームスペースからファイルシステムグループIDを決定します。 Red Hat OpenShift ファイルシステムグループが、その名前空間に固有の値の範囲内に収まることを要求します。

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

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

  4. Postgres オペレーターを取り付ける。 次のコマンドでは、前のステップで取得したUIDを <UID from namespace> として使用します

    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.21.1_v0.13.0 --version=0.21.1 --set imagePullSecrets[0].name=instana-registry --set containerSecurityContext.runAsUser=<UID from namespace> --set containerSecurityContext.runAsGroup=<UID from namespace> -n instana-postgres
    
  5. base64 でパスワードを生成します。 パスワードをメモしてください。 このファイルは、後で config.yaml ファイルに保存する必要があります。

    openssl rand -base64 24 | tr -cd 'a-zA-Z0-9' | head -c32; echo
    
  6. 前のコマンドで取得したパスワードを使用して、 Secret タイプのリソースを作成します。

    kind: Secret
    apiVersion: v1
    metadata:
      name: instanaadmin
    type: Opaque
    stringData:
      username: instanaadmin
      password: <user-generate-password>
    
  7. Postgres の秘密鍵を作成します。

    kubectl apply -f postgres-secret.yaml -n instana-postgres
    
  8. Postgres クラスタ構成のYAMLファイルを作成します。例えば、 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/datastore/cnpg-containers:15_v0.17.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"
    
  9. Postgres クラスタをデプロイします。

    kubectl apply -f postgres.yaml -n instana-postgres
    
  10. Postgres (オンラインおよびオフライン) のデプロイおよび検証のステップを実行します。

Postgres をオフラインでインストールするには、 CloudNative を使用します。PGオペレーター

オフライン環境に Postgres Operator をインストールします。

インストールの準備時に外部レジストリーから Postgres イメージをまだプルしていない場合は、ここでプルできます。 要塞ホストで以下のコマンドを実行します。 次に、エアー・ギャップ環境内の Instana ホストにイメージをコピーします。

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

Instana ホストで以下の手順を実行します。

  1. イメージを内部イメージ・レジストリーに再タグ付けします。

    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/operator/cloudnative-pg:v1.21.1_v0.13.0 <internal-image-registry>/operator/cloudnative-pg:v1.21.1_v0.13.0
    docker tag artifact-public.instana.io/self-hosted-images/3rd-party/datastore/cnpg-containers:15_v0.17.0 <internal-image-registry>/datastore/cnpg-containers:15_v0.17.0
    
  2. イメージを要塞ホスト上の内部イメージ・レジストリーにプッシュします。

    docker push <internal-image-registry>/operator/cloudnative-pg:v1.21.1_v0.13.0
    docker push <internal-image-registry>/datastore/cnpg-containers:15_v0.17.0
    
  3. instana-postgres 名前空間を作成します。

    kubectl create namespace instana-postgres
    
  4. オプション:内部イメージ・レジストリの認証が必要な場合は、イメージ・プル・シークレットを作成します。

    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. Postgres を Red Hat® OpenShift® クラスタにインストールする場合は、 instana-postgres ネームスペースからファイルシステムグループIDを決定します。 Red Hat OpenShift ファイルシステムグループが、その名前空間に固有の値の範囲内に収まることを要求します。

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

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

  6. Postgres オペレーターを取り付ける。 次のコマンドで、<download_key>の値を自分のエージェントキーに更新します。 内部レジストリ用にイメージプルシークレットを作成した場合は、次のコマンドに --set image.imagePullSecrets[0].name="<internal-image-registry-pull-secret> を追加してください。

    • Red Hat OpenShift クラスター

      次のコマンドでは、前のステップで取得したUIDを <UID from namespace> として使用します

      helm install cnpg cloudnative-pg-0.21.1.tgz --set image.repository=image-registry.openshift-image-registry.svc:5000/instana-postgres/cloudnative-pg-operator --set image.tag=v1.21.1_v0.13.0 --version=0.21.1 --set containerSecurityContext.runAsUser=<UID from namespace> --set containerSecurityContext.runAsGroup=<UID from namespace> -n instana-postgres
      
    • Kubernetes クラスター

      helm install cnpg cloudnative-pg-0.21.1.tgz --set image.repository=<internal-image-registry>/operator/cloudnative-pg --set image.tag=v1.21.1_v0.13.0 --version=0.21.1 -n instana-postgres
      
  7. base64 でパスワードを生成します。 パスワードをメモしてください。 このファイルは、後で config.yaml ファイルに保存する必要があります。

    openssl rand -base64 24 | tr -cd 'a-zA-Z0-9' | head -c32; echo
    
  8. 前のコマンドで取得したパスワードを使用して、 Secret タイプのリソースを作成します。

    kind: Secret
    apiVersion: v1
    metadata:
      name: instanaadmin
    type: Opaque
    stringData:
      username: instanaadmin
      password: <user-generate-password>
    
  9. Postgres の秘密鍵を作成します。

    kubectl apply -f postgres-secret.yaml -n instana-postgres
    
  10. Postgres クラスタ構成のYAMLファイルを作成します。例えば、 postgres.yaml

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgres
spec:
  instances: 3
  imageName: <internal-image-registry>/datastore/cnpg-containers:15_v0.17.0
  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. Postgres クラスタをデプロイします。
kubectl apply -f postgres.yaml -n instana-postgres
  1. Postgres (オンラインおよびオフライン) のデプロイおよび検証のステップを実行します。

Postgresのデプロイと検証(オンラインとオフライン)

以下のステップを実行して、 Postgres インスタンスをデプロイし、データ・ストアを作成します。

  1. 先ほど生成したパスワードを config.yaml

    datastoreConfigs:
      ...
      postgresConfigs:
        - user: instanaadmin
          password: <USER_GENERATED_PASSWORD>
          adminUser: instanaadmin
          adminPassword: <USER_GENERATED_PASSWORD>
      ...
    
  2. postgresql リソースを作成します。

    kubectl apply -f postgres.yaml --namespace=instana-postgres
    
  3. Postgres オペレータの配置を確認する。

    kubectl get all -n instana-postgres
    

    Postgres Operatorが正常に展開された場合、コマンドの結果は以下のようになる:

    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
    

Zalandoからデータを移行する CloudNativePG

pg_basebackup ブートストラップモードを使用すると、既存の PostgreSQL インスタンス(ソース)の物理状態を正確に複製した新しい PostgreSQL クラスタ(ターゲット)を作成することができます。

有効なストリーミングレプリケーション接続を通じて、ライブクラスターからブートストラップすることができます。また、ソースの PostgreSQL インスタンスをプライマリまたはスタンバイの PostgreSQL サーバーとして使用することもできます。

Zalando PostgreSQL クラスタからデータを移行するには、 pg_basebackupブートストラップ モードから CloudNativePG レプリカ クラスターに移行する場合は、 「Zalando から CloudNativePG へのデータの移行」 を参照してください。