このページでは、変換ルールを使用して、復元プロセス中に Kubernetes リソースを変更する方法について説明します。変換ルールは、置換ルールと呼ばれる以前の機能を改善することを目的としています。変換ルールには置換ルールとの下位互換性がないため、非推奨の置換ルール インターフェースは引き続き使用できます。
置換ルールのドキュメントは、復元中にリソースを変更するをご覧ください。
概要
復元プロセスの一部として Kubernetes リソースを変更したいと考える理由はいくつかあります。
別のストレージ プロビジョナーを使用して PersistentVolumeClaim(PVC)を作成することもできます。たとえば、Kubernetes の in-tree ドライバから CSI ドライバに移行する場合です。
別の名前で Namespace を復元する必要がある場合があります。
ラベルまたは ConfigMap キーに関連付けられている値を追加、変更、削除する場合もあります。
Deployment または StatefulSet でレプリカ数を変更する必要がある場合があります。
Backup for GKE には、変換ルールと呼ばれる変更を行うメカニズムが用意されており、必要に応じて RestorePlan
の一部として定義できます。
復元プロセスでは、変換ルールは次のように機能します。
ルールは順序付きリストにまとめられます。
変換を利用できない
CustomResourceDefinition
リソースを除くすべてのリソースが、このルールのリスト内で順番に復元されます。各ルールに対して、簡単な説明や一致条件の追加、リソースの編集を行う必要があります。
リソースがルールの条件に一致しない場合は、変更は行われず、リスト内の次のルールに移動します。
リソースがルールの条件と一致する場合、リストの次のルールに移動する前に、ルールの編集がリソースに適用されます。
複数のルールが定義されている場合は、各ルールの一致条件が、以前のルールで変更されたリソースのバージョンと比較して評価されます。
クラスタに、一致するルールの編集が適用されたリソースの最終バージョンが作成されます。
変換ルールのパラメータ
次の情報を指定して変換ルールを作成します。
description
: 変換ルールの簡単な説明です。resourceFilter
: このフィルタは、リソースの照合に使用されます。resourceFilter
が指定されていない場合、すべてのリソースがこのルールで照合されます。fieldActions
:resourceFilter
に一致するリソースに対して行う編集のリスト。編集内容は、アクションの順序付きリストとして提供されます。ここでは順序が重要です。あるアクションの結果が、リスト内の次のアクションに影響する可能性があります。いずれかのアクションが失敗した場合は、復元全体が失敗します。
リソース フィルタ(resourceFilter
)
リソース フィルタを定義するには、次のパラメータを指定します。
パラメータ | 必須 | 説明 |
---|---|---|
namespaces |
省略可 | これは Namespace のリストです。このルールに一致するリソースは、Namespace 付きリソースであり、指定した Namespace のいずれかを付与されている必要があります。このパラメータに何も指定しないと、すべてのリソース(すべての名前空間付きリソースとクラスタ スコープのリソース)が一致します。 |
groupKinds |
省略可 |
これは、Kubernetes リソースの 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」です。 |
[ |
.metadata.labels['app\.kubernetes\.io/name'] |
metadata.labels にあるキー「app.kubernetes.io/name」の文字列値 |
[ |
.data['primary\.cnf'] |
data のキー「primary.cnf」のオブジェクト値 |
[ |
.metadata[?(@.name =~ /^mysql-.*/i)] |
metadata オブジェクトには name キーが含まれ、その値は正規表現「/^mysql-.*/i」に一致します。スラッシュ / は、正規表現パターンを区切るために使用します。正規表現の末尾にある i は、大文字と小文字を区別しない一致を示すフラグです。 |
[ |
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"
}
}