5.4. カスタムリソース定義 (CRD) アップグレードの安全性
クラスター拡張機能によって提供されるカスタムリソース定義 (CRD) を更新すると、Operator Lifecycle Manager (OLM) v1 は CRD アップグレードの安全性事前チェックを実行し、その CRD の以前のバージョンとの下位互換性を確保します。CRD 更新は、クラスター上で変更が進行する前にその検証に合格する必要があります。
5.4.1. 禁止されている CRD アップグレード変更 リンクのコピーリンクがクリップボードにコピーされました!
既存のカスタムリソース定義 (CRD) に対する次の変更は、CRD アップグレードの安全性事前チェックによって検出され、アップグレードが妨げられます。
- 既存の CRD バージョンに新しい必須フィールドを追加する
- 既存の CRD バージョンから既存フィールドを削除する
- 既存の CRD バージョンで既存のフィールドタイプを変更する
- 以前はデフォルト値がなかったフィールドに新しいデフォルト値を追加する
- フィールドのデフォルト値を変更する
- フィールドの既存のデフォルト値を削除する
- これまで列挙制限がなかった既存フィールドに新しい列挙制限を追加する
- 既存フィールドから既存の列挙値を削除する
- 既存バージョンで既存フィールドの最小値を増やす
- 既存バージョンで既存フィールドの最大値を減らす
- 以前は制約がなかったフィールドに、最小または最大のフィールド制約を追加する
最小値と最大値の変更に関するルールは、minimum
、minLength
、minProperties
、minItems
、maximum
、maxLength
、maxProperties
、および maxItems
の制約に適用されます。
既存の CRD に対する次の変更は、CRD アップグレードの安全性事前チェックによって報告され、アップグレードが防止されます。ただし、操作は技術的には Kubernetes API サーバーによって処理されます。
-
スコープを
Cluster
からNamespace
へ、またはNamespace
からクラスター
に変更する - 既存の保存された CRD バージョンを削除する
CRD アップグレード安全性事前チェックで禁止されているアップグレード変更のいずれかが検出されると、CRD アップグレードで検出された禁止されている変更ごとにエラーがログに記録されます。
CRD への変更が禁止されている変更カテゴリーのいずれにも該当せず、許可されている変更として適切に検出もされない場合、CRD アップグレードの安全性事前チェックによってアップグレードが防止され、"未知の変更" としてエラーがログに記録されます。
5.4.2. 許可された CRD アップグレード変更 リンクのコピーリンクがクリップボードにコピーされました!
既存のカスタムリソース定義 (CRD) に対する次の変更は、下位互換性の観点で安全であり、CRD アップグレードの安全性事前チェックによってアップグレードが停止されることはありません。
- フィールドで許可された列挙値のリストに新しい列挙値を追加する
- 既存バージョンで既存の必須フィールドをオプションフィールドに変更する
- 既存バージョンで既存フィールドの最小値を減らす
- 既存バージョンで既存フィールドの最大値を増やす
- 既存バージョンを変更せずに新規 CRD バージョンを追加する
5.4.3. CRD アップグレードの安全性プリフライトチェックを無効にする リンクのコピーリンクがクリップボードにコピーされました!
カスタムリソース定義 (CRD) アップグレードの安全性プリフライトチェックを無効にできます。CRD を提供する ClusterExtension
オブジェクトで、install.preflight.crdUpgradeSafety.enforcement
フィールドに None
の値を設定します。
CRD アップグレードの安全性事前チェックを無効にすると、保存されている CRD バージョンとの下位互換性が失われ、クラスターでその他の予期しない結果が発生する可能性があります。
個々のフィールド検証を無効にすることはできません。CRD アップグレードの安全性事前チェックを無効にすると、すべてのフィールド検証が無効になります。
Operator Lifecycle Manager (OLM) v1 で CRD アップグレード安全性プリフライトチェックを無効にしても、Kubernetes API サーバーは引き続き次の操作を防止します。
-
スコープを
Cluster
からNamespace
に、またはNamespace
からCluster
に変更する - 保存された既存の CRD バージョンを削除する
前提条件
- クラスター拡張機能がインストールされている。
手順
CRD の
ClusterExtension
オブジェクトを編集します。oc edit clusterextension <clusterextension_name>
$ oc edit clusterextension <clusterextension_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow install.preflight.crdUpgradeSafety.enforcement
フィールドをNone
に設定します。ClusterExtension
オブジェクトの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.4.4. 安全でない CRD 変更の例 リンクのコピーリンクがクリップボードにコピーされました!
次の例は、CRD アップグレードの安全性事前チェックで検出される、サンプルカスタムリソース定義 (CRD) のセクションに対する特定の変更を示しています。
次の例では、いかが変更前の CRD オブジェクトの状態であると想定します。
例5.19 CRD オブジェクトの例
5.4.4.1. スコープの変更 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、scope
フィールドが Namespaced
から Cluster
に変更されています。
例5.20 CRD におけるスコープ変更の例
例5.21 エラー出力の例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoScopeChange" validation failed: scope changed from "Namespaced" to "Cluster"
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoScopeChange" validation failed: scope changed from "Namespaced" to "Cluster"
5.4.4.2. 保存されたバージョンの削除 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、既存の保存バージョン v1alpha1
が削除されています。
例5.22 CRD で保存されたバージョンを削除した例
例5.23 エラー出力の例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoStoredVersionRemoved" validation failed: stored version "v1alpha1" removed
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoStoredVersionRemoved" validation failed: stored version "v1alpha1" removed
5.4.4.3. 既存フィールドの削除 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、pollInterval
プロパティーフィールドが v1alpha1
スキーマから削除されています。
例5.24 CRD の既存フィールドの削除例
例5.25 エラー出力の例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoExistingFieldRemoved" validation failed: crd/test.example.com version/v1alpha1 field/^.spec.pollInterval may not be removed
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoExistingFieldRemoved" validation failed: crd/test.example.com version/v1alpha1 field/^.spec.pollInterval may not be removed
5.4.4.4. 必須フィールドの追加 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、pollInterval
プロパティーが必須フィールドに変更されています。
例5.26 CRD に必須フィールドを追加する例
例5.27 エラー出力の例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "ChangeValidator" validation failed: version "v1alpha1", field "^": new required fields added: [pollInterval]
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "ChangeValidator" validation failed: version "v1alpha1", field "^": new required fields added: [pollInterval]