CRD を利用するコンポーネントを開発しており、v1 と v2 の 2 つのバージョンで利用できます。v1 の定義に基づいて v2 リソースを作成することはできますが、その逆はできません。V2 では、一部のフィールドが不要になったため削除されました。既存のリソースを自動的に変換する Web フックを開発しました。変換は、crd 定義で次のように定義されます。
conversion:
strategy: Webhook
webhook:
conversionReviewVersions: ["v1", "v2"]
clientConfig:
service:
namespace: fancy-project
name: conversion-webhook
path: /crdconvert
v2 バージョンは と として定義されますがserved
、storage
v1 は としてのみ定義されserved
ます。変換 Webhook は、v1 から v2 への変換についてクエリが実行されると成功を返しますが、v2 から v1 への変換の要求が行われると失敗します。v1 定義を使用して新しいリソースを作成しようとすると、from server for: "v1resource.yml": conversion webhook for component/v2, Kind=Proponent failed: Incompatible conversion
. ログで、Kubernetes が v2 から v1 に変換するために私のフックを照会し、その前に v1 から v2 への変換を要求したことを確認しました。v2 リソースの作成を直接発行すると、すべて正常に動作します。Kubernetes が最初にリソースを v2 に変換してからダウングレードしようとするのはなぜですか? crds のバージョンは互いに互換性がある必要がありますか?
v2 から v1 への変換を許可し、いくつかのダミー フィールドを使用して定義を埋めると、すべてが期待どおりに機能し始めることに注意してください。これは、v1 リソースが作成されてから v2 に移行されることを意味します
バージョン:
Client Version: 4.6.32
Server Version: 4.6.32
Kubernetes Version: v1.19.0+d670f74