java
java copied to clipboard
managedFields not populated since 22.0.0
Describe the bug
We are using some managed fields to provide information on Deployment objects on a custom dashboard. For this, we are getting a V1DeploymentList, like so:
public V1DeploymentList getKubernetesDeploymentList(String context) throws ApiException {
KubeConfig kubeConfig = this.kubernetesConfiguration.getKubeConfig();
AppsV1Api appsApi = new AppsV1Api(this.getApiClient(context));
return appsApi.listNamespacedDeployment(kubeConfig.getNamespace())
.labelSelector("app.kubernetes.io/name=our-base-chart")
.execute();
}
From this, we iterate over the V1Deployments, converting them to our representation (class Deployment):
public List<Deployment> getDeployments(String cluster) {
try {
V1DeploymentList deploymentList = this.getKubernetesDeploymentList(cluster);
List<Deployment> deployments = new ArrayList<>();
if (deploymentList != null) {
for (V1Deployment item : deploymentList.getItems()) {
deployments.add(DeploymentMapper.mapToDeployment(item));
}
}
return deployments;
} catch (ApiException e) {
log.error("Couldn't retrieve deployments.", e);
}
return Collections.emptyList();
}
To populate our object, we use:
public static Deployment mapToDeployment(V1Deployment v1deployment) {
Deployment deployment = new Deployment();
V1DeploymentSpec spec = Objects.requireNonNull(v1deployment.getSpec());
V1ObjectMeta metadata = Objects.requireNonNull(v1deployment.getMetadata());
List<V1ManagedFieldsEntry> managedFields = Objects.requireNonNull(metadata.getManagedFields());
log.debug("Managed Fields count: {}", managedFields.size());
String image = Objects.requireNonNull(spec.getTemplate().getSpec()).getContainers().get(0).getImage();
deployment.setName(metadata.getName());
deployment.setStatus(getDeploymentStatus(v1deployment));
deployment.setVersion(getVersionFromImage(image));
List<V1ManagedFieldsEntry> fleetFields = managedFields.stream()
.filter(field -> Objects.equals(field.getManager(), "fleetagent"))
.toList();
if (!fleetFields.isEmpty()) {
LocalDateTime lastUpdated = Objects.requireNonNull(fleetFields.getFirst().getTime()).atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime();
deployment.setLastUpdatedAt(lastUpdated.atZone(ZoneId.systemDefault()).toLocalDateTime());
}
deployment.setReplicas(spec.getReplicas());
return deployment;
}
Now, with client version 21.0.2 this works against Kubernetes 1.28.15 and 1.30.10. But with client version 22.0.0 onwards, this does not work anymore (against both Kubernetes versions), as the managed fields are empty, according to the log:
Managed Fields count: 3
vs
Managed Fields count: 0
As I couldn't find a changelog indicating this change in behavior, I'd assume this is unintentional. If it isn't, I'd find it very helpful if you could point me to the right location in the docs.
So far I have verified that the HTTP response from the API still contains the fields, and those are still present, when the JSON parsing occurs in https://github.com/kubernetes-client/java/blob/release-23/kubernetes/src/main/java/io/kubernetes/client/openapi/JSON.java#L791
Client Version
22.0.0, but still the case in 23.0.0. It worked in 21.0.2.
Kubernetes Version
1.30.10, but also v1.28.15
Java Version Temurin Java 21
To Reproduce
- Get V1DeploymentList for specific namespace
- Try to get values from getMetadata().getManagedFields()
Expected behavior I expect the managed fields to be populated just like in earlier releases.
Server:
- OS: Ubuntu Linux
- Platform: Rancher
We changed the code generator between 21 and 22, it's possible that led to the changed behavior.
Can you try 22.0.0-legacy and see if that works, that's still using the old code generator.
Hi, thanks for your time! 22.0.0-legacy shows the same behavior, the managed fields are still empty..
Hrm, I'm not sure the issue then. Can you attach the raw JSON that you get when you list deployments? You can use kubectl get deployments -o json
Sure, I filtered it a bit to include only one deployment, but I made sure this one deployment also exhibits the bug. I also had to replace some internal names. Also, kubectl need the flag --show-managed-fields to output those fields, but this seems to be a kubectl only thing, the api always returns them.
kubectl get deployment -o json --show-managed-fields -l app.kubernetes.io/instance=guestbook,de.company.internal/component=service
{
"apiVersion": "v1",
"items": [
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"annotations": {
"deployment.kubernetes.io/revision": "8",
"meta.helm.sh/release-name": "guestbook",
"meta.helm.sh/release-namespace": "internal-services-dev",
"objectset.rio.cattle.io/id": "default-fleet-internal-dev-internal-dev-guestbook"
},
"creationTimestamp": "2025-03-27T07:22:27Z",
"generation": 8,
"labels": {
"app.kubernetes.io/instance": "guestbook",
"app.kubernetes.io/managed-by": "Helm",
"app.kubernetes.io/name": "service-base",
"de.company.internal/component": "service",
"de.company.internal/service-version": "1.10.0",
"de.company.internal/test": "test",
"helm.sh/chart": "service-base-1.8.1",
"objectset.rio.cattle.io/hash": "7ace3baf8ec8ce4900cc66f3b00ac11bf10b5112"
},
"managedFields": [
{
"apiVersion": "apps/v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:annotations": {
".": {},
"f:meta.helm.sh/release-name": {},
"f:meta.helm.sh/release-namespace": {},
"f:objectset.rio.cattle.io/id": {}
},
"f:labels": {
".": {},
"f:app.kubernetes.io/instance": {},
"f:app.kubernetes.io/managed-by": {},
"f:app.kubernetes.io/name": {},
"f:de.company.internal/component": {},
"f:de.company.internal/service-version": {},
"f:helm.sh/chart": {},
"f:objectset.rio.cattle.io/hash": {}
}
},
"f:spec": {
"f:progressDeadlineSeconds": {},
"f:replicas": {},
"f:revisionHistoryLimit": {},
"f:selector": {},
"f:strategy": {
"f:rollingUpdate": {
".": {},
"f:maxSurge": {},
"f:maxUnavailable": {}
},
"f:type": {}
},
"f:template": {
"f:metadata": {
"f:labels": {
".": {},
"f:app.kubernetes.io/instance": {},
"f:app.kubernetes.io/name": {},
"f:de.company.internal/component": {},
"f:de.company.internal/log-format": {},
"f:de.company.internal/service-version": {}
}
},
"f:spec": {
"f:containers": {
"k:{\"name\":\"guestbook\"}": {
".": {},
"f:env": {
".": {},
"k:{\"name\":\"JAVA_TOOL_OPTIONS\"}": {
".": {},
"f:name": {},
"f:value": {}
},
"k:{\"name\":\"TZ\"}": {
".": {},
"f:name": {},
"f:value": {}
},
"k:{\"name\":\"spring.profiles.active\"}": {
".": {},
"f:name": {},
"f:value": {}
}
},
"f:envFrom": {},
"f:image": {},
"f:imagePullPolicy": {},
"f:livenessProbe": {
".": {},
"f:failureThreshold": {},
"f:httpGet": {
".": {},
"f:path": {},
"f:port": {},
"f:scheme": {}
},
"f:periodSeconds": {},
"f:successThreshold": {},
"f:timeoutSeconds": {}
},
"f:name": {},
"f:ports": {
".": {},
"k:{\"containerPort\":8080,\"protocol\":\"TCP\"}": {
".": {},
"f:containerPort": {},
"f:name": {},
"f:protocol": {}
}
},
"f:readinessProbe": {
".": {},
"f:failureThreshold": {},
"f:httpGet": {
".": {},
"f:path": {},
"f:port": {},
"f:scheme": {}
},
"f:periodSeconds": {},
"f:successThreshold": {},
"f:timeoutSeconds": {}
},
"f:resources": {
".": {},
"f:limits": {
".": {},
"f:cpu": {},
"f:memory": {}
},
"f:requests": {
".": {},
"f:cpu": {},
"f:memory": {}
}
},
"f:startupProbe": {
".": {},
"f:failureThreshold": {},
"f:httpGet": {
".": {},
"f:path": {},
"f:port": {},
"f:scheme": {}
},
"f:periodSeconds": {},
"f:successThreshold": {},
"f:timeoutSeconds": {}
},
"f:terminationMessagePath": {},
"f:terminationMessagePolicy": {},
"f:volumeMounts": {
".": {},
"k:{\"mountPath\":\"/configs\"}": {
".": {},
"f:mountPath": {},
"f:name": {},
"f:readOnly": {}
},
"k:{\"mountPath\":\"/secrets\"}": {
".": {},
"f:mountPath": {},
"f:name": {},
"f:readOnly": {}
}
}
}
},
"f:dnsPolicy": {},
"f:restartPolicy": {},
"f:schedulerName": {},
"f:securityContext": {},
"f:serviceAccount": {},
"f:serviceAccountName": {},
"f:terminationGracePeriodSeconds": {},
"f:topologySpreadConstraints": {
".": {},
"k:{\"topologyKey\":\"kubernetes.io/hostname\",\"whenUnsatisfiable\":\"DoNotSchedule\"}": {
".": {},
"f:labelSelector": {},
"f:maxSkew": {},
"f:topologyKey": {},
"f:whenUnsatisfiable": {}
}
},
"f:volumes": {
".": {},
"k:{\"name\":\"configs\"}": {
".": {},
"f:configMap": {
".": {},
"f:defaultMode": {},
"f:name": {}
},
"f:name": {}
},
"k:{\"name\":\"secrets\"}": {
".": {},
"f:name": {},
"f:secret": {
".": {},
"f:defaultMode": {},
"f:secretName": {}
}
}
}
}
}
}
},
"manager": "fleetagent",
"operation": "Update",
"time": "2025-04-02T13:09:23Z"
},
{
"apiVersion": "apps/v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:spec": {
"f:template": {
"f:metadata": {
"f:annotations": {
"f:kubectl.kubernetes.io/restartedAt": {}
}
}
}
}
},
"manager": "kubectl-rollout",
"operation": "Update",
"time": "2025-04-03T05:22:12Z"
},
{
"apiVersion": "apps/v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:labels": {
"f:de.company.internal/test": {}
}
},
"f:spec": {
"f:template": {
"f:metadata": {
"f:annotations": {
".": {},
"f:cattle.io/timestamp": {}
},
"f:namespace": {}
}
}
}
},
"manager": "agent",
"operation": "Update",
"time": "2025-04-07T07:49:32Z"
},
{
"apiVersion": "apps/v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:annotations": {
"f:deployment.kubernetes.io/revision": {}
}
},
"f:status": {
"f:availableReplicas": {},
"f:conditions": {
".": {},
"k:{\"type\":\"Available\"}": {
".": {},
"f:lastTransitionTime": {},
"f:lastUpdateTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
},
"k:{\"type\":\"Progressing\"}": {
".": {},
"f:lastTransitionTime": {},
"f:lastUpdateTime": {},
"f:message": {},
"f:reason": {},
"f:status": {},
"f:type": {}
}
},
"f:observedGeneration": {},
"f:readyReplicas": {},
"f:replicas": {},
"f:updatedReplicas": {}
}
},
"manager": "kube-controller-manager",
"operation": "Update",
"subresource": "status",
"time": "2025-04-07T07:50:03Z"
}
],
"name": "guestbook",
"namespace": "internal-services-dev",
"resourceVersion": "8293026",
"uid": "8e2bbb04-7b85-4f00-932f-84590dea2b7b"
},
"spec": {
"progressDeadlineSeconds": 600,
"replicas": 1,
"revisionHistoryLimit": 10,
"selector": {
"matchLabels": {
"app.kubernetes.io/instance": "guestbook",
"app.kubernetes.io/name": "service-base",
"de.company.internal/component": "service"
}
},
"strategy": {
"rollingUpdate": {
"maxSurge": "25%",
"maxUnavailable": "25%"
},
"type": "RollingUpdate"
},
"template": {
"metadata": {
"annotations": {
"cattle.io/timestamp": "2025-04-07T07:49:32Z",
"kubectl.kubernetes.io/restartedAt": "2025-04-03T07:22:11+02:00"
},
"creationTimestamp": null,
"labels": {
"app.kubernetes.io/instance": "guestbook",
"app.kubernetes.io/name": "service-base",
"de.company.internal/component": "service",
"de.company.internal/log-format": "spring-k8s",
"de.company.internal/service-version": "1.10.0"
},
"namespace": "internal-services-dev"
},
"spec": {
"containers": [
{
"env": [
{
"name": "spring.profiles.active",
"value": "kubernetes,dev"
},
{
"name": "JAVA_TOOL_OPTIONS",
"value": "-XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -XX:+ExitOnOutOfMemoryError -XX:OnOutOfMemoryError=/usr/local/bin/upload-heapdump.sh"
},
{
"name": "TZ",
"value": "Europe/Berlin"
}
],
"envFrom": [
{
"secretRef": {
"name": "heapdump-collector-credentials",
"optional": true
}
}
],
"image": "registry.company.de/internal/services/guestbook:1.10.0",
"imagePullPolicy": "Always",
"livenessProbe": {
"failureThreshold": 3,
"httpGet": {
"path": "/actuator/health/liveness",
"port": 8080,
"scheme": "HTTP"
},
"periodSeconds": 10,
"successThreshold": 1,
"timeoutSeconds": 1
},
"name": "guestbook",
"ports": [
{
"containerPort": 8080,
"name": "http",
"protocol": "TCP"
}
],
"readinessProbe": {
"failureThreshold": 3,
"httpGet": {
"path": "/actuator/health/readiness",
"port": 8080,
"scheme": "HTTP"
},
"periodSeconds": 10,
"successThreshold": 1,
"timeoutSeconds": 1
},
"resources": {
"limits": {
"cpu": "1",
"memory": "1Gi"
},
"requests": {
"cpu": "100m",
"memory": "384Mi"
}
},
"startupProbe": {
"failureThreshold": 30,
"httpGet": {
"path": "/actuator/health/liveness",
"port": 8080,
"scheme": "HTTP"
},
"periodSeconds": 10,
"successThreshold": 1,
"timeoutSeconds": 1
},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File",
"volumeMounts": [
{
"mountPath": "/secrets",
"name": "secrets",
"readOnly": true
},
{
"mountPath": "/configs",
"name": "configs",
"readOnly": true
}
]
}
],
"dnsPolicy": "ClusterFirst",
"restartPolicy": "Always",
"schedulerName": "default-scheduler",
"securityContext": {},
"serviceAccount": "default",
"serviceAccountName": "default",
"terminationGracePeriodSeconds": 30,
"topologySpreadConstraints": [
{
"labelSelector": {
"matchLabels": {
"app.kubernetes.io/instance": "guestbook",
"app.kubernetes.io/name": "service-base"
}
},
"maxSkew": 1,
"topologyKey": "kubernetes.io/hostname",
"whenUnsatisfiable": "DoNotSchedule"
}
],
"volumes": [
{
"name": "secrets",
"secret": {
"defaultMode": 420,
"secretName": "service-properties"
}
},
{
"configMap": {
"defaultMode": 420,
"name": "service-properties"
},
"name": "configs"
}
]
}
}
},
"status": {
"availableReplicas": 1,
"conditions": [
{
"lastTransitionTime": "2025-04-03T05:21:06Z",
"lastUpdateTime": "2025-04-03T05:21:06Z",
"message": "Deployment has minimum availability.",
"reason": "MinimumReplicasAvailable",
"status": "True",
"type": "Available"
},
{
"lastTransitionTime": "2025-03-27T07:22:27Z",
"lastUpdateTime": "2025-04-07T07:50:03Z",
"message": "ReplicaSet \"guestbook-789c5fd49b\" has successfully progressed.",
"reason": "NewReplicaSetAvailable",
"status": "True",
"type": "Progressing"
}
],
"observedGeneration": 8,
"readyReplicas": 1,
"replicas": 1,
"updatedReplicas": 1
}
}
],
"kind": "List",
"metadata": {
"resourceVersion": ""
}
}
I have also compared the HTTP responses between 21.0.2 and 23.0.0. Those seem to both have a slightly different "header", as the kubectl one only has an apiVersion, while this has also kind and metadata:
{
"kind" : "DeploymentList",
"apiVersion" : "apps/v1",
"metadata" : {
"resourceVersion" : "9133398"
},
"items" : [ {
"metadata" : {
"name" : "guestbook",
"namespace" : "internal-services-dev",
"uid" : "8e2bbb04-7b85-4f00-932f-84590dea2b7b",
"resourceVersion" : "8293026",
"generation" : 8,
"creationTimestamp" : "2025-03-27T07:22:27Z",
"labels" : {
"app.kubernetes.io/instance" : "guestbook",
"app.kubernetes.io/managed-by" : "Helm",
"app.kubernetes.io/name" : "service-base",
"de.company.internal/component" : "service",
"de.company.internal/service-version" : "1.10.0",
"de.company.internal/test" : "test",
"helm.sh/chart" : "service-base-1.8.1",
"objectset.rio.cattle.io/hash" : "7ace3baf8ec8ce4900cc66f3b00ac11bf10b5112"
},
"annotations" : {
"deployment.kubernetes.io/revision" : "8",
"meta.helm.sh/release-name" : "guestbook",
"meta.helm.sh/release-namespace" : "internal-services-dev",
"objectset.rio.cattle.io/id" : "default-fleet-internal-dev-internal-dev-guestbook"
},
"managedFields" : [ {
"manager" : "fleetagent",
"operation" : "Update",
"apiVersion" : "apps/v1",
"time" : "2025-04-02T13:09:23Z",
"fieldsType" : "FieldsV1",
"fieldsV1" : {
"f:metadata" : {
"f:annotations" : {
"." : { },
"f:meta.helm.sh/release-name" : { },
"f:meta.helm.sh/release-namespace" : { },
"f:objectset.rio.cattle.io/id" : { }
},
"f:labels" : {
"." : { },
"f:app.kubernetes.io/instance" : { },
"f:app.kubernetes.io/managed-by" : { },
"f:app.kubernetes.io/name" : { },
"f:de.company.internal/component" : { },
"f:de.company.internal/service-version" : { },
"f:helm.sh/chart" : { },
"f:objectset.rio.cattle.io/hash" : { }
}
},
"f:spec" : {
"f:progressDeadlineSeconds" : { },
"f:replicas" : { },
"f:revisionHistoryLimit" : { },
"f:selector" : { },
"f:strategy" : {
"f:rollingUpdate" : {
"." : { },
"f:maxSurge" : { },
"f:maxUnavailable" : { }
},
"f:type" : { }
},
"f:template" : {
"f:metadata" : {
"f:labels" : {
"." : { },
"f:app.kubernetes.io/instance" : { },
"f:app.kubernetes.io/name" : { },
"f:de.company.internal/component" : { },
"f:de.company.internal/log-format" : { },
"f:de.company.internal/service-version" : { }
}
},
"f:spec" : {
"f:containers" : {
"k:{\"name\":\"guestbook\"}" : {
"." : { },
"f:env" : {
"." : { },
"k:{\"name\":\"JAVA_TOOL_OPTIONS\"}" : {
"." : { },
"f:name" : { },
"f:value" : { }
},
"k:{\"name\":\"TZ\"}" : {
"." : { },
"f:name" : { },
"f:value" : { }
},
"k:{\"name\":\"spring.profiles.active\"}" : {
"." : { },
"f:name" : { },
"f:value" : { }
}
},
"f:envFrom" : { },
"f:image" : { },
"f:imagePullPolicy" : { },
"f:livenessProbe" : {
"." : { },
"f:failureThreshold" : { },
"f:httpGet" : {
"." : { },
"f:path" : { },
"f:port" : { },
"f:scheme" : { }
},
"f:periodSeconds" : { },
"f:successThreshold" : { },
"f:timeoutSeconds" : { }
},
"f:name" : { },
"f:ports" : {
"." : { },
"k:{\"containerPort\":8080,\"protocol\":\"TCP\"}" : {
"." : { },
"f:containerPort" : { },
"f:name" : { },
"f:protocol" : { }
}
},
"f:readinessProbe" : {
"." : { },
"f:failureThreshold" : { },
"f:httpGet" : {
"." : { },
"f:path" : { },
"f:port" : { },
"f:scheme" : { }
},
"f:periodSeconds" : { },
"f:successThreshold" : { },
"f:timeoutSeconds" : { }
},
"f:resources" : {
"." : { },
"f:limits" : {
"." : { },
"f:cpu" : { },
"f:memory" : { }
},
"f:requests" : {
"." : { },
"f:cpu" : { },
"f:memory" : { }
}
},
"f:startupProbe" : {
"." : { },
"f:failureThreshold" : { },
"f:httpGet" : {
"." : { },
"f:path" : { },
"f:port" : { },
"f:scheme" : { }
},
"f:periodSeconds" : { },
"f:successThreshold" : { },
"f:timeoutSeconds" : { }
},
"f:terminationMessagePath" : { },
"f:terminationMessagePolicy" : { },
"f:volumeMounts" : {
"." : { },
"k:{\"mountPath\":\"/configs\"}" : {
"." : { },
"f:mountPath" : { },
"f:name" : { },
"f:readOnly" : { }
},
"k:{\"mountPath\":\"/secrets\"}" : {
"." : { },
"f:mountPath" : { },
"f:name" : { },
"f:readOnly" : { }
}
}
}
},
"f:dnsPolicy" : { },
"f:restartPolicy" : { },
"f:schedulerName" : { },
"f:securityContext" : { },
"f:serviceAccount" : { },
"f:serviceAccountName" : { },
"f:terminationGracePeriodSeconds" : { },
"f:topologySpreadConstraints" : {
"." : { },
"k:{\"topologyKey\":\"kubernetes.io/hostname\",\"whenUnsatisfiable\":\"DoNotSchedule\"}" : {
"." : { },
"f:labelSelector" : { },
"f:maxSkew" : { },
"f:topologyKey" : { },
"f:whenUnsatisfiable" : { }
}
},
"f:volumes" : {
"." : { },
"k:{\"name\":\"configs\"}" : {
"." : { },
"f:configMap" : {
"." : { },
"f:defaultMode" : { },
"f:name" : { }
},
"f:name" : { }
},
"k:{\"name\":\"secrets\"}" : {
"." : { },
"f:name" : { },
"f:secret" : {
"." : { },
"f:defaultMode" : { },
"f:secretName" : { }
}
}
}
}
}
}
}
}, {
"manager" : "kubectl-rollout",
"operation" : "Update",
"apiVersion" : "apps/v1",
"time" : "2025-04-03T05:22:12Z",
"fieldsType" : "FieldsV1",
"fieldsV1" : {
"f:spec" : {
"f:template" : {
"f:metadata" : {
"f:annotations" : {
"f:kubectl.kubernetes.io/restartedAt" : { }
}
}
}
}
}
}, {
"manager" : "agent",
"operation" : "Update",
"apiVersion" : "apps/v1",
"time" : "2025-04-07T07:49:32Z",
"fieldsType" : "FieldsV1",
"fieldsV1" : {
"f:metadata" : {
"f:labels" : {
"f:de.company.internal/test" : { }
}
},
"f:spec" : {
"f:template" : {
"f:metadata" : {
"f:annotations" : {
"." : { },
"f:cattle.io/timestamp" : { }
},
"f:namespace" : { }
}
}
}
}
}, {
"manager" : "kube-controller-manager",
"operation" : "Update",
"apiVersion" : "apps/v1",
"time" : "2025-04-07T07:50:03Z",
"fieldsType" : "FieldsV1",
"fieldsV1" : {
"f:metadata" : {
"f:annotations" : {
"f:deployment.kubernetes.io/revision" : { }
}
},
"f:status" : {
"f:availableReplicas" : { },
"f:conditions" : {
"." : { },
"k:{\"type\":\"Available\"}" : {
"." : { },
"f:lastTransitionTime" : { },
"f:lastUpdateTime" : { },
"f:message" : { },
"f:reason" : { },
"f:status" : { },
"f:type" : { }
},
"k:{\"type\":\"Progressing\"}" : {
"." : { },
"f:lastTransitionTime" : { },
"f:lastUpdateTime" : { },
"f:message" : { },
"f:reason" : { },
"f:status" : { },
"f:type" : { }
}
},
"f:observedGeneration" : { },
"f:readyReplicas" : { },
"f:replicas" : { },
"f:updatedReplicas" : { }
}
},
"subresource" : "status"
} ]
},
"spec" : {
"replicas" : 1,
"selector" : {
"matchLabels" : {
"app.kubernetes.io/instance" : "guestbook",
"app.kubernetes.io/name" : "service-base",
"de.company.internal/component" : "service"
}
},
"template" : {
"metadata" : {
"namespace" : "internal-services-dev",
"creationTimestamp" : null,
"labels" : {
"app.kubernetes.io/instance" : "guestbook",
"app.kubernetes.io/name" : "service-base",
"de.company.internal/component" : "service",
"de.company.internal/log-format" : "spring-k8s",
"de.company.internal/service-version" : "1.10.0"
},
"annotations" : {
"cattle.io/timestamp" : "2025-04-07T07:49:32Z",
"kubectl.kubernetes.io/restartedAt" : "2025-04-03T07:22:11+02:00"
}
},
"spec" : {
"volumes" : [ {
"name" : "secrets",
"secret" : {
"secretName" : "service-properties",
"defaultMode" : 420
}
}, {
"name" : "configs",
"configMap" : {
"name" : "service-properties",
"defaultMode" : 420
}
} ],
"containers" : [ {
"name" : "guestbook",
"image" : "registry.company.de/internal/services/guestbook:1.10.0",
"ports" : [ {
"name" : "http",
"containerPort" : 8080,
"protocol" : "TCP"
} ],
"envFrom" : [ {
"secretRef" : {
"name" : "heapdump-collector-credentials",
"optional" : true
}
} ],
"env" : [ {
"name" : "spring.profiles.active",
"value" : "kubernetes,dev"
}, {
"name" : "JAVA_TOOL_OPTIONS",
"value" : "-XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp -XX:+ExitOnOutOfMemoryError -XX:OnOutOfMemoryError=/usr/local/bin/upload-heapdump.sh"
}, {
"name" : "TZ",
"value" : "Europe/Berlin"
} ],
"resources" : {
"limits" : {
"cpu" : "1",
"memory" : "1Gi"
},
"requests" : {
"cpu" : "100m",
"memory" : "384Mi"
}
},
"volumeMounts" : [ {
"name" : "secrets",
"readOnly" : true,
"mountPath" : "/secrets"
}, {
"name" : "configs",
"readOnly" : true,
"mountPath" : "/configs"
} ],
"livenessProbe" : {
"httpGet" : {
"path" : "/actuator/health/liveness",
"port" : 8080,
"scheme" : "HTTP"
},
"timeoutSeconds" : 1,
"periodSeconds" : 10,
"successThreshold" : 1,
"failureThreshold" : 3
},
"readinessProbe" : {
"httpGet" : {
"path" : "/actuator/health/readiness",
"port" : 8080,
"scheme" : "HTTP"
},
"timeoutSeconds" : 1,
"periodSeconds" : 10,
"successThreshold" : 1,
"failureThreshold" : 3
},
"startupProbe" : {
"httpGet" : {
"path" : "/actuator/health/liveness",
"port" : 8080,
"scheme" : "HTTP"
},
"timeoutSeconds" : 1,
"periodSeconds" : 10,
"successThreshold" : 1,
"failureThreshold" : 30
},
"terminationMessagePath" : "/dev/termination-log",
"terminationMessagePolicy" : "File",
"imagePullPolicy" : "Always"
} ],
"restartPolicy" : "Always",
"terminationGracePeriodSeconds" : 30,
"dnsPolicy" : "ClusterFirst",
"serviceAccountName" : "default",
"serviceAccount" : "default",
"securityContext" : { },
"schedulerName" : "default-scheduler",
"topologySpreadConstraints" : [ {
"maxSkew" : 1,
"topologyKey" : "kubernetes.io/hostname",
"whenUnsatisfiable" : "DoNotSchedule",
"labelSelector" : {
"matchLabels" : {
"app.kubernetes.io/instance" : "guestbook",
"app.kubernetes.io/name" : "service-base"
}
}
} ]
}
},
"strategy" : {
"type" : "RollingUpdate",
"rollingUpdate" : {
"maxUnavailable" : "25%",
"maxSurge" : "25%"
}
},
"revisionHistoryLimit" : 10,
"progressDeadlineSeconds" : 600
},
"status" : {
"observedGeneration" : 8,
"replicas" : 1,
"updatedReplicas" : 1,
"readyReplicas" : 1,
"availableReplicas" : 1,
"conditions" : [ {
"type" : "Available",
"status" : "True",
"lastUpdateTime" : "2025-04-03T05:21:06Z",
"lastTransitionTime" : "2025-04-03T05:21:06Z",
"reason" : "MinimumReplicasAvailable",
"message" : "Deployment has minimum availability."
}, {
"type" : "Progressing",
"status" : "True",
"lastUpdateTime" : "2025-04-07T07:50:03Z",
"lastTransitionTime" : "2025-03-27T07:22:27Z",
"reason" : "NewReplicaSetAvailable",
"message" : "ReplicaSet \"guestbook-789c5fd49b\" has successfully progressed."
} ]
}
} ]
}
The only difference between both json objects is the resourceVersion, the rest is completely identical between 21.0.2 and 23.0.0. So from my perspective it really seems like something breaks when deserializing the JSON..
The Kubernetes project currently lacks enough contributors to adequately respond to all issues.
This bot triages un-triaged issues according to the following rules:
- After 90d of inactivity,
lifecycle/staleis applied - After 30d of inactivity since
lifecycle/stalewas applied,lifecycle/rottenis applied - After 30d of inactivity since
lifecycle/rottenwas applied, the issue is closed
You can:
- Mark this issue as fresh with
/remove-lifecycle stale - Close this issue with
/close - Offer to help out with Issue Triage
Please send feedback to sig-contributor-experience at kubernetes/community.
/lifecycle stale
/remove-lifecycle stale
Also, still the case in 24.0.0
The Kubernetes project currently lacks enough contributors to adequately respond to all issues.
This bot triages un-triaged issues according to the following rules:
- After 90d of inactivity,
lifecycle/staleis applied - After 30d of inactivity since
lifecycle/stalewas applied,lifecycle/rottenis applied - After 30d of inactivity since
lifecycle/rottenwas applied, the issue is closed
You can:
- Mark this issue as fresh with
/remove-lifecycle stale - Close this issue with
/close - Offer to help out with Issue Triage
Please send feedback to sig-contributor-experience at kubernetes/community.
/lifecycle stale
/remove-lifecycle stale