1.2. テンプレート処理


設定ポリシーと Operator ポリシーは、Golang テキストテンプレートの組み込みをサポートしています。これらのテンプレートは、そのクラスターに関連する設定を使用して、ハブクラスターまたはターゲットのマネージドクラスターでランタイム時に解決されます。これにより、動的コンテンツでポリシーを定義でき、ターゲットクラスターに、カスタマイズされた Kubernetes リソースを通知したり、強制的に実行したりできます。

ポリシー定義には、ハブクラスターテンプレートとマネージドクラスターテンプレートの両方を含めることができます。ハブクラスターテンプレートは、先にハブクラスターで処理され、解決されたハブクラスターテンプレートを使用したポリシー定義がターゲットクラスターに伝播されます。マネージドクラスターのコントローラーは、ポリシー定義内のマネージドクラスターテンプレートを処理し、その後、完全に解決されたオブジェクト定義を有効にするか、検証します。

テンプレートは Golang テンプレート言語仕様に準拠し、解決されたテンプレートから生成されるリソース定義は有効な YAML である必要がある。詳細は、Golang ドキュメントの Package templates を参照してください。テンプレート検証のエラーは、ポリシー違反として認識されます。カスタムのテンプレート関数を使用する場合、値はランタイム時に置き換えられます。

重要:

  • ハブクラスターテンプレートを使用してシークレットや他の機密データを伝播すると、機密データはハブクラスターにあるマネージドクラスターの namespace か、そのポリシーが配布されているマネージドクラスター上に存在します。テンプレートの内容はポリシーで拡張され、ポリシーは OpenShift Container Platform ETCD 暗号化サポートでは暗号化されません。これに対処するには、fromSecret または copySecretData を使用して、シークレットの値を自動的に暗号化するか、他の値を暗号化するための protect を使用します。
  • 証明書などの複数行の文字列値を追加する場合は、改行を処理するために、テンプレートパイプラインの最後に常に | toRawJson | toLiteral 構文を追加します。たとえば、Secret リソースから証明書をコピーして ConfigMap リソースに含めると、テンプレートパイプラインは次の構文のようになります。

    ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt"  | base64dec | toRawJson | toLiteral }}'
    Copy to Clipboard Toggle word wrap

    toRawJson テンプレート関数は、YAML 構造に影響を与えないように改行をエスケープした入力値を JSON 文字列に変換します。toLiteral テンプレート関数は、出力から外側の単一引用符を削除します。たとえば、テンプレートが key: '{{ 'hello\nworld' | toRawJson }}' テンプレートパイプラインに対して処理されると、出力は key: '"hello\nworld"' になります。key: '{{ 'hello\nworld' | toRawJson | toLiteral }}' テンプレートパイプラインの出力は、key: "hello\nworld" です。

ハブクラスターとマネージドクラスターのテンプレートの比較は、以下の表を参照してください。

1.2.1. ハブクラスターとマネージドクラスターのテンプレートの比較

Expand
表1.4 比較表
テンプレートハブクラスターマネージドクラスター

構文

Golang テキストテンプレートの仕様

Golang テキストテンプレートの仕様

デリミター

{{hub … hub}}

{{ … }}

コンテキスト

コンテキスト変数 .ManagedClusterName.ManagedClusterLabels、および .PolicyMetadata を使用できます。.ManagedClusterName は、ポリシーが伝播されるターゲットクラスターの名前に解決されます。.ManagedClusterLabels は、ポリシーが伝播されるマネージドクラスターのラベルのキーと値のマップに解決されます。.PolicyMetadata は、ルートポリシーの値を持つ namenamespacelabels、および annotations キーを持つマップに解決されます。

ConfigurationPolicy リソースの場合、コンテキスト変数 .ObjectName.ObjectNamespace、および .ObjectobjectDefinition 内で使用できます。オブジェクトがクラスタースコープでない場合、ObjectNamespace は、指定した spec.namespaceSelector または metadata.namespace から選択された namespace の名前に解決されます。.ObjectName は、指定した objectSelector または metadata.name からのオブジェクトの名前に解決されます。.Object は、現在クラスター上にある完全な状態のターゲットオブジェクトです。

アクセス制御

デフォルトでは、Policy オブジェクトおよびポリシーが伝播されるクラスターの ManagedCluster オブジェクトと同じ namespace にある、namespace に属する Kubernetes リソースのみを参照できます。

