Declarative hibernation
=======================

EDB Postgres for
Kubernetesは、PostgreSQLクラスターを起動、実行、いつでも利用できるように設計されています。

一部の種類のワークロードは、ワークロードがアクティブなときにのみデータベースを起動する必要があります。バッチ駆動のソリューションは、そのようなケースの1つです。

バッチ駆動ソリューションでは、バッチプロセスの実行中にのみデータベースを起動する必要があります。

宣言的ハイバーネーション機能を使用すると、データベースPVCを維持したままデータベースポッドを削除することにより、CPUパワーを節約できます。

..  Note::
  宣言的ハイバーネーションは、 :ref:`imperative hibernation via the `cnp` plugin <EDB Postgres for Kubernetes Plugin>` の既存の実装とは異なります。必須ハイバーネーションは、高可用性クラスター内のすべてのPostgresインスタンスをシャットダウンし、 `PGDATA` およびWALを含むプライマリのPVCの静的コピーを保持します。プラグインは、プライマリを再開し、すべてのレプリカが存在する場合を再作成することにより、ハイバーネーションフェーズを終了できます。

ハイバネーション
----------------

クラスターを休止状態にするには、 ``k8s.enterprisedb.io/hibernation=on``
アノテーションを設定します。

.. code:: sh

   $ kubectl annotate cluster <cluster-name> --overwrite k8s.enterprisedb.io/hibernation=on

休止したクラスターには実行中のポッドはありませんが、
PVCは保持されるため、後でクラスターをリハイドレートできます。レプリカPVCは、プライマリのPVCに加えて保持されます。

ハイバーネーションプロシージャは、プライマリポッドを削除してからレプリカポッドを削除し、スイッチオーバーを回避して、レプリカの同期が保たれるようにします。

ハイバーネーションステータスは、 ``k8s.enterprisedb.io/hibernation``
条件を探すことにより監視できます。

.. code:: sh

   $ kubectl get cluster <cluster-name> -o "jsonpath={.status.conditions[?(.type==\"k8s.enterprisedb.io/hibernation\")]}" 

   {
           "lastTransitionTime":"2023-03-05T16:43:35Z",
           "message":"Cluster has been hibernated",
           "reason":"Hibernated",
           "status":"True",
           "type":"k8s.enterprisedb.io/hibernation"
   }

ハイバーネーションステータスは、\ ``kubectl`` の\ ``cnp``
プラグインの\ ``status`` サブコマンドで読み取ることもできます。

.. code:: sh

   $ kubectl cnp status <cluster-name>
   Cluster Summary
   Name:              cluster-example
   Namespace:         default
   PostgreSQL Image:  quay.io/enterprisedb/postgresql:17.4
   Primary instance:  cluster-example-2
   Status:            Cluster in healthy state 
   Instances:         3
   Ready instances:   0

   Hibernation
   Status   Hibernated
   Message  Cluster has been hibernated
   Time     2023-03-05 16:43:35 +0000 UTC
   [..]

リハイドレート
--------

クラスターをrehydrateには、 ``k8s.enterprisedb.io/hibernation``
アノテーションを\ ``off`` に設定します。

::

   $ kubectl annotate cluster <cluster-name> --overwrite k8s.enterprisedb.io/hibernation=off

または、完全に設定を解除します。

::

   $ kubectl annotate cluster <cluster-name> k8s.enterprisedb.io/hibernation-

ポッドが再作成され、クラスターがオペレーションを再開します。
