本文へ移動

KubernetesでのPatroniの使用

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でカスタマイズできます。

デフォルトのロールラベルから独自のラベルに移行する場合は、次の手順に従うことでダウンタイムを短縮できます。

  1. kubernetes.tmp_role_labelを使用して、元のロール値を持つ一時的なラベル(tmp_roleなど)をPodに追加します。Podを再起動すると、Patroniによって次のラベルが設定されます。
labels:
  cluster-name: foo
  role: primary
  tmp_role: primary
  1. すべてのPodを更新した後、サービスのセレクターを変更して一時的なラベルを選択するようにします。
selector:
  cluster-name: foo
  tmp_role: primary
  1. 独自のロールラベルを追加します(たとえば、kubernetes.leader_label_value=primaryを設定します)。Podを再起動すると、Patroniによって次の新しいラベルが設定されます。
labels:
  cluster-name: foo
  role: primary
  tmp_role: primary
  1. すべてのPodを再度更新した後、サービスのセレクターを変更して新しいロール値を使用するようにします。
selector:
  cluster-name: foo
  role: primary
  1. 最後に、構成から一時的なラベルを削除し、すべてのPodを更新します。
labels:
  cluster-name: foo
  role: primary

例

  • Patroniリポジトリのkubernetes フォルダーには、PatroniのKubernetes構成をテストするためのDockerイメージとKubernetesマニフェストの例が含まれています。現在の状態では、権限の問題によりPersistentVolumesを使用できないことに注意してください。
  • Persistent Volumesを使用できる、すべての機能を備えたDockerイメージは、Spiloプロジェクト にあります。
  • Kubernetesで実行するPatroniを構成したSpiloイメージをデプロイするためのHelmチャート もあります。
  • PatroniとSpiloを使用してデータベースクラスターを大規模に運用する場合は、postgres-operator プロジェクトを参照してください。Spiloクラスターを管理するためのOperatorパターンを実装しています。