KubernetesでのPatroniの使用
PatroniはKubernetesオブジェクトを使用してクラスターの状態を保存し、リーダーキーを管理できます。そのため、整合性ストアを用意せずにKubernetes環境でPostgresを運用できます。つまり、追加のetcdデプロイメントを実行する必要がありません。Patroniがリーダーキーと構成キーの保存に使用できるKubernetesオブジェクトには二種類あり、kubernetes.use_endpointsまたは環境変数PATRONI_KUBERNETES_USE_ENDPOINTSで構成します。
Endpointsの使用
これは推奨モードですが、互換性のためデフォルトでは無効です。有効にすると、Patroniは作成した各Endpointsのmetadata: annotationsフィールドにクラスター構成とリーダーキーを保存します。リーダー情報を含むアノテーションと、実行中のリーダーPodを指す実際のアドレスを同時に一度で更新するため、ConfigMapsを使用する場合よりも安全にリーダーを変更できます。
ConfigMapsの使用
このモードでは、PatroniはEndpointsの代わりにConfigMapsを作成し、そのメタデータ内にキーを保存します。リーダーの変更には、リーダーのConfigMapと対応するEndpointに対する、少なくとも二回の更新が必要です。
トラフィックをPostgresのリーダーに向けるには、KubernetesのPostgresサービスが(Patroniの構成で設定した)role_labelによるラベルセレクターを使用するよう構成する必要があります。
OpenShift上で実行する場合など、状況によってはConfigMapsを使用する以外に選択肢がないことに注意してください。
構成
PatroniのKubernetes用の設定 と環境変数 は、ドキュメントの一般的な章で説明しています。
ロールラベルのカスタマイズ
デフォルトでは、Patroniはノードのロールに応じて、実行中のPodにrole=primaryなどの対応するラベルを設定します。ラベルのキーと値は、kubernetes.role_label、kubernetes.leader_label_value、kubernetes.follower_label_value、kubernetes.standby_leader_label_valueでカスタマイズできます。
デフォルトのロールラベルから独自のラベルに移行する場合は、次の手順に従うことでダウンタイムを短縮できます。
kubernetes.tmp_role_labelを使用して、元のロール値を持つ一時的なラベル(tmp_roleなど)をPodに追加します。Podを再起動すると、Patroniによって次のラベルが設定されます。
- すべてのPodを更新した後、サービスのセレクターを変更して一時的なラベルを選択するようにします。
- 独自のロールラベルを追加します(たとえば、
kubernetes.leader_label_value=primaryを設定します)。Podを再起動すると、Patroniによって次の新しいラベルが設定されます。
- すべてのPodを再度更新した後、サービスのセレクターを変更して新しいロール値を使用するようにします。
- 最後に、構成から一時的なラベルを削除し、すべてのPodを更新します。
例
- Patroniリポジトリのkubernetes フォルダーには、PatroniのKubernetes構成をテストするためのDockerイメージとKubernetesマニフェストの例が含まれています。現在の状態では、権限の問題によりPersistentVolumesを使用できないことに注意してください。
- Persistent Volumesを使用できる、すべての機能を備えたDockerイメージは、Spiloプロジェクト にあります。
- Kubernetesで実行するPatroniを構成したSpiloイメージをデプロイするためのHelmチャート もあります。
- PatroniとSpiloを使用してデータベースクラスターを大規模に運用する場合は、postgres-operator プロジェクトを参照してください。Spiloクラスターを管理するためのOperatorパターンを実装しています。