または、Policy オブジェクトの spec.hubTemplateOptions.serviceAccountName フィールドを、Policy リソースと同じ namespace 内のサービスアカウントに指定することもできます。フィールドを指定すると、すべてのハブクラスターテンプレートの検索にサービスアカウントが使用されます。

注記: サービスアカウントには、ハブクラスターテンプレートで検索されるすべてのリソースに対する list および watch 権限が必要です。

クラスターの任意のリソースを参照できます。

関数

Kubernetes リソースおよび文字列操作への動的なアクセスをサポートするテンプレート関数のセット。詳細は、Template functions を参照してください。検索制限は、アクセス制御の行を参照してください。

ハブクラスターの fromSecret テンプレート機能は、結果の値をマネージドクラスターの namespace に複製されたポリシーで暗号化された文字列として保存します。

同等の呼び出しは、次の構文を使用する場合があります: {{hub "(lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}

テンプレート関数セットは、Kubernetes リソースおよび文字列操作への動的なアクセスをサポートします。詳細は、Template functions を参照してください。

関数出力ストレージ

テンプレート関数の出力は、マネージドクラスターに同期される前に、マネージドクラスターで適用可能な各マネージドクラスター namespace の Policy resource オブジェクトに保存されます。つまり、テンプレート関数からの機密結果は、ハブクラスター上の Policy リソースオブジェクトへの読み取りアクセス権を持つユーザー、およびマネージドクラスター上の ConfigurationPolicy または OperatorPolicy リソースオブジェクトへの読み取りアクセス権を持つユーザーによって読み取ることができます。さらに、etcd 暗号化が有効になっている場合が、ポリシーリソースオブジェクトが暗号化されません。機密な情報の出力を返すテンプレート関数 (シークレットなど) を使用する場合には、この点を慎重に検討することが推奨されます。

テンプレート関数の出力は、ポリシー関連のリソースオブジェクトには保存されません。

処理

複製されたポリシーのクラスターへの伝播中に、ハブクラスターのランタイムで処理が発生します。ポリシーと、そのポリシー内にあるハブクラスターのテンプレートは、テンプレートの作成時または更新時にのみハブクラスターで処理されます。

処理はマネージドクラスターで実行されます。設定ポリシーは定期的に処理され、参照されるリソースのデータを使用して解決されたオブジェクト定義を自動的に更新します。参照されているリソースが変更されるたびに、Operator ポリシーが自動的に更新されます。

エラーの処理

ハブクラスターテンプレートからのエラーは、ポリシーの適用先のマネージドクラスターの違反として表示されます。

マネージドクラスターテンプレートからのエラーは、違反が発生した特定のターゲットクラスターの違反として表示されます。

次のトピックを引き続きお読みください。

1.2.2. テンプレート関数

{{hub … hub}} 区切り文字を使用してハブクラスター上のリソース固有および汎用テンプレート関数などの Kubernetes リソースを参照するか、{{ … }} 区切り文字を使用してマネージドクラスター上の Kubernetes リソースを参照します。利便性を高め、リソースのコンテンツへのアクセス性を高めるために、リソース固有の関数を使用できます。

1.2.2.1. テンプレート関数の説明

より高度な汎用関数 lookup を使用する場合は、検索されるリソースの YAML 構造をよく理解してください。これらの関数に加えて、base64encbase64decindentautoindenttoInttoBool などのユーティリティー関数も使用できます。

テンプレートを YAML 構文に準拠させるには、ポリシーリソース内のテンプレートを引用符またはブロック文字 (| または >) を使用して文字列として定義する必要があります。これにより、解決済みのテンプレート値も文字列になります。これをオーバーライドするには、テンプレートの最後の関数として toInt または toBool を使用して、値をそれぞれ整数またはブール値として強制的に解釈するさらなる処理を開始します。

サポート対象のカスタムテンプレート関数の説明と例を確認するには、以下を参照してください。

1.2.2.1.1. fromSecret

fromSecret 関数は、シークレット内にある指定のデータキーの値を返します。関数は、以下の構文を確認してください。

func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
Copy to Clipboard Toggle word wrap

この関数を使用するには、Kubernetes Secret リソースの namespace、名前、およびデータキーを入力します。ハブクラスターテンプレートの関数を使用する場合は、ポリシーに使用されるのと同じ namespace を使用する必要があります。詳細は、Template processing を参照してください。

以下で、ターゲットクラスターで Secret リソースを有効にする設定ポリシーを確認します。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      apiVersion: v1
      kind: Secret 
1

      metadata:
        name: demosecret
        namespace: test
      type: Opaque
      data: 
2

        USER_NAME: YWRtaW4=
        PASSWORD: '{{ fromSecret "default" "localsecret" "PASSWORD" }}' 
3
Copy to Clipboard Toggle word wrap
1
Kubernetes Secret がターゲットクラスターに存在しない場合は、ポリシー違反が表示されます。データキーがターゲットクラスターに存在しない場合は、値が空の文字列になります。
2
ハブクラスターテンプレートで fromSecret 関数を使用すると、出力が protect 関数を使用して自動的に暗号化され、マネージドクラスターへの送信中に値が保護されます。
3
PASSWORD データキーの値は、ターゲットクラスターのシークレットを参照するテンプレートを指します。

重要: 証明書などの複数行の文字列値を追加する場合は、改行を処理するために、テンプレートパイプラインの最後に常に | toRawJson | toLiteral 構文を追加します。たとえば、Secret リソースから証明書をコピーして ConfigMap リソースに含めると、テンプレートパイプラインは次の構文のようになります。

ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt"  | base64dec | toRawJson | toLiteral }}'
Copy to Clipboard Toggle word wrap
  • toRawJson テンプレート関数は、YAML 構造に影響を与えないように改行をエスケープした入力値を JSON 文字列に変換します。
  • toLiteral テンプレート関数は、出力から外側の単一引用符を削除します。たとえば、テンプレートが key: '{{ 'hello\nworld' | toRawJson }}' テンプレートパイプラインに対して処理されると、出力は key: '"hello\nworld"' になります。key: '{{ 'hello\nworld' | toRawJson | toLiteral }}' テンプレートパイプラインの出力は、key: "hello\nworld" です。
1.2.2.1.2. fromConfigmap

fromConfigMap 関数は、config map 内にある指定のデータキーの値を返します。この関数を使用するには、Kubernetes ConfigMap リソースの namespace、名前、およびデータキーを入力します。ハブクラスターテンプレートの関数を使用するポリシーに使用されるのと同じ namespace を使用する必要があります。詳細は、Template processing を参照してください。

関数は、以下の構文を確認してください。

func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)
Copy to Clipboard Toggle word wrap

以下で、ターゲットのマネージドクラスターで Kubernetes リソースを有効にする設定ポリシーを表示します。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromcm-lookup
spec:
  object-templates:
  - objectDefinition:
      ...
      data: 
1

        app-name: sampleApp
        app-description: "this is a sample app"
        log-file: '{{ fromConfigMap "default" "logs-config" "log-file" }}' 
2

        log-level: '{{ fromConfigMap "default" "logs-config" "log-level" }}' 
3
Copy to Clipboard Toggle word wrap
1
data キーがターゲットクラスターに存在しない場合は、値が空の文字列になります。
2
log-file テンプレートの値は、default namespace の logs-config ConfigMap から log-file データキーの値を取得します。
3
log-level テンプレート値は、default namespace の logs-config ConfigMap から log-level データキーの値を取得します。
1.2.2.1.3. fromClusterClaim

fromClusterClaim 関数は、ClusterClaim リソースの Spec.Value の値を返します。関数は、以下の構文を確認してください。

func fromClusterClaim (clusterclaimName string) (dataValue string, err Error)
Copy to Clipboard Toggle word wrap

以下で、ターゲットのマネージドクラスターで Kubernetes リソースを有効にする設定ポリシーの例を確認してください。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-clusterclaims 
1

spec:
  object-templates:
  - objectDefinition:
      ...
      data: 
2

        platform: '{{ fromClusterClaim "platform.open-cluster-management.io" }}' 
3

        product: '{{ fromClusterClaim "product.open-cluster-management.io" }}'
        version: '{{ fromClusterClaim "version.openshift.io" }}'
Copy to Clipboard Toggle word wrap
1
この関数を使用する場合は、Kubernetes ClusterClaim リソースの名前を入力します。ClusterClaim リソースが存在しない場合は、ポリシー違反が表示されます。
2
設定値はキー値プロパティーとして設定できます。
3
platform データキーの値は、platform.open-cluster-management.io クラスター要求の値を取得するテンプレートです。同様に、ClusterClaim リソースから productversion の値を取得します。
1.2.2.1.4. lookup

lookup 関数は、JSON と互換性のあるマップとして Kubernetes リソースを返します。この関数を使用する場合は、Kubernetes リソースの API バージョン、種類、namespace、名前、およびオプションのラベルセレクターを入力します。ハブクラスターテンプレート内のポリシーに使用されるものと同じ namespace を使用する必要があります。詳細は、Template processing を参照してください。

要求されたリソースが存在しない場合は、空のマップが返されます。リソースが存在せず、値が別のテンプレート関数に提供されている場合は、エラー invalid value; expected string が発生する可能性があります。

注記: default テンプレート関数を使用して、後のテンプレート関数に正しい型が提供されるようにします。Sprig open source セクションを参照してください。

関数は、以下の構文を確認してください。

func lookup (apiversion string, kind string, namespace string, name string, labelselector ...string) (value string, err Error)
Copy to Clipboard Toggle word wrap

ラベルセレクターの例は、Additional resources セクションにある Kubernetes labels and selectors ドキュメントへのリファレンスを参照してください。以下で、ターゲットのマネージドクラスターで Kubernetes リソースを有効にする設定ポリシーの例を確認してください。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-lookup
spec:
  object-templates:
  - objectDefinition:
      ...
      data: 
1

        app-name: sampleApp
        app-description: "this is a sample app"
        metrics-url: >- 
2

          http://{{ (lookup "v1" "Service" "default" "metrics").spec.clusterIP }}:8080
Copy to Clipboard Toggle word wrap
1
設定値はキー値プロパティーとして設定できます。
2
metrics-url データキーの値は、default namespace から v1/Service Kubernetes リソースの metrics を取得するテンプレートであり、取得対象のリソースにある spec.clusterIP の値に設定されます。
1.2.2.1.5. base64enc

base64enc 関数は、入力 data stringbase64 でエンコードされた値で返します。この関数を使用する場合は、文字列値を入力します。関数は、以下の構文を確認してください。

func base64enc (data string) (enc-data string)
Copy to Clipboard Toggle word wrap

以下は、base64enc 関数を使用する設定ポリシーの例になります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        USER_NAME: >-
          {{ fromConfigMap "default" "myconfigmap" "admin-user" | base64enc }}
Copy to Clipboard Toggle word wrap
1.2.2.1.6. base64dec

base64dec 関数は、入力 enc-data stringbase64 デコードされた値で返します。この関数を使用する場合は、文字列値を入力します。関数は、以下の構文を確認してください。

func base64dec (enc-data string) (data string)
Copy to Clipboard Toggle word wrap

以下は、base64dec 関数を使用する設定ポリシーの例になります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        app-name: >-
          {{ ( lookup "v1"  "Secret" "testns" "mytestsecret") .data.appname ) | base64dec }}
