オペレーター設定
================

CloudNativePGのオペレーターは、標準の展開マニフェストからインストールされ、構成パラダイムの規則に従います。ほとんどの場合、これで問題ありませんが、次のようなデフォルトの動作を変更する必要があるシナリオもあります。

-  オペレーターが作成し、クラスターリソースに設定されているすべてのリソースに継承されるアノテーションとラベルの定義

-  PostgreSQLの別のデフォルトイメージまたは追加のプルシークレットを定義

デフォルトでは、オペレーターは\ ``cnpg-controller-manager``
と呼ばれるKubernetes ``Deployment`` として\ ``cnpg-system``
名前空間にインストールされます。

..  Note::
   以下の例では、オペレーター展開のデフォルトの名前と名前空間を想定しています。

オペレーターの動作は、オペレーター展開と同じ名前空間にあり、名前が\ ``cnpg-controller-manager-config``
を持つ\ ``ConfigMap`` /``Secret`` を介してカスタマイズできます。

..  Important::
   構成の`ConfigMap` /`Secret` への変更は、オペレーターによって自動的に検出されません。そのため、リロードする必要があります以下を参照してください。さらに、変更は、構成がリロードされた後に作成されたリソースにのみ適用されます。

..  Important::
   オペレーターは、最初にConfigMap値を処理し、次にSecretをこの順序で処理します。その結果、パラメーターが両方の場所で定義されている場合、シークレットにあるものが使用されます。

使用可能なオプション
--------------------

オペレーターは、 ``ConfigMap`` /``Secret``
で定義される次の環境変数を探します。

.. csv-table::
  :header: Name,Description
  :widths: 10,30
  :align: left
  :class: longtable

  `INHERITED_ANNOTATIONS`,`Cluster`メタデータで定義されている場合、ポッドを含む生成されたすべてのリソースに継承されるアノテーション名のリスト
  `INHERITED_LABELS`,`Cluster`メタデータで定義されている場合、ポッドを含む生成されたすべてのリソースに継承されるラベル名のリスト
  `PULL_SECRET_NAME`,オペレーターの名前空間で定義され、イメージのダウンロードに使用される追加のプルシークレットの名前
  `ENABLE_AZURE_PVC_UPDATES`,PVCがサイズ変更状態でスタックしている場合、Postgresポッドを削除できます。この機能は、主にAzure環境デフォルト`false`
  `ENABLE_INSTANCE_MANAGER_INPLACE_UPDATES`,`true`に設定している場合、オペレーターの更新後にインスタンスマネージャーのインプレース更新を有効にし、クラスターのローリング更新を回避しますデフォルト `false`
  `MONITORING_QUERIES_CONFIGMAP`,作成されるすべてのクラスターに適用されるデフォルトのクエリー`queries`の下で指定されるオペレーターの名前空間のConfigMapの名前
  `MONITORING_QUERIES_SECRET`,作成されるすべてのクラスターに適用されるデフォルトのクエリー`queries`の下で指定されるオペレーターの名前空間のシークレットの名前
  `CREATE_ANY_SERVICE`,`true`に設定すると、クラスターの`-any`サービスを作成します。デフォルトは`false`です

