minikube
上でちょっと PostgreSQL を動したいと思ったときに、 Kubegres というシンプルな Operator があったので、 試してみました。
動作確認環境
- macOS Sequoia 15.3
-
colima
0.8.1 で動かしている docker 環境 -
minikube
v1.35.0 -
kubegres
v1.19
インストール
Kubegres の Getting started の通りです。
kubectl apply -f https://raw.githubusercontent.com/reactive-tech/kubegres/v1.19/kubegres.yaml
kubectl get all -n kubegres-system
Secret 作成
Secret は base64 で設定すると思っていたのですが、 data
の代わりに stringData
を使えばそのまま書けるようです。
apiVersion: v1
kind: Secret
metadata:
name: mypostgres-secret
namespace: default
type: Opaque
stringData:
superUserPassword: postgresSuperUserPsw
replicationUserPassword: postgresReplicaPsw
PostgreSQL インスタンスのクラスタ作成
最初に replicas: 3
で試したときに2個目以降が affinity 関係のエラーで動かなかったのと、 とりあえず動かしたいだけだったので、 replicas: 1
にしました。 (この記事を書きながら 3
で試したら問題なく動いてしまったので、エラーの原因は追求できませんでした。)
apiVersion: kubegres.reactive-tech.io/v1
kind: Kubegres
metadata:
name: mypostgres
namespace: default
spec:
replicas: 1
image: postgres:17.2
database:
size: 200Mi
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: mypostgres-secret
key: superUserPassword
- name: POSTGRES_REPLICATION_PASSWORD
valueFrom:
secretKeyRef:
name: mypostgres-secret
key: replicationUserPassword
接続確認
適当に postgres
のコンテナを起動して接続できるのを確認しました。
Kubegres
では普通の postgres
のイメージを使うときと同じように、 ユーザーやデータベースは自分で自由に作成できます。
kubectl run -i psql --rm --image=postgres:17.2 --restart=Never -- env PGPASSWORD=postgresSuperUserPsw psql -U postgres -h mypostgres -l
kubectl run -it psql --rm --image=postgres:17.2 --restart=Never -- /bin/bash
env PGPASSWORD=postgresSuperUserPsw psql -U postgres -h mypostgres -l
env PGPASSWORD=postgresSuperUserPsw createuser -U postgres -h mypostgres --echo --createdb --no-createrole --no-superuser --pwprompt test_app
実行例:
% kubectl run -i psql --rm --image=postgres:17.2 --restart=Never -- env PGPASSWORD=postgresSuperUserPsw psql -U postgres -h mypostgres -l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
postgres | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(3 rows)
pod "psql" deleted
設定変更
以下のように ConfigMap
を作成してから kind: Kubegres
の方の spec
に customConfig: mypostgres-conf
を追加すると、 postgres.conf
を変更できます。
この例ではまず kubectl exec -it pods/mypostgres-1-0 -- /bin/bash
で入って、 cat /etc/postgres.conf
でデフォルトの postgres.conf
を確認しました。 それをコピペして max_connections
を増やしています。
apiVersion: v1
kind: ConfigMap
metadata:
name: mypostgres-conf
namespace: default
data:
postgres.conf: |
# Replication configs
listen_addresses = '*'
max_wal_senders = 10
max_connections = 200
shared_buffers = 128MB
# Logging
#log_destination = 'stderr,csvlog'
#logging_collector = on
#log_directory = 'pg_log'
#log_filename= 'postgresql-%Y-%m-%d_%H%M%S.log'
設定を変更するときは ConfigMap
だけ変更しても反映されないなど、 いくつか注意点があるので、 Override the default configurations をみておく必要があるようです。
とりあえず開発環境やテスト環境なら、ダミーの無意味な環境変数の設定を追加や変更して、 pod を作り直させるのが楽そうです。
デフォルト設定は namespace ごとの base-kubegres-config
にあるようで、 kubectl get cm base-kubegres-config -o yaml
で確認できました。 namespace 内のデータベースをまとめて設定変更するなら、 kubectl edit
などで base-kubegres-config
を直接変更すれば良いようです。
まとめ
とりあえず postgres
を Kubernetes
で動かすために Kubegres
を使ってみました。
postgres
イメージをそのまま使えるのは docker compose からの移行が楽で良さそうでした。 (他の PostgreSQL Operator だと独自イメージを使うようになっていることが多そう。)
設定の変更に癖があるなど、 Kubernetes
との組み合わせの使い勝手はあまりよくないので、 次は CloudNativePG を試します。