🐕

PgbouncerをデプロイするHelmチャートを自作する

2022/08/29に公開

はじめに

以前のAirflow導入の記事に関連します。
https://zenn.dev/shorter/articles/dcf694061bb4bf
ジョブ管理のためのOSSであるAirflowを導入しており、ジョブの数やPostgresへのアクセスが増えると、以下のようなエラーに遭遇してジョブが完了しなかったり、そもそもジョブが実行されない。ような状況になると思います。

FATAL: Sorry, too many clients aleready

これは、Airflow自体やWorkerがPostgresのコネクションを使い果たすことで出るエラーです。このエラーを解決するためには、コネクションプーリングを用いて既存の接続確立済みのコネクションを使いまわすことが選択肢としてあります。これは、Airflowのドキュメントでも推奨事項として挙げられています。
https://airflow.apache.org/docs/apache-airflow/stable/howto/set-up-database.html#setting-up-a-postgresql-database

https://github.com/airflow-helm/charts
公式のHelmチャートを用いていれば、values.yamlを編集してPgbouncerを有効化すれば導入できます。
しかし以前の記事では、BitnamiによるPostgres, Airflowを導入したためPgbouncerの項目はありません。またBitnamiによるHelmチャートにもPgbouncerはなく、ArtifactHUBでPgbouncerについて検索をしてみても古いものばかりでありました。
https://artifacthub.io/packages/search?ts_query_web=pgbouncer&sort=relevance&page=1

そのため今回は、Pgbouncerを導入するためのHelmチャートを自作しようと思います。
Helm chart全体は以下に置いてます。
https://github.com/shohta-tera/pgbouncer-helm-charts

環境

  • WSL2: Ubuntu 20
  • Docker: 4.10.1
  • kind: kind v0.11.1 go1.16.4 linux/amd64

PgbouncerのContainerイメージ

PgbouncerのコンテナイメージはBitnamiが提供するものを利用します。今回は、md5認証のパターンだけで実装します。
https://github.com/bitnami/containers/tree/main/bitnami/pgbouncer

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

https://github.com/shohta-tera/pgbouncer-helm-charts/blob/main/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を導入することができました。

https://github.com/bitnami/containers/tree/main/bitnami/pgbouncer
BitnamiのPgbouncerのドキュメントに、認証タイプやSSLに関する環境変数があるので、それをHelmチャートに導入することで、実現できます。時間がある際にでも、このHelmチャートはアップデートしてみようと思います。

GitHubで編集を提案

Discussion