Cloud Native PostgreSQLの設定について

はじめに

説明

Cloud Native PostgreSQLとはEDB社の提供しているPostgreSQLのKubernates Operatorになります。
Kubernates Operatorを初耳の方も多いと思いますが、一言で申しますとクラスタ管理・構築ツールになります。

今回は設定について解説してきます。また、スーパーユーザの接続は前回の記事に変更しております。

構築所要時間

15分程度を想定しております。

詳細情報の確認

PostgreSQLの構築情報は下記コマンドで確認できます。

  • データベース(設定ファイル)の格納場所
  • パスワードの格納場所
  • 初期DB
  • 初期ユーザ
$ kubectl describe pods cluster-example-1  

Name:         cluster-example-1
Namespace:    default
Priority:     0
Node:         minikube/192.168.64.6
Start Time:   Fri, 28 May 2021 13:34:31 +0900
Labels:       postgresql=cluster-example
              role=primary
Annotations:  k8s.enterprisedb.io/nodeSerial: 1
              k8s.enterprisedb.io/operatorVersion: 1.4.0
Status:       Running
IP:           172.17.0.7
IPs:
  IP:           172.17.0.7
Controlled By:  Cluster/cluster-example
Init Containers:
  bootstrap-controller:
    Container ID:  docker://322ed7252fb091a9d56cd48f163a7ce10d8ca587f58953954c749852f59b6cd5
    Image:         quay.io/enterprisedb/cloud-native-postgresql:1.4.0
    Image ID:      docker-pullable://quay.io/enterprisedb/cloud-native-postgresql@sha256:5ca024b334f8a63f5a1e97503764681f158378d4b1cf338747c3bd8ed45274cb
    Port:          <none>
    Host Port:     <none>
    Command:
      /manager
      bootstrap
      /controller/manager
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sun, 30 May 2021 14:26:44 +0900
      Finished:     Sun, 30 May 2021 14:26:46 +0900
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /controller from scratch-data (rw)
      /etc/app-secret from app-secret (rw)
      /etc/superuser-secret from superuser-secret (rw)
      /run from scratch-data (rw)
      /var/lib/postgresql/data from pgdata (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from cluster-example-token-4rpd7 (ro)
Containers:
  postgres:
    Container ID:  docker://a4389055ac9115b13c3fe4bbd40edae5e46a6b1e5d836e0918d33e5b74b0029d
    Image:         quay.io/enterprisedb/postgresql:13.2
    Image ID:      docker-pullable://quay.io/enterprisedb/postgresql@sha256:5aa9a5dd0a69f9511963ed4985e1a54db16192d8061fcf713ec10b440b2d73c5
    Ports:         5432/TCP, 9187/TCP
    Host Ports:    0/TCP, 0/TCP
    Command:
      /controller/manager
      instance
      run
      --pw-file
      /etc/superuser-secret/password
    State:          Running
      Started:      Sun, 30 May 2021 14:26:48 +0900
    Last State:     Terminated
      Reason:       Error
      Exit Code:    255
      Started:      Fri, 28 May 2021 13:34:33 +0900
      Finished:     Sun, 30 May 2021 14:26:18 +0900
    Ready:          True
    Restart Count:  1
    Liveness:       http-get http://:8000/healthz delay=30s timeout=5s period=10s #success=1 #failure=3
    Readiness:      http-get http://:8000/readyz delay=0s timeout=5s period=10s #success=1 #failure=3
    Environment:
      PGDATA:        /var/lib/postgresql/data/pgdata
      POD_NAME:      cluster-example-1
      NAMESPACE:     default
      CLUSTER_NAME:  cluster-example
      PGPORT:        5432
      PGHOST:        /controller/run
    Mounts:
      /controller from scratch-data (rw)
      /etc/app-secret from app-secret (rw)
      /etc/superuser-secret from superuser-secret (rw)
      /run from scratch-data (rw)
      /var/lib/postgresql/data from pgdata (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from cluster-example-token-4rpd7 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  pgdata:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  cluster-example-1
    ReadOnly:   false
  superuser-secret:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  cluster-example-superuser
    Optional:    false
  scratch-data:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  <unset>
  app-secret:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  cluster-example-app
    Optional:    false
  cluster-example-token-4rpd7:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  cluster-example-token-4rpd7
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason          Age   From     Message
  ----    ------          ----  ----     -------
  Normal  SandboxChanged  25m   kubelet  Pod sandbox changed, it will be killed and re-created.
  Normal  Pulled          25m   kubelet  Container image "quay.io/enterprisedb/cloud-native-postgresql:1.4.0" already present on machine
  Normal  Created         25m   kubelet  Created container bootstrap-controller
  Normal  Started         25m   kubelet  Started container bootstrap-controller
  Normal  Pulled          25m   kubelet  Container image "quay.io/enterprisedb/postgresql:13.2" already present on machine
  Normal  Created         25m   kubelet  Created container postgres
  Normal  Started         25m   kubelet  Started container postgres

ドキュメントでは記載箇所がわかりにくいですがsecretの設定は下記ルールがございます。

  • [cluster name]-superuser
  • [cluster name]-app

詳細設定の確認

デフォルトの設定ファイルがどうなっているかは下記サイトに記載がございます。

postgresql.confやhba.confの編集は下記を参考に設定下さい。

設定反映は前回の続きであれば下記コマンドで行います。コンテナやDBの変更の場合、先に`minikube delete pod cluster`が必要になるでしょう。

$ kubectl apply -f cluster-example.yaml

実際にPodにログインして確認してみましょう。

$ kubectl exec -it cluster-example-1 -- /bin/bash

postgresql.confは下記で確認できます。また、custom.confという追加設定が格納されているファイルがあります。さらに、postgresq.auto.confというOperatorが管理するファイルも別途存在します。

$ grep -v -e '^\s*#' -e '^\s*$' /var/lib/postgresql/data/pgdata/postgresql.conf
$ grep -v -e '^\s*#' -e '^\s*$' /var/lib/postgresql/data/pgdata/custom.conf
$ grep -v -e '^\s*#' -e '^\s*$' /var/lib/postgresql/data/pgdata/postgresql.auto.conf

pg_hba.confは下記となっております。

$ grep -v -e '^\s*#' -e '^\s*$' /var/lib/postgresql/data/pgdata/pg_hba.conf 

あとがき

今回は接続に知りたい情報を中心に記載致しました。次回の内容はライセンス認証を予定してます。

ここまでお読みいただき、ありがとうございました!