フェンシング

CloudNativePG のフェンシングは、PostgreSQL クラスターの 1 つ、複数、またはすべてのインスタンスのデータが誤動作しているように見える場合に、そのデータを保護する究極のプロセスです。インスタンスがフェンシングされると、ポッドが実行され続けている間、PostgreSQL サーバー プロセス (postmaster ) がシャットダウンされることが保証されます。これにより、フェンスが解除されるまで、Pod 上のデータが PostgreSQL によって変更されず、デバッグやトラブルシューティングの目的でファイル システムを調査できることが保証されます。

インスタンスをフェンシングする方法

CloudNativePG では、以下をフェンシングできます。

  • 特定のインスタンス

  • インスタンスのリスト

  • Postgres Cluster 全体

フェンシングは、cnpg.io/fencedInstances アノテーションの内容によって制御されます。これは、インスタンス名の JSON 形式のリストを想定しています。注釈が '["*"]' (ワイルドカードを含むシングルトン リスト) に設定されている場合、クラスター全体がフェンシングされます。アノテーションが空の JSON リストに設定されている場合、オペレーターはアノテーションが設定されていないかのように動作します。

例えば:

  • cnpg.io/fencedInstances: '["cluster-example-1"]' は cluster-example-1 インスタンスのみをフェンスします

  • cnpg.io/fencedInstances: '["cluster-example-1","cluster-example-2"]' は cluster-example-1 および cluster-example-2 インスタンスをフェンスします

  • cnpg.io/fencedInstances: '["*"]' は、クラスター内のすべてのインスタンスをフェンシングします。

注釈は、たとえば kubectl annotate コマンドを使用して、または kubectl cnpg fencing on サブコマンドを使用して透過的な方法で、Kubernetes オブジェクトに手動で設定できます。

#  to fence only one instance

kubectl cnpg fencing on cluster-example 1

#  to fence all the instances in a Cluster

kubectl cnpg fencing on cluster-example "*"

以前にフェンシングされたインスタンスを持つ Cluster の例を次に示します。

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
    annotations:
      cnpg.io/fencedInstances: ["cluster-example-1"]
[...]

フェンシングの持ち上げ方

フェンシングは、注釈をクリアするか、別の値に設定することで解除できます。

フェンシングに関しては、これは kubectl annotate を使用して手動で行うか、次のように kubectl cnpg fencing サブコマンドを使用して行うことができます。

#  to lift the fencing only for one instance

#  N.B.: at the moment this wont work if the whole cluster was fenced previously,

#        in that case you will have to manually set the annotation as explained above

kubectl cnpg fencing off cluster-example 1

#  to lift the fencing for all the instances in a Cluster

kubectl cnpg fencing off cluster-example "*"

フェンシングの仕組み

インスタンスがフェンシング用に設定されると、postmaster プロセスをシャットダウンする手順が開始されます。これは、タイムアウトが .spec.stopDelay に設定された最初のスマート シャットダウンと、その後の必要に応じた高速シャットダウンで構成されます。それから:

  • Pod は存続します

  • Pod は Ready としてマークされません

  • Postgres インスタンスの起動を必要としないすべての変更が調整されます。これには以下が含まれます。 - 構成ファイル - 証明書とすべての暗号化マテリアル

  • 1 に設定される cnpg_collector_fencing_on を除いて、メトリクスは収集されません

警告

**プライマリ インスタンス**がフェンスされている場合、そのポストマスター プロセスはシャットダウンされますが、フェイルオーバーは実行されず、アプリケーションの操作性が中断されます。フェンスが解除されると、フェイルオーバーを実行せずにプライマリ インスタンスが再起動されます。

そのため、厳密に必要な場合にのみプライマリ インスタンスをフェンシングすることをお勧めします。

フェンシングされたインスタンスが削除された場合、ポッドは正常に再作成されますが、postmaster は開始されません。これは、インスタンスが Crashlooping の場合に非常に役立ちます。