Copy to Clipboard Toggle word wrap
1.2.2.1.7. indent

indent 関数により、パディングされた data string が返されます。この関数を使用する場合は、特定のスペース数でデータ文字列を入力します。関数は、以下の構文を確認してください。

func indent (spaces  int,  data string) (padded-data string)
Copy to Clipboard Toggle word wrap

以下は、indent 関数を使用する設定ポリシーの例になります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        Ca-cert: >-
          {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | indent 4  }}
Copy to Clipboard Toggle word wrap
1.2.2.1.8. autoindent

autoindent 関数は、indent 関数のように機能し、テンプレートの前のスペース数に基づいて自動的に先頭のスペース数を決定します。

以下は、autoindent 関数を使用する設定ポリシーの例になります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        Ca-cert: >-
          {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | autoindent }}
Copy to Clipboard Toggle word wrap
1.2.2.1.9. toInt

toInt 関数は入力値の整数値をキャストして返します。テンプレートの最後の関数である場合は、ソースコンテンツがさらに処理されます。これは、YAML で値が整数として解釈されるようにするためです。この関数を使用する場合は、整数としてキャストする必要があるデータを入力します。関数は、以下の構文を確認してください。

func toInt (input interface{}) (output int)
Copy to Clipboard Toggle word wrap

以下は、toInt 関数を使用する設定ポリシーの例になります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      spec:
        vlanid: >-
          {{ (fromConfigMap "site-config" "site1" "vlan")  | toInt }}
