我开发了一个使用 CRD 的组件,它有两个版本 - v1 和 v2。可以根据 v1 定义创建 v2 资源,但不能以相反的方式完成。V2 只是删除了一些字段,因为它们不再需要了。我开发了一个网络挂钩来自动转换现有资源。转换在 crd 定义中定义如下:
conversion:
strategy: Webhook
webhook:
conversionReviewVersions: ["v1", "v2"]
clientConfig:
service:
namespace: fancy-project
name: conversion-webhook
path: /crdconvert
v2 版本定义为served
andstorage
而 v1 仅定义为served
. 当询问从 v1 到 v2 的转换时,我的转换 webhook 成功返回,但在发出从 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