``INHERITED_ANNOTATIONS`` および\ ``INHERITED_LABELS``
の値は、パスのようなワイルドカードをサポートしています。たとえば、値\ ``example.com/*``
は、値\ ``example.com/one`` および\ ``example.com/two``
の両方と一致します。

``PULL_SECRET_NAME``
パラメーターを使用して追加のプルシークレット名を指定すると、オペレーターはそのシークレットを使用して、作成されたすべてのPostgreSQLクラスターのプルシークレットを作成します。そのシークレットの名前は\ ``<cluster-name>-pull``
になります。

オペレーターが\ ``PULL_SECRET_NAME``
シークレットを検索する名前空間は、オペレーターをインストールした場所です。オペレーターがそのシークレットを見つけることができない場合、構成パラメーターは無視されます。

..  Warning::
   オペレーターの以前のバージョンでは、PostgreSQLクラスターを展開する名前空間内に`PULL_SECRET_NAME` シークレットをコピーしました。バージョン「1.11.0」から、以前の説明と一致するように動作が変更されました。オペレーターの以前のバージョンによって作成されたプルシークレットは使用されません。

オペレーター構成マップの定義
----------------------------

次の例では、後でデプロイされる\ ``Cluster``
オブジェクトによって作成されたリソースが継承するラベル/アノテーション名を定義し、\ `in-place
updates for the instance
manager <installation_upgrade.md#in-place-updates-of-the-instance-manager>`__\ を有効にすることにより、オペレーターの動作をカスタマイズします。

.. code:: yaml

   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: cnpg-controller-manager-config
     namespace: cnpg-system
   data:
     INHERITED_ANNOTATIONS: categories
     INHERITED_LABELS: environment, workload, app
     ENABLE_INSTANCE_MANAGER_INPLACE_UPDATES: true

オペレーターシークレットの定義
------------------------------

次の例では、後でデプロイされる\ ``Cluster``
オブジェクトによって作成されたリソースが継承するラベル/アノテーション名を定義し、\ `in-place
updates for the instance
manager <installation_upgrade.md#in-place-updates-of-the-instance-manager>`__\ を有効にすることにより、オペレーターの動作をカスタマイズします。

.. code:: yaml

   apiVersion: v1
   kind: Secret
   metadata:
     name: cnpg-controller-manager-config
     namespace: cnpg-system
   type: Opaque
   stringData:
     INHERITED_ANNOTATIONS: categories
     INHERITED_LABELS: environment, workload, app
     ENABLE_INSTANCE_MANAGER_INPLACE_UPDATES: true

オペレーターを再起動して構成をリロードする
------------------------------------------

変更を有効にするには、オペレーターポッドを再作成して構成マップをリロードする必要があります。マニフェストを使用してKubernetesにオペレーターをインストールしている場合、次のコマンドを発行してそれを行うことができます。

.. code:: shell

   kubectl rollout restart deployment \
       -n cnpg-system \
       cnpg-controller-manager

通常、特定の名前空間を指定すると、次のコマンドでオペレーターポッドを削除できます。

.. code:: shell

   kubectl delete pods -n [NAMESPACE_NAME_HERE] \
     -l app.kubernetes.io/name=cloudnative-pg

..  Warning::
   カスタマイズは、オペレーター展開のリロード後に作成される`Cluster` リソースにのみ適用されます。

上記の例に従って、 ``Cluster`` 定義に\ ``categories``
アノテーションと\ ``environment`` 、\ ``workload`` 、または\ ``app``
ラベルのいずれかが含まれている場合、これらはデプロイメントによって生成されたすべてのリソースに継承されます。

pprof HTTP Server
-----------------

オペレーターは、\ ``localhost:6060`` の次のエンドポイントでPPROF
HTTPサーバーを公開できます。

-  ``/debug/pprof/``
   .使用可能なプロファイルをリストするHTMLページで「/debug/pprof/」の要求に応答します

-  ``/debug/pprof/cmdline``
   .実行中のプログラムのコマンドラインに、NULLバイトで区切られた引数を使用して応答します。

-  ``/debug/pprof/profile`` .
   pprof形式のcpuプロファイルで応答します。プロファイリングは、GETパラメーターで指定された期間、または指定しない場合は30秒間持続します。

-  ``/debug/pprof/symbol``
   .要求にリストされているプログラムカウンターを検索し、プログラムカウンターをファンクション名にマッピングするテーブルで応答します。

-  ``/debug/pprof/trace``
   .バイナリ形式の実行トレースで応答します。トレースは、秒GETパラメーターで指定された期間、または指定しない場合は1秒間持続します。

オペレーターを有効にするには、オペレーター展開を編集し、フラグ
``--pprof-server=true`` を追加する必要があります。

これは、次のコマンドを実行して行うことができます。

.. code:: shell

   kubectl edit deployment -n cnpg-system cnpg-controller-manager

次に、編集ページでコンテナ引数を下にスクロールし、\ ``--pprof-server=true``
を追加します。例

.. code:: yaml

         containers:
         - args:
           - controller
           - --enable-leader-election
           - --config-map-name=cnpg-controller-manager-config
           - --secret-name=cnpg-controller-manager-config
           - --log-level=info
           - --pprof-server=true # relevant line
           command:
           - /manager

変更を保存すると、展開でロールアウトが実行され、新しいポッドでPPROFサーバーが有効になります。

ポッドが実行されたら、次の方法でコンテナ内で実行できます。

.. code:: shell

   kubectl exec -ti -n cnpg-system <pod name> -- bash

内部に入ったら、次を実行します。

.. code:: shell

   curl localhost:6060/debug/pprof/