Copy to Clipboard Toggle word wrap
1.2.2.1.10. toBool

toBool 関数は、入力文字列をブール値に変換し、ブール値を返します。テンプレートの最後の関数である場合は、ソースコンテンツがさらに処理されます。これは、YAML で値がブール値として解釈されるようにするためです。この関数を使用する場合は、ブール値に変換する必要のある文字列データを入力します。関数は、以下の構文を確認してください。

func toBool (input string) (output bool)
Copy to Clipboard Toggle word wrap

以下は、toBool 関数を使用する設定ポリシーの例になります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      spec:
        enabled: >-
          {{ (fromConfigMap "site-config" "site1" "enabled")  | toBool }}
Copy to Clipboard Toggle word wrap
1.2.2.1.11. fromYaml

fromYaml または fromYAML 関数は、YAML 文字列を Golang オブジェクトにパースします。この関数は、YAML 文字列値を持つ ConfigMap リソースで使用できます。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      spec:
        replicas: >-
          {{ (fromConfigMap "default" "app-config" "config.yaml") | fromYaml | index "replicas" }}
Copy to Clipboard Toggle word wrap
1.2.2.1.12. toYaml

toYaml または toYAML 関数は、Golang オブジェクトを YAML 文字列にパースします。複数行の結果を適切にインデントするには、出力を autoindent 関数 または indent 関数のいずれかに渡す必要があります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        config.yaml: |
          {{ dict "key1" "value1" "key2" "value2" | toYaml | autoindent }}
