ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示
ラベル PostgreSQL の投稿を表示しています。 すべての投稿を表示

2021年6月14日月曜日

bitnami の PostgreSQL-ha helm chart で好きなユーザを追加する方法

bitnami の PostgreSQL-ha helm chart で好きなユーザを追加する方法

概要

初期化スクリプトを使って実現します また HA 構成の場合は pgpool 側にも認証情報の追加が必要なのもポイントです pgpool 側にもユーザを追加するための初期化スクリプトを流します

環境

  • kubernetes 1.20.5
  • helm 3.5.2
  • bitnami PostgreSQL ha helm chart 7.6.2

values.yaml

postgresql:
  password: xxxx
  repmgrPassword: xxxx
  initdbScripts:
      setup.sql: |
        CREATE USER user1 WITH PASSWORD 'xxxx';
        CREATE USER user2 WITH PASSWORD 'xxxx';
        CREATE DATABASE db1 WITH OWNER user1;
        CREATE DATABASE db2 WITH OWNER user2;

pgpool:
  adminPassword: xxxx
  initdbScripts:
      setup.sh: |
        #!/bin/bash
        USERS=("uesr1:xxxx" "user2:xxxx")
        for user in "${USERS[@]}"; do
            user_info=(${user//:/ })
            pg_md5 -m --config-file="/opt/bitnami/pgpool/conf/pgpool.conf" -u "${user_info[0]}" "${user_info[1]}"
        done

service:
  type: NodePort
  nodePort: 30432

少し解説

好きなユーザを追加したい場合は postgresql.username があるのですがこれは使わないようにしましょう 基本的には initdbScripts に SQL やシェルスクリプトを書いて追加します

まず posgresql 側には CREATE USER コマンドを発行してユーザを作成します このときパスワードも指定します

次に pgpool 側です こちらは pg_md5 コマンドを使って /opt/bitnami/pgpool/conf/pool_passwd に認証情報を追加する必要があります HA 構成の場合認証箇所が postgresql と pgpool の 2 箇所になるのでそれぞれに認証情報を登録する必要があります pgpool Pod が起動後に手動で追加しても OK です

あとは SQL などで好きなコマンドを発行して上げれば OK です postgresql.username を指定しないことでデフォルトの postgres ユーザを使ってコマンドを発行してくれるので権限の強いコマンドでも実行できるようになっています

参考サイト

2021年6月12日土曜日

k8s で PostgreSQL Operator を試してみた (Zalando編)

k8s で PostgreSQL Operator を試してみた (Zalando編)

概要

PostgreSQL Operator は Postgres を k8s 上で簡単に構築/運用するための CustomResource を使ったオーケストレーションツールです 今回は PostgreSQL Operator を使って Postgres の構築を行ってみました

環境

  • k8s v1.20.1
  • helm v3.5.2
  • PostgreSQL Operator 1.6.3

PostgreSQL Operator のデプロイ

helm を使うと簡単です kustomize やマニフェストからデプロイする方法もありますが今回は helm を使います

最新版が Artifacthub で公開されてはいないので Github から直接チャートを展開します 以下のように Operator が展開されれば OK です まだこの時点では PostgreSQL サーバ自体はありません

NAME                                READY   STATUS    RESTARTS   AGE
postgres-operator-88f7975df-tgf77   1/1     Running   0          85s

PostgreSQL Operator UI のデプロイ

Operator には管理用の UI があり PostgreSQL の構築や管理を UI から行うことができます

  • helm install postgres-operator-ui ./charts/postgres-operator-ui

Pod がデプロイできれば OK です

デフォルトだと外部からアクセスできないようになっているので Service を編集して NodePort に変更します

  • kubectl edit svc postgres-operator-ui
type: NodePort

Service の NodePort は適宜変更してください

http://node_ip:30595/#new

で Operator の管理 UI にアクセスできます

PostgreSQL サーバの構築

管理 UI から行ってみます 先程の URL にアクセスすると PostgreSQL を作成するためのフォームが表示されます

Name や Users など好きな情報を入力して作成しましょう なお後で紹介しますが Operator 経由の PostgreSQL の構築では好きなユーザは作成できますが好きなユーザに好きなパスワードを設定することはできません 基本的には Operator が自動で生成します

作成中になるとステータスもちゃんと表示されています 完了するまで待ちましょう

作成が完了すると以下のように PostgreSQL が作成されます

  • kubectl get all -l team=acid
NAME              READY   STATUS    RESTARTS   AGE
pod/acid-test-0   1/1     Running   0          12m

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/acid-test        ClusterIP   10.107.79.204   <none>        5432/TCP   12m
service/acid-test-repl   ClusterIP   10.107.39.37    <none>        5432/TCP   12m

NAME                         READY   AGE
statefulset.apps/acid-test   1/1     12m

NAME                                 TEAM   VERSION   PODS   VOLUME   CPU-REQUEST   MEMORY-REQUEST   AGE   STATUS
postgresql.acid.zalan.do/acid-test   acid   13        1      10Gi     100m          100Mi            12m   Running

構成を変更して NodePort からアクセスできるようにしてみる

デプロイした PostgreSQL の構成も管理 UI から変更できます

作成したクラスタの「Edit」を選択すると以下のような編集画面になります

外部からアクセスできるようにするためには「enableConnectionPooler」「enableMasterLoadBalancer」「enableReplicaLoadBalancer」を true にします

下にある「Apply」をクリックすれば PostgreSQL クラスタの再構築が行われます 完了すると以下のように外部からアクセスできるようになっています

  • kubectl get svc -l team=acid
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
acid-test        LoadBalancer   10.107.79.204   <pending>     5432:31815/TCP   18m
acid-test-repl   LoadBalancer   10.107.39.37    <pending>     5432:30569/TCP   18m

アクセスする

パスワードはシークレットから取得します あとは公開したノードの IP とポートを使って postgres ユーザでアクセスできるか確認してみましょう

基本的な使い方はこんな感じです 今回は UI でデプロイしましたがマニフェストも UI が自動生成してくれるのでマニフェストでデプロイしたい場合でも簡単です

おまけ: ユーザの好きなパスワードは設定できない

過去に紹介した bitnami の PostgreSQL helm chart を使うとユーザのパスワードを設定できます Operator でもできないかなと思い色々試したのですがダメでした 一応試した方法を紹介します (参考)

やった方法としては

  • secret を事前に登録
  • マニフェストでユーザのロールを指定

です

  • vim secret.yaml
apiVersion: v1
data:
  password: YXNkZmdoamtsCg==
  username: cHJhZWZlY3Q=
kind: Secret
metadata:
  labels:
    application: spilo
    cluster-name: acid-gitlab
    team: acid
  name: praefect.acid-gitlab.credentials.postgresql.acid.zalan.do
  namespace: default
type: Opaque

kubectl apply -f ./secret.yaml

マニフェストをデプロイすると Operator 自動で secret を作成してしまうので事前に登録しておきました

そしてその後で Operator を使ってマニフェストからデプロイします

  • vim postgres.yaml
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
  labels:
    team: acid
  name: acid-gitlab
  namespace: default
spec:
  allowedSourceRanges: null
  databases:
    praefect: praefect
  enableConnectionPooler: true
  enableMasterLoadBalancer: true
  enableReplicaLoadBalancer: true
  numberOfInstances: 1
  postgresql:
    version: '13'
  resources:
    limits:
      cpu: 500m
      memory: 500Mi
    requests:
      cpu: 100m
      memory: 100Mi
  teamId: acid
  users:
    praefect:
    - superuser
    - login
    - createrole
    - createdb
  volume:
    size: 10Gi
  • kubectl apply -f ./postgres.yaml

これで事前に作成した secret のパスワードを使って psql コマンドでログインしようとしてみましたがダメでした

あくまでも secret は外部からパスワードを確認する方法のようで PostgreSQL の内部では自動生成されたパスワードを使ってユーザの作成が行われているようです

最後に

バックアップやバージョンアップも簡単にできるので簡易 RDS みたいに使えます

UI があるのはかなり便利かなと思います

参考サイト

2021年5月4日火曜日

bitnami の PostgreSQL helm chart を使ってみた

bitnami の PostgreSQL helm chart を使ってみた

概要

PostgreSQL の helm chart を使う場合は bitnami が公開している helm chart が便利です
今回は k8s 上にデプロイする方法と HA 構成を試してみました

環境

  • kubernetes 1.20.4
  • helm 3.5.2
  • bitnami PostgreSQL helm chart 10.3.18

リポジトリインストール

  • helm repo add bitnami https://charts.bitnami.com/bitnami
  • helm repo update

とりあえずデプロイ

  • helm install test bitnami/postgresql

NodePort でアクセスできるようにする

  • export POSTGRES_PASSWORD=$(kubectl get secret --namespace "default" test-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
  • helm upgrade test bitnami/postgresql --set service.type=NodePort --set service.nodePort=30432 --set postgresqlPassword=$POSTGRES_PASSWORD

デプロイできたか確認しましょう

  • kubectl get pod,svc
NAME                                                   READY   STATUS    RESTARTS   AGE
pod/nfs-subdir-external-provisioner-78cc5b4979-tnnnj   1/1     Running   0          21d
pod/test-postgresql-0                                  1/1     Running   0          8m11s

NAME                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/kubernetes                 ClusterIP   10.96.0.1        <none>        443/TCP          21d
service/test-postgresql            NodePort    10.100.235.141   <none>        5432:30432/TCP   8m11s
service/test-postgresql-headless   ClusterIP   None             <none>        5432/TCP         8m11s

動作確認

  • apt -y install postgresql-client
  • export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") PGPASSWORD="$POSTGRES_PASSWORD" psql --host $NODE_IP --port 30432 -U postgres -d postgres

これでアクセスできれば OK です
あとはテーブルを作成たりデータをインサートすれば OK です

HA 構成をデプロイする

bitnami/postgresql-ha チャートを使います
とりあえずデプロイしてみましょう

  • helm install test2 bitnami/postgresql-ha

NodePort でアクセスできるようにする

HA 構成も NodePort 経由でアクセスできるようにします

  • export POSTGRES_PASSWORD=$(kubectl get secret --namespace default test2-postgresql-ha-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
  • helm upgrade test2 bitnami/postgresql-ha --set service.type=NodePort --set service.nodePort=30432 --set postgresqlPassword=$POSTGRES_PASSWORD

起動したか確認します

  • kubectl get pod,svc
NAME                                                   READY   STATUS    RESTARTS   AGE
pod/nfs-subdir-external-provisioner-78cc5b4979-tnnnj   1/1     Running   0          21d
pod/test2-postgresql-ha-pgpool-75cd676457-2gx44        1/1     Running   0          19m
pod/test2-postgresql-ha-postgresql-0                   1/1     Running   0          19m
pod/test2-postgresql-ha-postgresql-1                   1/1     Running   0          19m
NAME                                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes                                ClusterIP   10.96.0.1       <none>        443/TCP          21d
service/test2-postgresql-ha-pgpool                NodePort    10.99.241.206   <none>        5432:30432/TCP   19m
service/test2-postgresql-ha-postgresql            ClusterIP   10.98.87.23     <none>        5432/TCP         19m
service/test2-postgresql-ha-postgresql-headless   ClusterIP   None            <none>        5432/TCP         19m

動作確認

psql でアクセスする方法はシングル構成のときと同じです

  • export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  • PGPASSWORD="$POSTGRES_PASSWORD" psql -h $NODE_IP -p 30432 -U postgres -d postgres

また HA の状態を確認してみます

  • kubectl exec pod/test2-postgresql-ha-postgresql-0 -- /opt/bitnami/scripts/postgresql-repmgr/entrypoint.sh repmgr -f /opt/bitnami/repmgr/conf/repmgr.conf service status
postgresql-repmgr 08:21:12.78
postgresql-repmgr 08:21:12.78 Welcome to the Bitnami postgresql-repmgr container
postgresql-repmgr 08:21:12.78 Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-postgresql-repmgr
postgresql-repmgr 08:21:12.79 Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-postgresql-repmgr/issues
postgresql-repmgr 08:21:12.79
 ID | Name                             | Role    | Status    | Upstream                         | repmgrd | PID | Paused? | Upstream last seen
----+----------------------------------+---------+-----------+----------------------------------+---------+-----+---------+--------------------
 1000 | test2-postgresql-ha-postgresql-0 | primary | * running |                                  | running | 1   | no      | n/a
 1001 | test2-postgresql-ha-postgresql-1 | standby |   running | test2-postgresql-ha-postgresql-0 | running | 1   | no      | 1 second(s) ago

ちゃんと HA 構成になっているのが確認できると思います

参考サイト

2021年1月19日火曜日

Pgbouncer 超入門

概要

最新版の PostgreSQL と Pgbouncer を組み合わせて使ってみました
インストール方法から紹介します

環境

  • Ubuntu 18.04
  • PostgreSQL 13.1
  • pgbouncer 1.15.0

Linuxbrew のインストール

最新版の PostgreSQL と Pgbouncer を使うので Linuxbrew 経由でそれぞれインストールします

  • /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  • echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> /home/vagrant/.profile

PostgreSQL のインストール

  • brew install postgresql

Pgbouncer のインストール

  • brew install pgbouncer

pbbouncer 経由でアクセスさせるデータベースを定義する

pbbouncer 経由でアクセス可能なデータベースを定義します
デフォルトではどのデータベースにもアクセスできません
後述する test データベースにアクセスできるようにしましょう


* vim /home/linuxbrew/.linuxbrew/etc/pgbouncer.ini

[databases]
test = host=localhost port=5432 dbname=test

userlist.txt へユーザを追加

デフォルトだと pgbouncer へのアクセスは userlist.txt に記載されているユーザのみアクセスできます
今回は vagrant ユーザを使うので vagrant を追記します
パスワードはないので 2 つ目の文字列は空で設定します


* vim /home/linuxbrew/.linuxbrew/etc/userlist.txt

"vagrant" ""

PostgreSQL 起動

  • pg_ctl -D /home/linuxbrew/.linuxbrew/var/postgres start

Pgbouncer の起動

  • pgbouncer -d -q /home/linuxbrew/.linuxbrew/etc/pgbouncer.init

動作確認

  • psql postgres

postgres のプロンプトに変更します


* create database test;
* \connect test
* create table users (name varchar(40), age integer);
* \dt
* insert into users values ('hawk', 10);
* insert into users values ('snowlog', 20);

テーブルが作成できたらアクセスできるか確認します


* psql test -p 5432

これに Pgbouncer 経由でアクセスしてみます


* psql test -p 6432

test データベースのプロンプトに変更します
テーブルの一覧や select 文が発行できることを確認しましょう


* \dt
* select * from users

最後に

PostgreSQL に pgbouncer 経由でアクセスする方法を紹介しました
今回はホワイトリスト形式の ACL くらいしか設定しませんでしたが他にもプーリングの機能や PostgreSQL へのメトリックなども取得できます
大規模な接続になればなるほど必要になるツールになるかなと思います

参考サイト