Skip to content

managedFields not populated since 22.0.0 #3995

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
BSchwetzel opened this issue Apr 2, 2025 · 4 comments
Open

managedFields not populated since 22.0.0 #3995

BSchwetzel opened this issue Apr 2, 2025 · 4 comments

Comments

@BSchwetzel
Copy link

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

  1. Get V1DeploymentList for specific namespace
  2. 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
@brendandburns
Copy link
Contributor

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.

@BSchwetzel
Copy link
Author

Hi, thanks for your time! 22.0.0-legacy shows the same behavior, the managed fields are still empty..

@brendandburns
Copy link
Contributor

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

@BSchwetzel
Copy link
Author

BSchwetzel commented Apr 8, 2025

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..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants