フェンシング

CloudNativePGのフェンシングは、PostgreSQLクラスターの1つ、複数、またはすべてのインスタンスが誤動作していると思われる場合に、それらのインスタンスのデータを保護する究極のプロセスです。インスタンスがフェンスされると、ポッドが実行されたままで、PostgreSQLサーバープロセス(postmaster )がシャットダウンされることが保証されます。これにより、フェンスが解除されるまで、ポッド上のデータが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は 準備完了 としてマークされません

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

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

警告

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

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

fenced インスタンスが削除されると、Pod は正常に再作成されますが、postmaster は起動されません。これは、インスタンスがCrashlooping である場合に非常に役立ちます。