フェンシング

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

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

CloudNativePGでは、次のことをフェンスできます。

  • 特定のインスタンス

  • インスタンスのリスト

  • Postgres Cluster 全体

フェンシングは、インスタンス名のJSON形式のリストを必要とする cnpg.io/fencedInstances アノテーションのコンテンツを介して制御されます。アノテーションが'["*"]' 、ワイルドカードを使用したシングルトンリストに設定されている場合、クラスター全体がフェンスされます。注釈が空の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 の場合に非常に役立ちます。