復元中にリソースを変更する


このページでは、変換ルールを使用して、復元プロセス中に Kubernetes リソースを変更する方法について説明します。変換ルールは、置換ルールと呼ばれる以前の機能を改善することを目的としています。変換ルールには置換ルールとの下位互換性がないため、非推奨の置換ルール インターフェースは引き続き使用できます。

置換ルールのドキュメントは、復元中にリソースを変更するをご覧ください。

概要

復元プロセスの一部として Kubernetes リソースを変更したいと考える理由はいくつかあります。

  • 別のストレージ プロビジョナーを使用して PersistentVolumeClaim(PVC)を作成することもできます。たとえば、Kubernetes の in-tree ドライバから CSI ドライバに移行する場合です。

  • 別の名前で Namespace を復元する必要がある場合があります。

  • ラベルまたは ConfigMap キーに関連付けられている値を追加、変更、削除する場合もあります。

  • Deployment または StatefulSet でレプリカ数を変更する必要がある場合があります。

Backup for GKE には、変換ルールと呼ばれる変更を行うメカニズムが用意されており、必要に応じて RestorePlan の一部として定義できます。

復元プロセスでは、変換ルールは次のように機能します。

  1. ルールは順序付きリストにまとめられます。

  2. 変換を利用できない CustomResourceDefinition リソースを除くすべてのリソースが、このルールのリスト内で順番に復元されます。

  3. 各ルールに対して、簡単な説明や一致条件の追加、リソースの編集を行う必要があります。

  4. リソースがルールの条件に一致しない場合は、変更は行われず、リスト内の次のルールに移動します。

  5. リソースがルールの条件と一致する場合、リストの次のルールに移動する前に、ルールの編集がリソースに適用されます。

  6. 複数のルールが定義されている場合は、各ルールの一致条件が、以前のルールで変更されたリソースのバージョンと比較して評価されます。

  7. クラスタに、一致するルールの編集が適用されたリソースの最終バージョンが作成されます。

変換ルールのパラメータ

次の情報を指定して変換ルールを作成します。

  • description: 変換ルールの簡単な説明です。

  • resourceFilter: このフィルタは、リソースの照合に使用されます。resourceFilter が指定されていない場合、すべてのリソースがこのルールで照合されます。

  • fieldActions: resourceFilter に一致するリソースに対して行う編集のリスト。編集内容は、アクションの順序付きリストとして提供されます。ここでは順序が重要です。あるアクションの結果が、リスト内の次のアクションに影響する可能性があります。いずれかのアクションが失敗した場合は、復元全体が失敗します。

