#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