Understanding Cloud Service Mesh compatibility
This guide details how to evaluate a fleet's compatibility for control plane
modernization by confirming that its configuration, infrastructure, and scale
are compatible with the TRAFFIC_DIRECTOR control plane implementation.
Opt in or out of compatibility checks
To initiate the compatibility checks, enable validation mode for the fleet, which triggers an ongoing audit of all Istio configurations, Infrastructure configurations, and scale parameters. Enabling these checks does not perform any changes to your fleet or clusters; it only enables compatibility reporting.
Enable checks
To begin the compatibility audit, run the following gcloud command:
gcloud alpha container fleet mesh update --modernization-compatibility validation-enabled --project FLEET_PROJECT_ID
Replace FLEET_PROJECT_ID with the ID of your Fleet Host project.
Generally, the FLEET_PROJECT_ID has the same name as the project.
Once enabled, Cloud Service Mesh begins evaluating the fleet and all Cloud Service Mesh provisioned clusters in the fleet for modernization compatibility.
Disable checks
To stop the reporting of compatibility results, run the following command:
gcloud alpha container fleet mesh update --modernization-compatibility validation-disabled --project FLEET_PROJECT_ID
This command removes the modernization compatibility conditions from the
membership states, as well as the ModernizationCompatible status from
individual Istio CRs.
Understand compatibility
Modernization compatibility is reported using conditions at both the fleet and membership (cluster) level. The system performs various checks at different times, with all checks running at least once a day. Allow up to one day for the status to update after enabling checks or applying fixes.
To view these results, retrieve the latest mesh status with the following command:
gcloud container fleet mesh describe --project FLEET_PROJECT_ID
Cluster-level compatibility
Look for conditions with WARNING or ERROR severity under
membershipStates.servicemesh for each Cloud Service Mesh provisioned cluster in the fleet. If
incompatibilities exist, the output is similar to this:
membershipSpecs:
projects/project_id/locations/global/memberships/cluster-a:
mesh:
management:MANAGEMENT_AUTOMATIC
membershipStates:
projects/project_id/locations/global/memberships/cluster-a:
servicemesh:
conditions:
- code: MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION
details: 'Pod pod-a in namespace test-namespace: invalid annotations: ["status.sidecar.istio.io/port": failed to parse port - "invalid", port must be a number and should be in the range 1..65535]; unsupported annotations: ["ambient.istio.io/redirection"] .'
documentationLink: https://cloud.google.com/service-mesh/...
severity: WARNING
- code: WORKLOAD_IDENTITY_REQUIRED
details: 'Workload Identity is not enabled for the cluster or at least one of the node pools.'
documentationLink: https://cloud.google.com/...
severity: ERROR
...
Follow the documentationLink provided within each condition to understand and
resolve the specific incompatibility.
Resolve compatibility issues
Resolve incompatible pod annotations
The MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION code indicates that the cluster
cannot be modernized to the TRAFFIC_DIRECTOR control plane because
certain Pods have unsupported or invalid Istio annotations.
Example output from the gcloud container fleet mesh describe command with the
condition MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION set for membership:
membershipStates:
projects/project_id/locations/global/memberships/membership-a:
servicemesh:
conditions:
- code: MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION
details: 'Pod pod-a in namespace test-namespace: invalid annotations: ["status.sidecar.istio.io/port": failed to parse port - "invalid", port must be a number and should be in the range 1..65535]; unsupported annotations: ["ambient.istio.io/redirection"] .'
documentationLink: https://cloud.google.com/service-mesh/...
severity: WARNING
To resolve these pod annotations:
Identify problematic annotations: Check the
detailsfield of the status condition to find the unsupported or invalid annotation keys. Find all Pods with the problematic annotation keys.Fix and verify:
- Modify the YAML specifications for your Deployments or Pods to remove or modify the identified annotations, ensuring they do not include any unsupported annotations. Re-apply the updated YAML to your cluster.
- Once all Pod annotations are corrected, the
MODERNIZATION_INCOMPATIBLE_POD_ANNOTATIONcondition will no longer appear for that membership.
Resolve incompatible configurations
The MODERNIZATION_INCOMPATIBLE_CONFIG code indicates that the cluster cannot
be modernized to the TRAFFIC_DIRECTOR control plane due to
incompatible configurations. These incompatibilities can stem from:
- Specific Istio Custom Resources (CRs) using unsupported features or fields or containing invalid values.
- Invalid or unsupported Istio MeshConfig settings.
- Exceeding scalability limits.
- Use of unsupported service or namespace annotations.
Example output from the gcloud container fleet mesh describe command with the
condition MODERNIZATION_INCOMPATIBLE_CONFIG set for membership:
membershipSpecs:
projects/project_id/locations/global/memberships/membership-a:
mesh:
management:MANAGEMENT_AUTOMATIC
membershipStates:
projects/project_id/locations/global/memberships/membership-a:
servicemesh:
conditions:
- code: MODERNIZATION_INCOMPATIBLE_CONFIG
details: 'One or more configs have warnings. Due to the following reason(s): Istio sidecar scale exceeds limit, MeshConfig "accessLogFile" is unsupported. Invalid Config Types: [Gateway, ServiceEntry], where more details are shown on individual config resources.See documentation link for more detail.'
documentationLink: https://cloud.google.com/service-mesh/...
severity: WARNING
To resolve these configurations:
Analyze the condition details: Check the
detailsfield of the status condition. It summarizes individual errors and identifies the resource types with configuration issues. For the provided details example, you would be required to address the scale and MeshConfig issues and inspectGatewayandServiceEntryresources for errors.Identify and investigate incompatible resources: Use the following script to list all Istio Custom Resources (CRs) failing compatibility checks. The script requires
kubectlandjqto be installed. The output includes the specific error details found understatus.conditions(type:ModernizationCompatible, status:"False") of each resource.for resource in authorizationpolicies destinationrules gateways proxyconfigs peerauthentications requestauthentications serviceentries sidecars telemetries virtualservices wasmplugins workloadentries workloadgroups; do echo "--- Checking $resource ---" kubectl get $resource --all-namespaces -o json | \ jq -r '.items[] | select(.status.conditions != null and any(.status.conditions[]; .type == "ModernizationCompatible" and .status == "False")) | {"kind": .kind, "name": .metadata.name, "namespace": .metadata.namespace, "message": [.status.conditions[] | select(.type == "ModernizationCompatible").message]}' doneExample Output:
--- Checking serviceentries --- { "kind": "ServiceEntry", "name": "demo-service-entry", "namespace": "se", "message": [ "WARNING: unsupported resolution type: DNS_ROUND_ROBIN" ] } .. --- Checking workloadentries --- { "kind": "WorkloadEntry", "name": "demo-we", "namespace": "default", "message": [ "WARNING: This API is not supported" ] }Fix and apply configurations: Modify your YAML by removing the unsupported fields or replacing invalid values with compatible ones. For assistance, refer to the Supported features of managed Cloud Service Mesh and Unsupported Istio APIs documentation. (For instance, in the provided example, update the
ServiceEntryresolution fromDNS_ROUND_ROBINtoDNS).Verify fixes: After applying fixes, allow up to 24 hours for periodic checks to update the status.
The
ModernizationCompatiblecondition on the fixed resources should change to status:"True". Check the resource's status using:kubectl get resource name -n namespace -o yamlExample output:
status: conditions: - lastTransitionTime: "2026-06-05T06:12:52.219963391Z" message: Resource is compatible for modernization reason: Compatible status: "True" type: ModernizationCompatibleRe-run the
gcloud container fleet mesh describecommand. Once all related issues are resolved, theMODERNIZATION_INCOMPATIBLE_CONFIGcondition will no longer appear for that membership.