リソース フィルタ(resourceFilter

リソース フィルタを定義するには、次のパラメータを指定します。

パラメータ 必須 説明
namespaces 省略可 これは Namespace のリストです。このルールに一致するリソースは、Namespace 付きリソースであり、指定した Namespace のいずれかを付与されている必要があります。このパラメータに何も指定しないと、すべてのリソース(すべての名前空間付きリソースとクラスタ スコープのリソース)が一致します。
groupKinds 省略可 これは、Kubernetes リソースの Group/Kind タプルのリストです。
  • このパラメータに何も指定しないと、すべてのリソースが一致し、Group/Kind に基づく制限は適用されません。
  • 1 つ以上の Group/Kind が指定された場合、リソースがルールに一致するためには、指定された中のいずれか一つに一致する必要があります。
  • コアリソースを照合対象とするには、空("")のグループを使用します。
jsonPath 省略可 これは、リソースとの照合に使用される JSONPath 式です。

JSONPath(jsonPath

JSONPath 式は、リソースとの照合に使用されます。リソースに対して式の結果が空でない場合、このリソースは一致しているとみなされます。

次のようなリソースがあるとします。

YAML

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
  labels:
    app: mysql
    app.kubernetes.io/name: mysql
data:
  primary.cnf: |
    # Apply this config only on the primary.
    [mysqld]
    log-bin
  replica.cnf: |
    # Apply this config only on replicas.
    [mysqld]
    super-read-only

JSON

{
  "apiVersion": "v1",
  "kind": "ConfigMap",
  "metadata": {
    "name": "mysql-cm",
    "labels": {
      "app": "mysql",
      "app.kubernetes.io/name": "mysql"
    }
  },
  "data": {
    "primary.cnf": "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n",
    "replica.cnf": "# Apply this config only on replicas.\n[mysqld]\nsuper-read-only\n"
  }
}

JSONPath 式の使用例:

説明 結果
.metadata[?(@.name == 'mysql-cm')] metadata オブジェクトには name キーが含まれ、その値は「mysql-cm」です。 [
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]
.metadata.labels['app\.kubernetes\.io/name'] metadata.labels にあるキー「app.kubernetes.io/name」の文字列値 [
 "mysql"
]
.data['primary\.cnf'] data のキー「primary.cnf」のオブジェクト値 [
 "# Apply this config only on the primary.\n[mysqld]\nlog-bin\n"
]
.metadata[?(@.name =~ /^mysql-.*/i)] metadata オブジェクトには name キーが含まれ、その値は正規表現「/^mysql-.*/i」に一致します。
スラッシュ / は、正規表現パターンを区切るために使用します。正規表現の末尾にある i は、大文字と小文字を区別しない一致を示すフラグです。
[
 {
  "name": "mysql-cm",
  "labels": {
   "app": "mysql",
   "app.kubernetes.io/name": "mysql"
  }
 }
]

JSONPath 式の出力が空でない限り、対応するリソースはこのルールに一致します。したがって、.metadata[?(@.name == 'mysql-cm')].metadata[?(@.name == 'mysql-cm')].name は同じ結果となり、.metadata.name"mysql-cm" のリソースと一致します。

Google Cloud コンソールのマップのキーと一致させるために JSONPath でフィルタを使用する場合は、\(バックスラッシュ)を使用して .(ドット)をエスケープする必要があります。gcloud CLI または Terraform 言語を使用して YAML のコンテキストで JSONPath を指定する場合は、\\(二重バックスラッシュ)が必要です。たとえば、.metadata.labels['app\.kubernetes\.io/name'] は YAML または Terraform の .metadata.labels['app\\.kubernetes\\.io/name'] と同じです。

使用する前に、正規表現をサポートする JSONPath 評価ツールを使用して式をテストすることをおすすめします。kubectl を使用して JSONPath 式の結果を確認することもできます。その他の例については、JSONPath のサポートをご覧ください。

フィールド アクション(fieldActions

フィールド アクションは、JSON パッチに基づいてモデル化されます。JSON パッチは、JSON ドキュメントに適用するオペレーションを表現するための JSON ドキュメント構造を定義します。フィールド アクションを定義するには、次のパラメータが必要です。

  • path: これは、オペレーションが実行されるターゲット リソース内のロケーションを参照する JSON ポインタ値です。JSON ポインタは常に /(スラッシュ)で始まります。プロパティ名(キー)から派生される子要素は /(スラッシュ)によって区切られます。

  • op: リソースに対して実行されるオペレーションのタイプです。次の 5 つのオペレーションがサポートされています。

    • add は、path が参照する内容に応じて、指定された path に新しいオブジェクトまたは値を挿入します。
    • remove は、指定された path から値を削除します。
    • replace は、指定された path の値を新しい値に置き換えます。
    • move は、ロケーションから値を削除し、指定された path に追加します。
    • copy は、ロケーションから指定された path に値をコピーします。

各オペレーションの例は、次の Pod 定義を使用して確認できます。

YAML

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

JSON

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "nginx",
    "namespace": "ns",
    "labels": {
      "app": "nginx"
    }
  },
  "spec": {
    "containers": [
      {
        "name": "nginx",
        "image": "nginx:latest",
        "ports": [
          {
            "containerPort": 80
          }
        ],
        "env": [
          {
            "name": "PROTOCOL",
            "value": "https"
          }
        ],
        "resources": {
          "limits": {
            "cpu": "250m",
            "memory": "64Mi"
          }
        }
      }
    ],
    "initContainers": [
      {
        "name": "install",
        "image": "busybox:stable",
        "command": [
          "wget",
          "-O",
          "/tmp/index.html",
          "http://info.cern.ch"
        ]
      }
    ]
  }
}

追加

add オペレーションでは value が常に必須であり、有効な JSON 要素である必要があります。

次のアクションにより、値が "80" の新しい環境変数 "PORT"nginx コンテナに追加されます。

op: add
path: "/spec/containers/0/env/0"
value: >
  {
    "name": "PORT",
    "value": "80"
  }

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

変換後

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    - name: PORT  # newly added
      value: "80"  # newly added
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

次のアクションは、Pod の新しいラベル app.kubernetes.io/name: nginx に値を追加します。

op: add
path: "/metadata/labels/app.kubernetes.io~1name"
value: "nginx"

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

変換後

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
    app.kubernetes.io/name: nginx  # newly added
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

次のアクションは、nginx コンテナのイメージを置き換えて "nginx:latest" から "nginx:stable" に変更します。

op: add
path: "/spec/containers/0/image"
value: nginx:stable

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

変換後

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:stable  # replaced
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

削除

次のアクションは、nginx コンテナのリソース要件を削除します。

op: remove
path: "/spec/containers/0/resources"

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

変換後

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    # resource requirements are removed
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

置換

replace オペレーションには value が必要で、これが JSON 要素である必要があります。

次のアクションは、nginx コンテナのイメージを nginx:latest から nginx:stable に置き換えます。

op: replace
path: "/spec/containers/0/image"
value: nginx:stable

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

変換後

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:stable  # replaced
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

移動

move オペレーションには fromPath が必要です。

次のアクションでは、nginx コンテナから環境変数を削除し、install 初期コンテナに追加します。

op: move
fromPath: "/spec/containers/0/env"
path: "/spec/initContainers/0/env"

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

変換後

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    #  "env" is moved to "install" container
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch
    env:  # moved "from" nginx container
    - name: PROTOCOL
      value: https

コピー

copy オペレーションには fromPath が必要です。

次のアクションでは、環境変数を nginx コンテナから install 初期コンテナにコピーします。

op: copy
fromPath: "/spec/containers/0/env"
path: "/spec/initContainers/0/env"

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch

変換後

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: ns
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    env:
    - name: PROTOCOL
      value: "https"
    resources:
      limits:
        cpu: "250m"
        memory: "64Mi"
  initContainers:
  - name: install
    image: busybox:stable
    command:
    - wget
    - "-O"
    - "/tmp/index.html"
    - http://info.cern.ch
    env:  # copy from "nginx" container
    - name: PROTOCOL
      value: https

Google Cloud コンソールでの変換ルールの定義の詳細については、一連の復元を計画するをご覧ください。

gcloud CLI を使用して変換ルールを定義するには、transformationRules の YAML 配列を含むファイルを作成し、gcloud beta container backup-restore restore-plans create コマンドに --transformation-rules-file= パラメータを設定します。

変換ルールの例

次の例は、gcloud CLI または Terraform 構成言語で使用される YAML 形式で記載されています。

PVC の StorageClass を変更する

この例では、復元されたすべての PersistentVolumeClaim リソースの StorageClass を standard から premium-rwo に変更します。

YAML

transformationRules:
- description: Change StorageClass in PVC from standard to premium-rwo
  resourceFilter:
    namespaces: []
    jsonPath: ".spec[?(@.storageClassName == 'standard')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: PersistentVolumeClaim
  fieldActions:
  - op: REPLACE
    path: "/spec/storageClassName"
    value: "premium-rwo"

Terraform

transformation_rules {
  description = "Change StorageClass in PVC from standard to premium-rwo"
  resource_filter {
    json_path = ".spec[?(@.storageClassName == 'standard')]"
    group_kinds {
      resource_kind = "PersistentVolumeClaim"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/spec/storageClassName"
    value = "premium-rwo"
  }
}

Namespace のクローンを作成する

この例では、アルファ版からベータ版に Namespace のクローンを作成します。新しい Namespace "beta" を作成し、"alpha" のすべてのリソースを新しい "beta" Namespace に復元します。この例では、2 つの変換ルール(Namespace 自体に 1 つ、Namespace 内のリソースにもう 1 つ)が必要です。

YAML

transformationRules:
- description: Rename namespace name from alpha to beta
  resourceFilter:
    namespaces: []
    jsonPath: ".metadata[?(@.name == 'alpha')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: Namespace
  fieldActions:
  - op: REPLACE
    path: "/metadata/name"
    value: "beta"
- description: Clone all resources from namespace alpha to beta
  resourceFilter:
    namespaces: ["alpha"]
  fieldActions:
  - op: REPLACE
    path: "/metadata/namespace"
    value: "beta"

Terraform

transformation_rules {
  description = "Rename namespace name from alpha to beta"
  resource_filter {
    json_path = ".metadata[?(@.name == 'alpha')]"
    group_kinds {
      resource_kind = "Namespace"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/name"
    value = "beta"
  }
}
transformation_rules {
  description = "Clone all resources from namespace alpha to beta"
  resource_filter {
    namespaces = ["alpha"]
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/namespace"
    value = "beta"
  }
}

クローン作成された Namespace 内の PVC の StorageClass とレプリカ数を変更する

この例では、Namespace のクローンを作成し、新しい Namespace 内のリソースに一連の変更を適用します。

  • PVC の StorageClass を standard から premium-rwo に変更します

  • Deployment nginx のレプリカ数を 3 に変更します。

YAML

transformationRules:
- description: Rename the namespace from alpha to beta
  resourceFilter:
    namespaces: []
    jsonPath: ".metadata[?(@.name == 'alpha')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: Namespace
  fieldActions:
  - op: REPLACE
    path: "/metadata/name"
    value: "beta"
- description: Change all resources from namespace alpha to beta
  resourceFilter:
    namespaces: ["alpha"]
  fieldActions:
  - op: REPLACE
    path: "/metadata/namespace"
    value: "beta"
- description: Change the StorageClass on PVCs from standard to premium-rwo
  resourceFilter:
    namespaces: ["beta"]
    jsonPath: ".spec[?(@.storageClassName == 'standard')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: PersistentVolumeClaim
  fieldActions:
  - op: REPLACE
    path: "/spec/storageClassName"
    value: "premium-rwo"
- description: Change the replica count of the Deployment nginx from 7 to 3
  resourceFilter:
    namespaces: ["beta"]
    jsonPath: ".metadata[?(@.name == 'nginx')]"
    groupKinds:
    - resourceGroup: apps
      resourceKind: Deployment
  fieldActions:
  - op: REPLACE
    path: "/spec/replicas"
    value: "3"

Terraform

transformation_rules {
  description = "Rename the namespace from alpha to beta"
  resource_filter {
    json_path = ".metadata[?(@.name == 'alpha')]"
    group_kinds {
      resource_kind = "Namespace"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/name"
    value = "beta"
  }
}
transformation_rules {
  description = "Change all resources from namespace alpha to beta"
  resource_filter {
    namespaces = ["alpha"]
  }
  field_actions {
    op = "REPLACE"
    path = "/metadata/namespace"
    value = "beta"
  }
}
transformation_rules {
  description = "Change the StorageClass on PVCs from standard to premium-rwo"
  resource_filter {
    namespaces = ["beta"]
    json_path = ".spec[?(@.storageClassName == 'standard')]"
    group_kinds {
      resource_kind = "PersistentVolumeClaim"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/spec/storageClassName"
    value = "premium-rwo"
  }
}
transformation_rules {
  description = "Change the replica count of the Deployment nginx from 7 to 3"
  resource_filter {
    namespaces = ["beta"]
    json_path = ".metadata[?(@.name == 'nginx')]"
    group_kinds {
      resource_group = "apps"
      resource_kind = "Deployment"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/spec/replicas"
    value = "3"
  }
}

ConfigMap のエントリの変更、挿入、削除

この例では、Namespace "mysql" のラベルキー "app.kubernetes.io/name" を含む ConfigMap を次のように変更します。

  • エントリ "endpoint" の値を "192.0.2.127" に変更します。

  • 値が "30s" の新しいエントリ "connection-timeout" を挿入します。

  • キー "read-timeout" が含まれるエントリを削除します。

YAML

transformationRules:
- description: Change, insert, remove `ConfigMap` entres
  resourceFilter:
    namespaces: ["mysql"]
    jsonPath: ".metadata.labels['app\\.kubernetes\\.io/name']"
    groupKinds:
    - resourceGroup: ""
      resourceKind: ConfigMap
  fieldActions:
  - op: REPLACE
    path: "/data/endpoint"
    value: "192.0.2.127"
  - op: ADD
    path: "/data/connection-timeout"
    value: "30s"
  - op: REMOVE
    path: "/data/read-timeout"

Terraform

transformation_rules {
  description = "Change, insert, remove `ConfigMap` entres"
  resource_filter {
    namespaces = ["mysql"]
    json_path = ".metadata.labels['app\\.kubernetes\\.io/name']"
    group_kinds {
      resource_kind = "ConfigMap"
    }
  }
  field_actions {
    op = "REPLACE"
    path = "/data/endpoint"
    value = "192.0.2.127"
  }
  field_actions {
    op = "ADD"
    path = "/data/connection-timeout"
    value = "30s"
  }
  field_actions {
    op = "REMOVE"
    path = "/data/read-timeout"
  }
}

名前が mysql- で始まるリソースにラベル app.kubernetes.io/name を追加します。

この例では、名前が mysql- で始まるすべてのリソースに、値が mysql のラベル app.kubernetes.io/name を追加します。

YAML

transformationRules:
- description: Add a label to resources whose name starts with
  resourceFilter:
    namespaces: []
    jsonPath: ".metadata[?(@.name =~ /^mysql-.*/i)]"
  fieldActions:
  - op: ADD
    path: "/metadata/labels/app.kubernetes.io~1name"
    value: "mysql"

Terraform

transformation_rules {
  description = "Add a label to resources whose name starts with"
  resource_filter {
    json_path = ".metadata[?(@.name =~ /^mysql-.*/i)]"
  }
  field_actions {
    op = "ADD"
    path = "/metadata/labels/app.kubernetes.io~1name"
    value = "mysql"
  }
}

LoadBalancer タイプの Service に静的 IP アドレスを割り当てる

次の例では、Namespace "nginx" の Service "nginx-svc" に静的 IP アドレスを割り当てています。

YAML

transformationRules:
- description: Assign a static IP to Service nginx-svc
  resourceFilter:
    namespaces: ["nginx"]
    jsonPath: ".metadata[?(@.name == 'nginx-svc')]"
    groupKinds:
    - resourceGroup: ""
      resourceKind: Service
  fieldActions:
  - op: ADD
    path: "/spec/loadBalancerIP"
    value: "192.0.2.127"

Terraform

transformation_rules {
  description = "Assign a static IP to Service nginx-svc"
  resource_filter {
    namespaces = ["nginx"]
    json_path = ".metadata[?(@.name == 'nginx-svc')]"
    group_kinds {
      resource_kind = "Service"
    }
  }
  field_actions {
    op = "ADD"
    path = "/spec/loadBalancerIP"
    value = "192.0.2.127"
  }
}