Должна ли миграция версий CRD работать в обоих направлениях?

#kubernetes #openshift #kubernetes-custom-resources

Вопрос:

Я разрабатываю компонент, который использует CRD и доступен в двух версиях — v1 и v2. Можно создать ресурс v2 на основе определения v1, но это нельзя сделать наоборот. V2 просто удаляет некоторые поля, так как они больше не требуются. Я разработал веб-хук для автоматического преобразования существующих ресурсов. Преобразование определяется следующим образом в определении crd:

 conversion:  strategy: Webhook  webhook:  conversionReviewVersions: ["v1", "v2"]  clientConfig:  service:  namespace: fancy-project  name: conversion-webhook  path: /crdconvert  

версия v2 определяется как served и storage тогда как v1 только как served . Мой веб-справочник по преобразованиям успешно возвращается, когда его запрашивают о преобразовании из 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, а затем пытается понизить его рейтинг? Должны ли версии CRD быть совместимы друг с другом?

Обратите внимание, что когда я разрешаю преобразование из v2 в v1 и использую некоторые фиктивные поля для заполнения определения, все начинает работать так, как ожидалось. Это означает, что ресурс v1 создается, а затем переносится в v2

Версия:

 Client Version: 4.6.32 Server Version: 4.6.32 Kubernetes Version: v1.19.0 d670f74