PgbouncerをデプロイするHelmチャートを自作する
はじめに
以前のAirflow導入の記事に関連します。
ジョブ管理のためのOSSであるAirflowを導入しており、ジョブの数やPostgresへのアクセスが増えると、以下のようなエラーに遭遇してジョブが完了しなかったり、そもそもジョブが実行されない。ような状況になると思います。FATAL: Sorry, too many clients aleready
これは、Airflow自体やWorkerがPostgresのコネクションを使い果たすことで出るエラーです。このエラーを解決するためには、コネクションプーリングを用いて既存の接続確立済みのコネクションを使いまわすことが選択肢としてあります。これは、Airflowのドキュメントでも推奨事項として挙げられています。
しかし以前の記事では、BitnamiによるPostgres, Airflowを導入したためPgbouncerの項目はありません。またBitnamiによるHelmチャートにもPgbouncerはなく、ArtifactHUBでPgbouncerについて検索をしてみても古いものばかりでありました。
そのため今回は、Pgbouncerを導入するためのHelmチャートを自作しようと思います。
Helm chart全体は以下に置いてます。
環境
- WSL2: Ubuntu 20
- Docker: 4.10.1
- kind: kind v0.11.1 go1.16.4 linux/amd64
PgbouncerのContainerイメージ
PgbouncerのコンテナイメージはBitnamiが提供するものを利用します。今回は、md5認証のパターンだけで実装します。
Pgbouncerに必要となる環境変数は以下です。
- POSTGRESQL_USERNAME: Postgresのユーザー名
- POSTGRESQL_PASSWORD: Postgresのパスワード(Secretに保管します)
- PGBOUNCER_POOL_MODE: Pgbouncerの設定。Airflowで推奨されている"transaction"を利用します。
- PGBOUNCER_AUTH_QUERY: コネクションが張られた後のQuery
- POSTGRESQL_HOST: 接続するPostgresのホスト名
- PGBOUNCER_AUTH_FILE: ユーザー名とパスワードのリスト(Secretに保管します)
またPgbouncerの導入のためには以下のリソースが必要です。
- Deployment
- PodDisruptionBudget
- Secrets
- Service
- ServiceAccount
values.yaml
基本的には、values.yamlにある設定値を変更します。
以下は代表的なものの抜粋です。
image:
repository: bitnami/pgbouncer
tag: 1.17.0-debian-11-r25
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 200m
memory: 256Mi
maxClientConnections: 2000
poolSize: 5
envVars:
POSTGRESQL_USERNAME: postgres
PGBOUNCER_POOL_MODE: transaction
PGBOUNCER_AUTH_USER: pgbouncer
PGBOUCCER_AUTH_QUERY: SELECT usename, passwd FROM pg_shadow WHERE usename = $1
POSTGRESQL_HOST: postgres.database.svc.cluster.local
PGBOUNCER_AUTH_FILE: /bitnami/pgbouncer/conf/userlist.txt
externalDatabase:
host: postgres.database.svc.cluster.local
port: 5432
Deploy
今回、Pgbouncerはdatabaseネームスペースにデプロイするものとし、AirflowやPostgresのパスワードなどは--set
コマンドで入力します
helm upgrade pggboucer-airflow ./ \
--namespace database \
--install \
--set auth.POSTGRESQL_PASSWORD=testPassword \
--set auth.AIRFLOW_USERNAME=airflow \
--set auth.AIRFLOW_PASSWORD=airflowPassword \
--set pgbouncer.envVars.POSTGRESQL_HOST=postgresql-ha-pgpool.database.svc.cluster.local \
--set externalDatabase.host=postgresql-ha-pgpool.database.svc.cluster.local \
--set pgbouncer.image.tag=1.17.0-debian-11-r31
導入後
Pgbouncerを導入することで、大幅にコネクション数を削減することができました。
Before
count | datname | usename
------+---------+-----------
626 | airflow | airflow
5 | |
3 | repmgr | repmgr
2 | | repmgr
2 | | postgres
After
count | datname | usename
------+---------+-----------
11 | airflow | airflow
5 | |
3 | repmgr | repmgr
2 | | repmgr
2 | | postgres
さいごに
認証タイプがmd5
だけであったり、SSLが無効化された状態ではありますが、ひとまずKubernetesクラスター内にPgbouncerを導入することができました。
BitnamiのPgbouncerのドキュメントに、認証タイプやSSLに関する環境変数があるので、それをHelmチャートに導入することで、実現できます。時間がある際にでも、このHelmチャートはアップデートしてみようと思います。
Discussion