4.5. 参照設定の高度なカスタマイズ
リファレンス設計からの一時的な逸脱を許可する場合は、より高度なカスタマイズを適用できます。
このカスタマイズでは、比較時に cluster-compare
プラグインが使用するデフォルトのマッチングプロセスをオーバーライドします。このような高度なカスタマイズを適用する場合は、cluster-compare から重要な情報が除外されるなど、意図しない結果が発生する可能性があるため、注意してください。
参照設定を動的にカスタマイズするための高度なタスクには、次のようなものがあります。
- 手動マッチング: クラスターのカスタムリソースを参照設定のテンプレートと手動でマッチするようにユーザー設定ファイルを設定します。
-
参照へのパッチ適用:
cluster-compare
コマンドでパッチオプションを使用して、参照にパッチを適用して参照設定を設定します。
4.5.1. CR とテンプレート間の手動マッチングの設定
cluster-compare
プラグインによるデフォルトのマッチングが期待どおりに機能しない場合は、カスタムリソース (CR) とテンプレートを手動でマッチできます。
たとえば、クラスター内に同じ apiversion
、kind
、name
、および namespace
フィールドを持つ CR が複数ある場合、プラグインによるデフォルトのマッチングでは、差異が最も少ない CR が比較されます。プラグインが選択する CR を制御するには、手動マッチング設定を含むユーザー設定 YAML ファイルを作成し、この設定ファイルを cluster-compare
コマンドに渡します。
手順
手動マッチングの条件を定義するユーザー設定ファイルを作成します。
user-config.yaml
ファイルの例correlationSettings: manualCorrelation: correlationPairs: apps.v1.DaemonSet.kube-system.kindnet.yaml: "template_example.yaml" 1
- 1
- マッチする CR とテンプレートのペアを指定します。CR 仕様では、
<apiversion>.<kind>.<namespace>.<name>
という形式を使用します。namespace を持たないクラスタースコープの CR の場合は、<apiversion>.<kind>.<name>
という形式を使用します。
次のコマンドを実行して、
cluster-compare
コマンドでユーザー設定ファイルを参照します。$ oc cluster-compare -r <path_to_reference_config>/metadata.yaml -c <path_to_user_config>/user-config.yaml 1
- 1
-c
オプションを使用してuser-config.yaml
ファイルを指定します。
4.5.2. 参照設定へのパッチ適用
場合によっては、予想されるクラスター設定の逸脱を処理するために、参照設定にパッチを適用する必要があります。パッチはプラグインによって比較プロセス中に適用され、指定されたリソースフィールドがパッチファイルの定義のとおりに変更されます。
たとえば、最新の参照設定では非推奨になっている古いフィールドをクラスターで使用しているため、テンプレートに一時的にパッチを適用する必要がある場合があります。パッチが適用されたファイルは、比較出力の概要に報告されます。
パッチファイルは次の 2 つの方法で作成できます。
-
cluster-compare
プラグインを使用してパッチ YAML ファイルを生成する。 - 独自のパッチファイルを作成する。
4.5.2.1. cluster-compare プラグインを使用したパッチの生成
cluster-compare
プラグインを使用して、特定のテンプレートファイル用のパッチを生成できます。プラグインは、クラスターのカスタムリソース (CR) と一致するようにテンプレートを調整します。パッチが適用されたテンプレートに含まれる以前に有効だった差異は報告されません。プラグインは、パッチが適用されたファイルを出力で強調表示します。
手順
次のコマンドを実行して、テンプレートのパッチを生成します。
$ oc cluster-compare -r <path_to_reference_config>/metadata.yaml -o 'generate-patches' --override-reason "A valid reason for the override" --generate-override-for "<template1_path>" --generate-override-for "<template2_path>" > <path_to_patches_file>
-
-r
は、参照設定の metadata.yaml ファイルへのパスを指定します。 -
-o
は、出力形式を指定します。パッチ出力を生成するには、generate-patches
値を使用する必要があります。 -
--override-reason
は、パッチの理由を説明します。 --generate-override-for
は、パッチが必要なテンプレートへのパスを指定します。注記metadata.yaml
ファイルを基準とした対象テンプレートのファイルパスを使用する必要があります。たとえば、metadata.yaml
ファイルのファイルパスが./compare/metadata.yaml
の場合、テンプレートの相対ファイルパスはoptional/my-template.yaml
です。-
<path_to_patches_file>
は、パッチのファイル名とパスを指定します。
-
オプション: 参照設定に適用する前にパッチファイルを確認します。
patch-config
ファイルの例- apiVersion: storage.k8s.io/v1 kind: StorageClass name: crc-csi-hostpath-provisioner patch: '{"provisioner":"kubevirt.io.hostpath-provisioner"}' 1 reason: A valid reason for the override templatePath: optional/local-storage-operator/StorageClass.yaml 2 type: mergepatch 3
次のコマンドを実行して、参照設定にパッチを適用します。
$ oc cluster-compare -r <referenceConfigurationDirectory> -p <path_to_patches_file>
-
-r
は、参照設定の metadata.yaml ファイルへのパスを指定します。 -p
は、パッチファイルへのパスを指定します。出力例
... Cluster CR: storage.k8s.io/v1_StorageClass_crc-csi-hostpath-provisioner Reference File: optional/local-storage-operator/StorageClass.yaml Description: Component description Diff Output: None Patched with patch Patch Reasons: - A valid reason for the override ... No CRs are unmatched to reference CRs Metadata Hash: bb2165004c496b32e0c8509428fb99c653c3cf4fba41196ea6821bd05c3083ab Cluster CRs with patches applied: 1
-
4.5.2.2. パッチファイルの手動作成
予想されるクラスター設定の逸脱を処理するためのパッチファイルを作成できます。
パッチの type
フィールドには、次の 3 つの値を指定できます。
-
mergepatch
- JSON を対象テンプレートにマージします。指定されていないフィールドは変更されません。 -
rfc6902
-add
、remove
、replace
、move
、およびcopy
操作を使用して、対象テンプレート内の JSON をマージします。各操作は特定のパスを対象とします。 -
go-template
- Golang テンプレートを定義します。プラグインがクラスターのカスタムリソース (CR) を入力として使用してテンプレートをレンダリングし、対象テンプレートのmergepatch
またはrfc6902
パッチのいずれかを生成します。
次の例は、3 つの異なる形式すべてを使用した同じパッチを示しています。
手順
ユースケースに合わせてパッチファイルを作成します。例として次の構造を使用します。
patch-config
の例- apiVersion: v1 1 kind: Namespace name: openshift-storage reason: known deviation templatePath: namespace.yaml type: mergepatch patch: '{"metadata":{"annotations":{"openshift.io/sa.scc.mcs":"s0:c29,c14","openshift.io/sa.scc.supplemental-groups":"1000840000/10000","openshift.io/sa.scc.uid-range":"1000840000/10000","reclaimspace.csiaddons.openshift.io/schedule":"@weekly","workload.openshift.io/allowed":null},"labels":{"kubernetes.io/metadata.name":"openshift-storage","olm.operatorgroup.uid/ffcf3f2d-3e37-4772-97bc-983cdfce128b":"","openshift.io/cluster-monitoring":"false","pod-security.kubernetes.io/audit":"privileged","pod-security.kubernetes.io/audit-version":"v1.24","pod-security.kubernetes.io/warn":"privileged","pod-security.kubernetes.io/warn-version":"v1.24","security.openshift.io/scc.podSecurityLabelSync":"true"}},"spec":{"finalizers":["kubernetes"]}}' - name: openshift-storage apiVersion: v1 kind: Namespace templatePath: namespace.yaml type: rfc6902 reason: known deviation patch: '[ {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.mcs", "value": "s0:c29,c14"}, {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.supplemental-groups", "value": "1000840000/10000"}, {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.uid-range", "value": "1000840000/10000"}, {"op": "add", "path": "/metadata/annotations/reclaimspace.csiaddons.openshift.io~1schedule", "value": "@weekly"}, {"op": "remove", "path": "/metadata/annotations/workload.openshift.io~1allowed"}, {"op": "add", "path": "/metadata/labels/kubernetes.io~1metadata.name", "value": "openshift-storage"}, {"op": "add", "path": "/metadata/labels/olm.operatorgroup.uid~1ffcf3f2d-3e37-4772-97bc-983cdfce128b", "value": ""}, {"op": "add", "path": "/metadata/labels/openshift.io~1cluster-monitoring", "value": "false"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit", "value": "privileged"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit-version", "value": "v1.24"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn", "value": "privileged"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn-version", "value": "v1.24"}, {"op": "add", "path": "/metadata/labels/security.openshift.io~1scc.podSecurityLabelSync", "value": "true"}, {"op": "add", "path": "/spec", "value": {"finalizers": ["kubernetes"]}} ]' - apiVersion: v1 kind: Namespace name: openshift-storage reason: "known deviation" templatePath: namespace.yaml type: go-template patch: | { "type": "rfc6902", "patch": '[ {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.mcs", "value": "s0:c29,c14"}, {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.supplemental-groups", "value": "1000840000/10000"}, {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.uid-range", "value": "1000840000/10000"}, {"op": "add", "path": "/metadata/annotations/reclaimspace.csiaddons.openshift.io~1schedule", "value": "@weekly"}, {"op": "remove", "path": "/metadata/annotations/workload.openshift.io~1allowed"}, {"op": "add", "path": "/metadata/labels/kubernetes.io~1metadata.name", "value": "openshift-storage"}, {"op": "add", "path": "/metadata/labels/olm.operatorgroup.uid~1ffcf3f2d-3e37-4772-97bc-983cdfce128b", "value": ""}, {"op": "add", "path": "/metadata/labels/openshift.io~1cluster-monitoring", "value": "false"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit", "value": "privileged"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit-version", "value": "v1.24"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn", "value": "privileged"}, {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn-version", "value": "v1.24"}, {"op": "add", "path": "/metadata/labels/security.openshift.io~1scc.podSecurityLabelSync", "value": "true"}, {"op": "add", "path": "/spec", "value": {"finalizers": {{ .spec.finalizers | toJson }} }} ]' }
- 1
- パッチは
kind
、apiVersion
、name
、およびnamespace
フィールドを使用して、パッチを正しいクラスター CR とマッチします。
次のコマンドを実行して、参照設定にパッチを適用します。
$ oc cluster-compare -r <referenceConfigurationDirectory> -p <path_to_patches_file>
-
-r
は、参照設定の metadata.yaml ファイルへのパスを指定します。 p
は、パッチファイルへのパスを指定します。出力例
... Cluster CR: storage.k8s.io/v1_StorageClass_crc-csi-hostpath-provisioner Reference File: namespace.yaml Description: Component description Diff Output: None Patched with patch Patch Reasons: - known deviation - known deviation - known deviation ... No CRs are unmatched to reference CRs Metadata Hash: bb2165004c496b32e0c8509428fb99c653c3cf4fba41196ea6821bd05c3083ab Cluster CRs with patches applied: 1
-