3.5. 設定ポリシーでのテンプレートのサポート
設定ポリシーは、オブジェクト定義での Golang テキストテンプレートの追加をサポートします。これらのテンプレートは、そのクラスターに関連する設定を使用して、ハブクラスターまたはターゲットのマネージドクラスターでランタイム時に解決されます。これにより、動的コンテンツで設定ポリシーを定義でき、ターゲットクラスターに、カスタマイズされた Kubernetes リソースを通知したり、強制的に実行したりできます。
3.5.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
- テンプレート構文は Golang テンプレート言語仕様に準拠し、解決されたテンプレートから生成されるリソース定義は有効な YAML である必要がある。詳細は、Golang ドキュメントの Package templates を参照。テンプレート検証のエラーは、ポリシー違反として認識される。カスタムのテンプレート関数を使用する場合、値はランタイム時に置き換えられる。
3.5.2. テンプレート関数 リンクのコピーリンクがクリップボードにコピーされました!
リソース固有および汎用の lookup テンプレート関数など、テンプレート関数は、ハブクラスター ({{hub … hub}} 区切り文字の使用) またはマネージドクラスター ({{ … }} 区切り文字の使用) 上の Kubernetes リソースを参照するために用意されています。詳細は、設定ポリシーでのハブクラスターテンプレートのサポート を参照してください。リソース固有の関数は利便性があり、リソースの内容の使いやすさを高めます。より高度な汎用関数 lookup を使用する場合には、検索されるリソースの YAML 構造について理解しておくことが推奨されます。これらの関数に加えて、base64encode、base64decode、indent、autoindent、toInt、toBool などのユーティリティー関数も利用できます。
YAML 構文でテンプレートに準拠するには、テンプレートは引用符またはブロック文字 (| または >) を使用して文字列としてポリシーリソースで設定する必要があります。これにより、解決済みのテンプレート値も文字列になります。これを上書きするには、toInt または toBool をテンプレート内で最終関数として使用して、値を整数またはブール値として強制的に解釈する追加の処理を開始します。
サポート対象のカスタムテンプレート関数の説明と例について確認するには、以下を参照してください。
3.5.2.1. fromSecret 関数 リンクのコピーリンクがクリップボードにコピーされました!
fromSecret 関数は、シークレット内にある指定のデータキーの値を返します。関数については、以下の構文を確認してください。
func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
この関数を使用するには、Kubernetes Secret リソースの namespace、名前、およびデータキーを入力します。ハブクラスターテンプレートの関数を使用する場合は、ポリシーに使用されるのと同じ namespace を使用する必要があります。詳細は、設定ポリシーでのハブクラスターテンプレートのサポート を参照してください。
注記: この関数をハブクラスターテンプレートで使用すると、関数の保護 を使用して出力が自動的に暗号化されます。
Kubernetes Secret がターゲットクラスターに存在しない場合は、ポリシー違反が表示されます。データキーがターゲットクラスターに存在しない場合は、値が空の文字列になります。以下で、ターゲットクラスターで Secret リソースを有効にする設定ポリシーを確認します。PASSWORD データキーの値は、ターゲットクラスターのシークレットを参照するテンプレートを指します。
3.5.2.2. fromConfigmap 関数 リンクのコピーリンクがクリップボードにコピーされました!
fromConfigmap 関数は、ConfigMap 内にある指定のデータキーの値を返します。関数については、以下の構文を確認してください。
func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)
func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)
この関数を使用するには、Kubernetes ConfigMap リソースの namespace、名前、およびデータキーを入力します。ハブクラスターテンプレートの関数を使用するポリシーに使用されるのと同じ namespace を使用する必要があります。詳細は、設定ポリシーでのハブクラスターテンプレートのサポート を参照してください。Kubernetes ConfigMap リソースまたはデータキーがターゲットクラスターに存在しない場合は、ポリシー違反が表示されます。データキーがターゲットクラスターに存在しない場合は、値が空の文字列になります。以下で、ターゲットのマネージドクラスターで Kubernetes リソースを有効にする設定ポリシーを表示します。log-file データキーの値は、ConfigMap から log-file、default namespace から log-config の値を取得するテンプレートであり、log-level はデータキーの log-level に設定されます。
3.5.2.3. fromClusterClaim 関数 リンクのコピーリンクがクリップボードにコピーされました!
fromClusterClaim 関数は、ClusterClaim リソースの Spec.Value の値を返します。関数については、以下の構文を確認してください。
func fromClusterClaim (clusterclaimName string) (value map[string]interface{}, err Error)
func fromClusterClaim (clusterclaimName string) (value map[string]interface{}, err Error)
この関数を使用する場合は、Kubernetes ClusterClaim リソースの名前を入力します。ClusterClaim リソースが存在しない場合は、ポリシー違反が表示されます。以下で、ターゲットのマネージドクラスターで Kubernetes リソースを有効にする設定ポリシーの例を確認してください。platform データキーの値は、platform.open-cluster-management.io クラスター要求の値を取得するテンプレートです。同様に、 product と version の値は ClusterClaim から取得します。
3.5.2.4. lookup 関数 リンクのコピーリンクがクリップボードにコピーされました!
lookup 関数は、JSON と互換性のあるマップとして Kubernetes リソースを返します。要求されたリソースが存在しない場合は、空のマップが返されます。リソースが存在せず、値が別のテンプレート関数に提供されている場合は、エラー invalid value; expected string が発生する可能性があります。
注記: default テンプレート関数を使用して、後のテンプレート関数に正しい型が提供されるようにします。オープンソースコミュニティー機能 セクションを参照してください。
関数については、以下の構文を確認してください。
func lookup (apiversion string, kind string, namespace string, name string) (value string, err Error)
func lookup (apiversion string, kind string, namespace string, name string) (value string, err Error)
この関数を使用する場合は、Kubernetes リソースの API バージョン、kind、namespace、および name を入力します。ハブクラスターテンプレート内のポリシーに使用されるものと同じ namespace を使用する必要があります。詳細は、設定ポリシーでのハブクラスターテンプレートのサポート を参照してください。以下で、ターゲットのマネージドクラスターで Kubernetes リソースを有効にする設定ポリシーの例を確認してください。metrics-url データキーの値は、default namespace から v1/Service Kubernetes リソースの metrics を取得するテンプレートであり、クエリーされたリソースにある Spec.ClusterIP の値に設定されます。
3.5.2.5. base64enc 関数 リンクのコピーリンクがクリップボードにコピーされました!
base64enc 関数は、入力 データ文字列 を base64 でエンコードされた値で返します。関数については、以下の構文を確認してください。
func base64enc (data string) (enc-data string)
func base64enc (data string) (enc-data string)
この関数を使用する場合は、文字列値を入力します。以下で、base64enc 関数を使用する設定ポリシーの例を確認してください。
3.5.2.6. base64dec 関数 リンクのコピーリンクがクリップボードにコピーされました!
base64dec 関数は、入力 enc-data 文字列 を base64 デコードされた値で返します。関数については、以下の構文を確認してください。
func base64dec (enc-data string) (data string)
func base64dec (enc-data string) (data string)
この関数を使用する場合は、文字列値を入力します。以下で、base64dec 関数を使用する設定ポリシーの例を確認してください。
3.5.2.7. indent 関数 リンクのコピーリンクがクリップボードにコピーされました!
indent 関数により、パディングされた データ文字列 が返されます。関数については、以下の構文を確認してください。
func indent (spaces int, data string) (padded-data string)
func indent (spaces int, data string) (padded-data string)
この関数を使用する場合は、特定のスペース数でデータ文字列を入力します。以下で、indent 関数を使用する設定ポリシーの例を確認してください。
3.5.2.8. autoindent 関数 リンクのコピーリンクがクリップボードにコピーされました!
autoindent 関数は、indent 関数のように機能し、テンプレートの前のスペース数に基づいて自動的に先頭のスペース数を決定します。以下で、autoindent 関数を使用する設定ポリシーの例を確認してください。
3.5.2.9. toInt 関数 リンクのコピーリンクがクリップボードにコピーされました!
toInt 関数は入力値の整数値をキャストして返します。また、テンプレートの最後の関数である場合は、ソースコンテンツがさらに処理されます。これは、YAML で値が整数として解釈されるようにするためです。関数については、以下の構文を確認してください。
func toInt (input interface{}) (output int)
func toInt (input interface{}) (output int)
この関数を使用する場合は、整数としてキャストする必要があるデータを入力します。以下で、tolnt 関数を使用する設定ポリシーの例を確認してください。
3.5.2.10. toBool 関数 リンクのコピーリンクがクリップボードにコピーされました!
toBool 関数は、入力文字列をブール値に変換し、ブール値を返します。また、テンプレートの最後の関数である場合は、ソースコンテンツがさらに処理されます。これは、YAML で値がブール値として解釈されるようにするためです。関数については、以下の構文を確認してください。
func toBool (input string) (output bool)
func toBool (input string) (output bool)
この関数を使用する場合は、ブール値に変換する必要のある文字列データを入力します。以下で、toBool 関数を使用する設定ポリシーの例を確認してください。
3.5.2.11. protect 関数 リンクのコピーリンクがクリップボードにコピーされました!
protect 機能により、ハブクラスターポリシーテンプレートで文字列を暗号化できます。これは、ポリシーの評価時にマネージドクラスターで自動的に復号化されます。以下で、protect 関数を使用する設定ポリシーの例を確認してください。
前述の YAML の例では、lookup 関数を使用するために定義した既存のハブクラスターポリシーテンプレートがあります。マネージドクラスターの namespace に複製されたポリシーでは、値は $ocm_encrypted:okrrBqt72oI+3WT/0vxeI3vGa+wpLD7Z0ZxFMLvL204= のようになります。
それぞれの暗号化アルゴリズムは、256 ビットキーを使用した AES-CBC です。各暗号化キーはマネージドクラスターごとに一意で、30 日ごとに自動的にローテーションされます。
これにより、復号化された値がマネージドクラスターのポリシーに保存されることはありません。
即時のローテーションを強制するには、ハブクラスターのマネージドクラスター namespace の policy-encryption-key Secret で policy.open-cluster-management.io/last-rotated アノテーションを削除します。その後、ポリシーが再処理され、新しい暗号化キーが使用されます。
3.5.2.12. toLiteral 関数 リンクのコピーリンクがクリップボードにコピーされました!
toLiteral 関数は、処理後にテンプレート文字列を囲む引用符をすべて削除します。この関数を使用して、JSON 文字列を ConfigMap フィールドからマニフェストの JSON 値に変換できます。次の関数を実行して、key パラメーター値から引用符を削除します。
key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'
key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'
toLiteral 関数を使用すると、次の更新が表示されます。
key: ["10.10.10.10", "1.1.1.1"]
key: ["10.10.10.10", "1.1.1.1"]
3.5.2.13. オープンソースコミュニティー機能 リンクのコピーリンクがクリップボードにコピーされました!
さらに、Red Hat Advanced Cluster Management は、sprig オープンソースプロジェクトに含まれる以下のテンプレート関数をサポートします。
-
cat -
contains -
default -
空 -
fromJson -
hasPrefix -
hasSuffix -
join -
list -
lower -
mustFromJson -
quote -
replace -
semver -
semverCompare -
split -
splitn -
ternary -
trim -
until -
untilStep -
upper
詳細は、Sprig 関数のドキュメント を参照してください。
3.5.3. 設定ポリシーでのハブクラスターテンプレートのサポート リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Advanced Cluster Management は、ターゲットクラスターに動的にカスタマイズされたマネージドクラスターテンプレートのほかに、ハブクラスターからの値を使用して設定ポリシーを定義するためのハブクラスターテンプレートもサポートします。この組み合わせにより、ポリシー定義の各ターゲットクラスターまたはハードコーディング設定値に個別のポリシーを作成する必要がなくなります。
ハブクラスターテンプレートは Golang テキストテンプレートの仕様をベースとしており、{{hub … hub}} 区切り文字は設定ポリシーのハブクラスターテンプレートを示します。
セキュリティーを確保するには、ハブクラスターテンプレートのリソース固有および一般的なルックアップ機能の両方が、ハブクラスターのポリシーの namespace に制限されます。詳細は、ハブおよびマネージドクラスターテンプレートの比較 をご覧ください。
重要: ハブクラスターテンプレートを使用してシークレットや他の機密データを伝播する場合には、機密データはハブクラスターにあるマネージドクラスターの namespace か、そのポリシーが配布されているマネージドクラスター上に存在します。テンプレートの内容はポリシーで拡張され、 OpenShift Container Platform ETCD 暗号化サポートでは、ポリシーは暗号化されません。これに対処するには、シークレットからの値を自動的に暗号化する fromSecret を使用するか、他の値を暗号化するために protect します。
3.5.3.1. テンプレート処理 リンクのコピーリンクがクリップボードにコピーされました!
設定ポリシー定義には、ハブクラスターとマネージドクラスターのテンプレートの両方を含めることができます。ハブクラスターテンプレートは、先にハブクラスターで処理され、解決されたハブクラスターテンプレートを使用したポリシー定義がターゲットクラスターに伝播されます。マネージドクラスターでは、ConfigurationPolicyController はポリシー定義内のマネージドクラスターテンプレートを処理し、その後、完全に解決されたオブジェクト定義を有効にするか、検証します。
3.5.3.2. 再処理のための特別なアノテーション リンクのコピーリンクがクリップボードにコピーされました!
ポリシーは、作成または更新時にのみハブクラスターで処理されます。そのため、ハブクラスターテンプレートは、ポリシーの作成または更新時に参照リソースのデータに対してのみ解決されます。参照リソースへの変更は、自動的にポリシーと同期されません。
テンプレートによって参照されるデータへの変更を示すために、特別なアノテーション policy.open-cluster-management.io/trigger-update を使用できます。特別なアノテーション値を変更すると、テンプレート処理が開始され、参照されるリソースの最新内容は、ポリシー定義に読み込まれて更新され、マネージクラスターので処理するように伝播するロールを果たします。このアノテーションの一般的な使用方法は、値を 1 回に 1 つずつ増やすことです。
3.5.3.3. テンプレート処理のバイパス リンクのコピーリンクがクリップボードにコピーされました!
Red Hat AdvancedClusterManagement による処理を目的としていないテンプレートを含めて、ポリシーを作成する場合があります。デフォルトでは、Red Hat Advanced Cluster Management は全テンプレートを処理します。
ハブクラスターのテンプレート処理を省略するには、{{ template content }} を {{ `{{ template content }}` }} に変更する必要があります。
または、Policy の ConfigurationPolicy セクションに policy.open-cluster-management.io/disable-templates: "true" のアノテーションを追加します。このアノテーションを追加する場合に、1 つ前の回避策は必要ありません。ConfigurationPolicy のテンプレート処理はバイパスされます。
ハブクラスターとマネージドクラスターのテンプレートの比較は、以下の表を参照してください。
3.5.3.4. ハブクラスターとマネージドクラスターテンプレートの比較 リンクのコピーリンクがクリップボードにコピーされました!
| テンプレート | ハブクラスター | マネージドクラスター |
|---|---|---|
| 構文 | Golang テキストテンプレートの仕様 | Golang テキストテンプレートの仕様 |
| デリミタ | {{hub … hub}} | {{ … }} |
| コンテキスト |
| コンテキスト変数はありません |
| アクセス制御 |
| クラスターの任意のリソースを参照できます。 |
| 関数 | Kubernetes リソースおよび文字列操作への動的なアクセスをサポートするテンプレート関数のセット。詳細は、テンプレート関数 を参照してください。検索制限については、アクセス制御の行を参照してください。
ハブクラスターの
同等の呼び出しは、次の構文を使用する場合があります: | テンプレート関数セットは、Kubernetes リソースおよび文字列操作への動的なアクセスをサポートします。詳細は、テンプレート関数 を参照してください。 |
| 関数出力ストレージ |
テンプレート関数の出力は、マネージドクラスターに同期される前に、マネージドクラスターで適用可能な各マネージドクラスター namespace の | テンプレート関数の出力は、ポリシー関連のリソースオブジェクトには保存されません。 |
| 処理 | 複製されたポリシーのクラスターへの伝播中に、ハブクラスターのランタイムで処理が発生します。ポリシーと、そのポリシー内にあるハブクラスターのテンプレートは、テンプレートの作成時または更新時にのみハブクラスターで処理されます。 |
処理は、マネージドクラスターの |
| エラーの処理 | ハブクラスターテンプレートからのエラーは、ポリシーの適用先のマネージドクラスターの違反として表示されます。 | マネージドクラスターテンプレートからのエラーは、違反が発生した特定のターゲットクラスターの違反として表示されます。 |