Add v2 version to the existing v1 version and add a new field enable_log type of bool. When I update the CRD and create a v2 version of the CRD instance, the kubernetes API server prompts:
E0513 09:44:16.214607 1 fieldmanager. go: 155] “[SHOUD NOT HAPPEN] failed to update ManagedFields” err=”failed to update ManagedFields (web/app sample; buildcrd. k8s. example. io/v2, Kind=App): failed to convert new object:. spec. enable_pod: field not declared in schema” version Kind=”buildcrd. k8s. example. io/v2, Kind App namespace=web name=app sample.
What should I go check?I have tried many methods, but none of them work, and they all prompt the same error message.
kubernetes version: 1.28.1
kubebuilder version: 3.14.1
v1 spec:
// AppSpec defines the desired state of App
type AppSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
// Foo is an example field of App. Edit app_types.go to remove/update
EnableIngress bool `json:"enable_ingress,omitempty"`
EnableService bool `json:"enable_service"`
Replicas int32 `json:"replicas"`
Image string `json:"image"`
}
v2 spec:
// AppSpec defines the desired state of App
type AppSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
// Foo is an example field of App. Edit app_types.go to remove/update
EnableIngress bool `json:"enable_ingress,omitempty"`
EnableService bool `json:"enable_service"`
EnablePod bool `json:"enable_pod"`
Replicas int32 `json:"replicas"`
Image string `json:"image"`
}
CRD:
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.14.0
name: apps.buildcrd.k8s.example.io
spec:
group: buildcrd.k8s.example.io
names:
kind: App
listKind: AppList
plural: apps
singular: app
scope: Namespaced
versions:
- name: v1
schema:
openAPIV3Schema:
description: App is the Schema for the apps API
properties:
apiVersion:
description: |-
APIVersion defines the versioned schema of this representation of an object.
Servers should convert recognized schemas to the latest internal value, and
may reject unrecognized values.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
type: string
kind:
description: |-
Kind is a string value representing the REST resource this object represents.
Servers may infer this from the endpoint the client submits requests to.
Cannot be updated.
In CamelCase.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
type: string
metadata:
type: object
spec:
description: AppSpec defines the desired state of App
properties:
enable_ingress:
description: Foo is an example field of App. Edit app_types.go to
remove/update
type: boolean
enable_service:
type: boolean
image:
type: string
replicas:
format: int32
type: integer
required:
- enable_service
- image
- replicas
type: object
status:
description: AppStatus defines the observed state of App
properties:
conditions:
description: |-
INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
Important: Run "make" to regenerate code after modifying this file
items:
description: "Condition contains details for one aspect of the current
state of this API Resource.n---nThis struct is intended for
direct use as an array at the field path .status.conditions. For
example,nnnttype FooStatus struct{nt // Represents the
observations of a foo's current state.nt // Known .status.conditions.type
are: "Available", "Progressing", and "Degraded"nt //
+patchMergeKey=typent // +patchStrategy=mergent // +listType=mapnt
// +listMapKey=typent Conditions []metav1.Condition `json:"conditions,omitempty"
patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"`nnnt
// other fieldsnt}"
properties:
lastTransitionTime:
description: |-
lastTransitionTime is the last time the condition transitioned from one status to another.
This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
format: date-time
type: string
message:
description: |-
message is a human readable message indicating details about the transition.
This may be an empty string.
maxLength: 32768
type: string
observedGeneration:
description: |-
observedGeneration represents the .metadata.generation that the condition was set based upon.
For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
with respect to the current state of the instance.
format: int64
minimum: 0
type: integer
reason:
description: |-
reason contains a programmatic identifier indicating the reason for the condition's last transition.
Producers of specific condition types may define expected values and meanings for this field,
and whether the values are considered a guaranteed API.
The value should be a CamelCase string.
This field may not be empty.
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
type: string
status:
description: status of the condition, one of True, False, Unknown.
enum:
- "True"
- "False"
- Unknown
type: string
type:
description: |-
type of condition in CamelCase or in foo.example.com/CamelCase.
---
Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be
useful (see .node.status.conditions), the ability to deconflict is important.
The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
maxLength: 316
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
type: string
required:
- lastTransitionTime
- message
- reason
- status
- type
type: object
type: array
type: object
type: object
served: true
storage: true
subresources:
status: {}
- name: v2
schema:
openAPIV3Schema:
description: App is the Schema for the apps API
properties:
apiVersion:
description: |-
APIVersion defines the versioned schema of this representation of an object.
Servers should convert recognized schemas to the latest internal value, and
may reject unrecognized values.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
type: string
kind:
description: |-
Kind is a string value representing the REST resource this object represents.
Servers may infer this from the endpoint the client submits requests to.
Cannot be updated.
In CamelCase.
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
type: string
metadata:
type: object
spec:
description: AppSpec defines the desired state of App
properties:
enable_ingress:
description: Foo is an example field of App. Edit app_types.go to
remove/update
type: boolean
enable_pod:
type: boolean
enable_service:
type: boolean
image:
type: string
replicas:
format: int32
type: integer
required:
- enable_pod
- enable_service
- image
- replicas
type: object
status:
description: AppStatus defines the observed state of App
properties:
conditions:
items:
description: "Condition contains details for one aspect of the current
state of this API Resource.n---nThis struct is intended for
direct use as an array at the field path .status.conditions. For
example,nnnttype FooStatus struct{nt // Represents the
observations of a foo's current state.nt // Known .status.conditions.type
are: "Available", "Progressing", and "Degraded"nt //
+patchMergeKey=typent // +patchStrategy=mergent // +listType=mapnt
// +listMapKey=typent Conditions []metav1.Condition `json:"conditions,omitempty"
patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"`nnnt
// other fieldsnt}"
properties:
lastTransitionTime:
description: |-
lastTransitionTime is the last time the condition transitioned from one status to another.
This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
format: date-time
type: string
message:
description: |-
message is a human readable message indicating details about the transition.
This may be an empty string.
maxLength: 32768
type: string
observedGeneration:
description: |-
observedGeneration represents the .metadata.generation that the condition was set based upon.
For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
with respect to the current state of the instance.
format: int64
minimum: 0
type: integer
reason:
description: |-
reason contains a programmatic identifier indicating the reason for the condition's last transition.
Producers of specific condition types may define expected values and meanings for this field,
and whether the values are considered a guaranteed API.
The value should be a CamelCase string.
This field may not be empty.
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
type: string
status:
description: status of the condition, one of True, False, Unknown.
enum:
- "True"
- "False"
- Unknown
type: string
type:
description: |-
type of condition in CamelCase or in foo.example.com/CamelCase.
---
Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be
useful (see .node.status.conditions), the ability to deconflict is important.
The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
maxLength: 316
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
type: string
required:
- lastTransitionTime
- message
- reason
- status
- type
type: object
type: array
type: object
type: object
served: true
storage: false
subresources:
status: {}
v1 CR:
apiVersion: buildcrd.k8s.example.io/v1
kind: App
metadata:
labels:
app.kubernetes.io/name: kubebuild-go
app.kubernetes.io/managed-by: kustomize
name: app-sample
namespace: web
spec:
v2 CR:
apiVersion: buildcrd.k8s.example.io/v2
kind: App
metadata:
labels:
app.kubernetes.io/name: kubebuild-go
app.kubernetes.io/managed-by: kustomize
name: app-sample
namespace: web
spec:
# TODO(user): Add fields here
enable_pod: true
I have tried many methods, but none of them work, and they all prompt the same error message.