5.3. カスタムリソース定義 (CRD) アップグレードの安全性
Operator Lifecycle Manager (OLM) v1 はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
クラスター拡張機能によって提供されるカスタムリソース定義 (CRD) を更新すると、Operator Lifecycle Manager (OLM) v1 は CRD アップグレードの安全性事前チェックを実行し、その CRD の以前のバージョンとの下位互換性を確保します。CRD 更新は、クラスター上で変更が進行する前にその検証に合格する必要があります。
5.3.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.3.2. 許可された CRD アップグレード変更 リンクのコピーリンクがクリップボードにコピーされました!
既存のカスタムリソース定義 (CRD) に対する次の変更は、下位互換性の観点で安全であり、CRD アップグレードの安全性事前チェックによってアップグレードが停止されることはありません。
- フィールドで許可された列挙値のリストに新しい列挙値を追加する
- 既存バージョンで既存の必須フィールドをオプションフィールドに変更する
- 既存バージョンで既存フィールドの最小値を減らす
- 既存バージョンで既存フィールドの最大値を増やす
- 既存バージョンを変更せずに新規 CRD バージョンを追加する
5.3.3. CRD アップグレードの安全性事前チェックを無効にする リンクのコピーリンクがクリップボードにコピーされました!
カスタムリソース定義 (CRD) アップグレード安全性事前チェックは、CRD を提供する ClusterExtension
オブジェクトに、preflight.crdUpgradeSafety.disabled
フィールドを true
の値で追加することで無効にできます。
CRD アップグレードの安全性事前チェックを無効にすると、保存されている CRD バージョンとの下位互換性が失われ、クラスターでその他の予期しない結果が発生する可能性があります。
個々のフィールド検証を無効にすることはできません。CRD アップグレードの安全性事前チェックを無効にすると、すべてのフィールド検証が無効になります。
次のチェックは Kubernetes API サーバーによって処理されます。
-
スコープを
Cluster
からNamespace
へ、またはNamespace
からクラスター
に変更する - 既存の保存された CRD バージョンを削除する
Operator Lifecycle Manager (OLM) v1 を介して CRD アップグレードの安全性事前チェックを無効にした後も、これら 2 つの操作は Kubernetes によって引き続き防止されます。
前提条件
- クラスター拡張機能がインストールされている。
手順
CRD の
ClusterExtension
オブジェクトを編集します。oc edit clusterextension <clusterextension_name>
$ oc edit clusterextension <clusterextension_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow preflight.crdUpgradeSafety.disabled
フィールドをtrue
に設定します。例5.22
ClusterExtension
オブジェクトの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
true
に設定します。
5.3.4. 安全でない CRD 変更の例 リンクのコピーリンクがクリップボードにコピーされました!
次の例は、CRD アップグレードの安全性事前チェックで検出される、サンプルカスタムリソース定義 (CRD) のセクションに対する特定の変更を示しています。
次の例では、いかが変更前の CRD オブジェクトの状態であると想定します。
例5.23 CRD オブジェクトの例
5.3.4.1. スコープの変更 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、scope
フィールドが Namespaced
から Cluster
に変更されています。
例5.24 CRD におけるスコープ変更の例
例5.25 エラー出力の例
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.3.4.2. 保存されたバージョンの削除 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、既存の保存バージョン v1alpha1
が削除されています。
例5.26 CRD で保存されたバージョンを削除した例
例5.27 エラー出力の例
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.3.4.3. 既存フィールドの削除 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、pollInterval
プロパティーフィールドが v1alpha1
スキーマから削除されています。
例5.28 CRD の既存フィールドの削除例
例5.29 エラー出力の例
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.3.4.4. 必須フィールドの追加 リンクのコピーリンクがクリップボードにコピーされました!
次のカスタムリソース定義 (CRD) の例では、pollInterval
プロパティーが必須フィールドに変更されています。
例5.30 CRD に必須フィールドを追加する例
例5.31 エラー出力の例
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]