1

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 バージョンは と として定義されますがservedstoragev1 は としてのみ定義され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
4

0 に答える 0