Copy to Clipboard Toggle word wrap
1.2.2.1.13. protect

protect 機能により、ハブクラスターポリシーテンプレートで文字列を暗号化できます。これは、ポリシーの評価時にマネージドクラスターで自動的に復号化されます。以下は、protect 関数を使用する設定ポリシーの例になります。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
    ...
    spec:
      enabled: >-
        {{hub (lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}
Copy to Clipboard Toggle word wrap

前述の 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 アノテーションを削除します。その後、ポリシーが再処理され、新しい暗号化キーが使用されます。

1.2.2.1.14. toLiteral

toLiteral 関数は、処理後にテンプレート文字列を囲む引用符をすべて削除します。この関数を使用して、JSON 文字列を config map フィールドからマニフェストの JSON 値に変換できます。次の関数を実行して、key パラメーター値から引用符を削除します。

key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'
Copy to Clipboard Toggle word wrap

toLiteral 関数を使用すると、次の更新が表示されます。

key: ["10.10.10.10", "1.1.1.1"]
Copy to Clipboard Toggle word wrap
1.2.2.1.15. copySecretData

copySecretData 関数は、指定されたシークレットのすべての data コンテンツをコピーします。次の関数のサンプルを確認してください。

...
objectDefinition:
  apiVersion: v1
  kind: Secret
  metadata:
    name: my-secret-copy
  data: '{{ copySecretData "default" "my-secret" }}' 
1
Copy to Clipboard Toggle word wrap
1
この関数をハブクラスターテンプレートで使用すると、保護関数 を使用して出力が自動的に暗号化されます。
1.2.2.1.16. copyConfigMapData

copyConfigMapData 関数は、指定された config map のすべての data コンテンツをコピーします。次の関数のサンプルを確認してください。

...
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: my-secret-copy
  data: '{{ copyConfigMapData "default" "my-configmap" }}'
Copy to Clipboard Toggle word wrap
1.2.2.1.17. getNodesWithExactRoles

getNodesWithExactRoles 関数は、指定したロールのみを持つノードのリストを返し、node-role.kubernetes.io/worker ロール以外の追加のロールを持つノードは無視します。"infra" ノードを選択し、ストレージノードを無視する次のサンプル関数を表示します。

...
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: my-configmap
    data:
      infraNode: |
        {{- range $i,$nd := (getNodesWithExactRoles "infra").items }}
        node{{ $i }}: {{ $nd.metadata.name }}
        {{- end }}
      replicas: {{ len ((getNodesWithExactRoles "infra").items) | toInt }}
Copy to Clipboard Toggle word wrap
1.2.2.1.18. hasNodesWithExactRoles

hasNodesWithExactRoles 関数は、クラスターに指定したロールのみを持つノードが含まれている場合に true 値を返し、node-role.kubernetes.io/worker ロール以外の追加ロールを持つノードを無視します。次の関数のサンプルを確認してください。

...
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: my-configmap
  data:
    key: '{{ hasNodesWithExactRoles "infra" }}'
Copy to Clipboard Toggle word wrap
1.2.2.1.19. skipObject

skipObject 関数は、ConfigurationPolicy リソース内のマネージドクラスターテンプレートでのみ使用できます。Go テンプレート内で任意の時点で {{ skipObject }} を呼び出すと、ポリシーの特定のオブジェクトをスキップするように指示されます。skipObjectobjectSelector とともに使用すると、名前で選択したオブジェクトをさらにフィルタリングできます。条件文内で skipObject を単独で呼び出すことも、オプションのブール引数を使用して呼び出すこともできます。

次の例を参照してください。この例では、foo: bar というラベルを持つオブジェクトが選択されますが、名前に -prod という接尾辞が付いているオブジェクトはスキップされます。

...
objectSelector:
  matchExpressions:
  - key: foo
    operator: In
    values:
    - bar
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  data:
    key: '{{ skipObject (hasSuffix "-prod" .ObjectName) }}{{ hasNodesWithExactRoles "infra" }}'
Copy to Clipboard Toggle word wrap
1.2.2.1.20. Sprig オープンソース

さらに、Red Hat Advanced Cluster Management は、sprig オープンソースプロジェクトに含まれる以下のテンプレート関数をサポートします。

Expand
表1.5 サポートされているコミュニティーの Sprig 関数の表
Sprig ライブラリー関数

Cryptographic and security

htpasswd

Date

date, mustToDate, now, toDate

Default

default, empty, fromJson, mustFromJson, ternary, toJson, toRawJson, mustToRawJson

リストされている Json 関数は、同等の大文字 JSON 関数のエイリアスも設定されています。

Dictionaries and dict

dict, dig, get, hasKey, keys, merge, mustMerge, set, unset, values

Encoding

b64dec, b64enc

Flow control

fail

Integer math

add, mul, div, round, sub

Integer slice

until, untilStep,

Lists

append, has, list, mustAppend, mustHas, mustPrepend, mustSlice, prepend, slice

String lists

concat, join, sortAlpha, split, splitn, splitList

Strings

cat, contains, hasPrefix, hasSuffix, lower, mustRegexFind, mustRegexFindAll, mustRegexMatch, quote, regexFind, regexFindAll, regexMatch, regexQuoteMeta, replace, substr, trim, trimAll, trunc, upper

Version comparison

semver, semverCompare

1.2.2.2. 関連情報

1.2.3. ポリシーでの高度なテンプレート処理の使用

マネージドクラスターとハブクラスターの両方のテンプレートを使用すると、ターゲットクラスターごとに個別のポリシーを作成したり、ポリシー定義で設定値をハードコードしたりする必要性が軽減されます。セキュリティーを確保するには、ハブクラスターテンプレートのリソース固有および一般的なルックアップ機能の両方が、ハブクラスターのポリシーの namespace に制限されます。

重要: ハブクラスターテンプレートを使用して機密データやその他の機密データを伝播すると、ハブクラスター上のマネージドクラスターの namespace と、そのポリシーが配布されているマネージドクラスターで機密データが漏洩する原因になります。テンプレートの内容はポリシーで拡張され、ポリシーは OpenShift Container Platform ETCD 暗号化サポートでは暗号化されません。これに対処するには、fromSecret または copySecretData を使用して、シークレットの値を自動的に暗号化するか、他の値を暗号化するための protect を使用します。

高度なテンプレートの使用例は、引き続きお読みください。

1.2.3.1. 再処理のための特別なアノテーション

ハブクラスターテンプレートは、ポリシーの作成中、または参照されたリソースが更新されたときに、参照されたリソースのデータに解決されます。

更新を手動で開始する必要がある場合は、特別なアノテーション policy.open-cluster-management.io/trigger-update を使用して、テンプレートによって参照されるデータの変更を示します。特別なアノテーション値を変更すると、テンプレート処理が自動的に開始されます。さらに、参照されたリソースの最新のコンテンツが読み取られ、ポリシー定義で更新されます。ポリシー定義は、マネージドクラスターでの処理のために伝達されます。このアノテーションを使用する方法の 1 つは、値を毎回 1 ずつインクリメントすることです。

1.2.3.2. テンプレート処理の回避

デフォルトでは、Red Hat Advanced Cluster Management はすべての Go テンプレートを処理します。場合によっては、ユーザーは Red Hat Advanced Cluster Management による処理を想定していない policy-templates 内のポリシーを含むポリシーを作成することがあります。特定のテンプレートのテンプレート処理を回避するには、{{ template content }}+{{ `{{ template content }} }}+` に変更します。変更すると、テンプレートが、後続のテンプレーティングエンジンによって処理される raw 文字列を返します。

設定ポリシーのテンプレート解決を完全に回避する場合は、Policy リソースに含まれる関連する ConfigurationPolicypolicy.open-cluster-management.io/disable-templates: "true" アノテーションを追加します。

1.2.3.3. 設定ポリシーの objectSelector

ConfigurationPolicy を使用してラベルでフィルタリングされた多数のオブジェクトに対して反復処理を実行するには、objectSelector を使用し、objectDefinitionkind を指定します。objectSelectornamespaceSelector と似ていますが、名前フィルタリング機能がない点が異なります。名前でフィルタリングするには、Go テンプレート関数の skipObject を使用します。任意の時点で {{ skipObject }} を参照すると、ポリシーの objectSelector によって選択されたオブジェクトから、その特定のオブジェクトをスキップするように指示されます。

次の YAML サンプルを参照してください。この例では、foo: bar というラベルを持つオブジェクトが選択されますが、名前に -prod という接尾辞が付いているオブジェクトはスキップされます。

...
objectSelector:
  matchExpressions:
  - key: foo
    operator: In
    values:
    - bar
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  data:
    key: '{{ if (hasSuffix "-prod" .ObjectName) }}{{ skipObject }}{{ end }}{{ hasNodesWithExactRoles "infra" }}'
Copy to Clipboard Toggle word wrap

1.2.3.4. 設定ポリシーでの raw テンプレートの処理

object-template-raw パラメーターは、if 条件関数や range ループ関数などの高度なテンプレーティングユースケースをサポートするオプションのパラメーターです。object-templates-raw パラメーターは、Go テンプレートを含む文字列を受け入れます。Go テンプレートを使用する場合は、テンプレートを object-templates 配列にする必要があります。

たとえば、次の YAML サンプルを参照してください。この例では、name キーが Sea Otter である default namespace 内のすべての ConfigMap に、species-category: mammal ラベルが追加されます。

object-templates-raw: |
  {{- range (lookup "v1" "ConfigMap" "default" "").items }}
  {{- if eq .data.name "Sea Otter" }}
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: {{ .metadata.name }}
        namespace: {{ .metadata.namespace }}
        labels:
          species-category: mammal
  {{- end }}
  {{- end }}
Copy to Clipboard Toggle word wrap

注記: spec.object-templatesspec.object-templates-raw はオプションですが、2 つのパラメーターフィールドのいずれかを設定する必要があります。

高度なテンプレートを使用して、マネージドクラスターのインフラストラクチャー MachineSet オブジェクトを作成および設定する次のポリシーの例を参照してください。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: create-infra-machineset
spec:
  remediationAction: enforce
  severity: low
  object-templates-raw: |
    {{- /* Specify the parameters needed to create the MachineSet  */ -}}
    {{- $machineset_role := "infra" }}
    {{- $region := "ap-southeast-1" }}
    {{- $zones := list "ap-southeast-1a" "ap-southeast-1b" "ap-southeast-1c" }}
    {{- $infrastructure_id := (lookup "config.openshift.io/v1" "Infrastructure" "" "cluster").status.infrastructureName }}
    {{- $worker_ms := (index (lookup "machine.openshift.io/v1beta1" "MachineSet" "openshift-machine-api" "").items 0) }}
    {{- /* Generate the MachineSet for each zone as specified  */ -}}
    {{- range $zone := $zones }}
    - complianceType: musthave
      objectDefinition:
        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          labels:
            machine.openshift.io/cluster-api-cluster: {{ $infrastructure_id }}
          name: {{ $infrastructure_id }}-{{ $machineset_role }}-{{ $zone }}
          namespace: openshift-machine-api
        spec:
          replicas: 1
          selector:
            matchLabels:
              machine.openshift.io/cluster-api-cluster: {{ $infrastructure_id }}
              machine.openshift.io/cluster-api-machineset: {{ $infrastructure_id }}-{{ $machineset_role }}-{{ $zone }}
          template:
            metadata:
              labels:
                machine.openshift.io/cluster-api-cluster: {{ $infrastructure_id }}
                machine.openshift.io/cluster-api-machine-role: {{ $machineset_role }}
                machine.openshift.io/cluster-api-machine-type: {{ $machineset_role }}
                machine.openshift.io/cluster-api-machineset: {{ $infrastructure_id }}-{{ $machineset_role }}-{{ $zone }}
            spec:
              metadata:
                labels:
                  node-role.kubernetes.io/{{ $machineset_role }}: ""
              taints:
                - key: node-role.kubernetes.io/{{ $machineset_role }}
                  effect: NoSchedule
              providerSpec:
                value:
                  ami:
                    id: {{ $worker_ms.spec.template.spec.providerSpec.value.ami.id }}
                  apiVersion: awsproviderconfig.openshift.io/v1beta1
                  blockDevices:
                    - ebs:
                        encrypted: true
                        iops: 2000
                        kmsKey:
                          arn: ''
                        volumeSize: 500
                        volumeType: io1
                  credentialsSecret:
                    name: aws-cloud-credentials
                  deviceIndex: 0
                  instanceType: {{ $worker_ms.spec.template.spec.providerSpec.value.instanceType }}
                  iamInstanceProfile:
                    id: {{ $infrastructure_id }}-worker-profile
                  kind: AWSMachineProviderConfig
                  placement:
                    availabilityZone: {{ $zone }}
                    region: {{ $region }}
                  securityGroups:
                    - filters:
                        - name: tag:Name
                          values:
                            - {{ $infrastructure_id }}-worker-sg
                  subnet:
                    filters:
                      - name: tag:Name
                        values:
                          - {{ $infrastructure_id }}-private-{{ $zone }}
                  tags:
                    - name: kubernetes.io/cluster/{{ $infrastructure_id }}
                      value: owned
                  userDataSecret:
                    name: worker-user-data
    {{- end }}
Copy to Clipboard Toggle word wrap

1.2.3.5. 設定ポリシーを定義した後のハブテンプレートの解決

デフォルトでは、ConfigurationPolicy および OperatorPolicy リソースでハブテンプレートを使用する場合、ハブクラスターで定義されている Policy リソースをこれらのリソースに対応させる必要があります。

設定ポリシーはマネージドクラスター上で直接定義できます。たとえば、OpenShift GitOps を使用すると、マネージドクラスター上で直接設定ポリシーを定義できます。このような状況でマネージドクラスター上のハブテンプレートを解決するには、governance-standalone-hub-templating アドオンを有効にします。

governance-standalone-hub-templating アドオンを有効にするには、次の手順を実行します。

  1. ハブクラスターで、マネージドクラスターの namespace に移動します。
  2. 次の YAML サンプルを使用して、governance-standalone-hub-templating という名前の ManagedClusterAddOn リソースを作成します。

    apiVersion: addon.open-cluster-management.io/v1alpha1
    kind: ManagedClusterAddOn
    metadata:
      name: governance-standalone-hub-templating
      namespace: <cluster name>
      labels:
        cluster.open-cluster-management.io/backup: ''
    spec:
      installNamespace: open-cluster-management-agent-addon
    Copy to Clipboard Toggle word wrap

デフォルトでは、マネージドクラスター上のエージェントは、ハブクラスター上の ManagedCluster リソースにのみアクセスできます。マネージドクラスターに直接デプロイされる ConfigurationPolicies 内のハブクラスターテンプレートで、.ManagedClusterLabels テンプレート変数を使用できます。

ハブテンプレートが、lookup 関数や fromConfigMap 関数の呼び出しなど、他のリソースにアクセスできるようにするには、その特定の権限をアドオングループに追加する必要があります。この権限は、RolesClusterRolesRoleBindingsClusterRoleBindings などのリソースを通じて追加できます。

アドオングループの名前は、マネージドクラスターの名前によって異なりますが、標準の形式は system:open-cluster-management:cluster:<cluster name>:addon:governance-standalone-hub-templating です。

ハブクラスターでマネージドクラスターの namespace 内にある Configmaps へのアクセスを許可するには、次の手順を実行します。

  1. 次のコマンドを実行して、Role リソースを追加します。

    oc create role -n <cluster name> cm-reader --verb=get,list,watch --resource=configmaps
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、Rolebinding を追加します。

    oc create rolebinding -n <cluster name> cm-reader-binding --role=cm-reader --group=system:open-cluster-management:cluster:<cluster name>:addon:governance-standalone-hub-templating
    Copy to Clipboard Toggle word wrap
  3. ハブクラスター上のこれらのリソースが確実にバックアップおよび復元されるように、作成した各リソースに cluster.open-cluster-management.io/backup ラベルを追加します。

これらのリソースを追加すると、アドオンがハブテンプレートを解決できるようになり、ポリシーの状態がマネージドクラスターのシークレットに保存されます。このシークレットは、ハブクラスターがマネージドクラスターで一時的に使用できなくなった場合に停止を防ぎます。

1.2.3.6. 関連情報

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat