{"record":{"id":"76383b552f8a6051","repo":"cilium/cilium","slug":"clustermesh-is-not-deployed","errorCode":null,"errorMessage":"clustermesh is not deployed","messagePattern":"clustermesh is not deployed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"cilium-cli/status/k8s.go","lineNumber":613,"sourceCode":"\t\t\t\t\t\tdefer status.mutex.Unlock()\n\t\t\t\t\t\tstatus.CollectionError(err)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nil\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: defaults.ClusterMeshDeploymentName,\n\t\t\ttask: func(_ context.Context) error {\n\t\t\t\tdisabled, err := k.deploymentStatus(ctx, status, defaults.ClusterMeshDeploymentName)\n\t\t\t\tstatus.mutex.Lock()\n\t\t\t\tdefer status.mutex.Unlock()\n\n\t\t\t\tstatus.SetDisabled(defaults.ClusterMeshDeploymentName, defaults.ClusterMeshDeploymentName, disabled)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif _, ok := status.PodState[defaults.ClusterMeshDeploymentName]; !ok {\n\t\t\t\t\t\tstatus.AddAggregatedWarning(defaults.ClusterMeshDeploymentName, defaults.ClusterMeshDeploymentName, fmt.Errorf(\"clustermesh is not deployed\"))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstatus.AddAggregatedError(defaults.ClusterMeshDeploymentName, defaults.ClusterMeshDeploymentName, err)\n\t\t\t\t\t\tstatus.CollectionError(err)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// pod status for relay is only validated if the deployment exists\n\t\t\t\tif _, ok := status.PodState[defaults.ClusterMeshDeploymentName]; ok {\n\t\t\t\t\terr = k.podStatus(ctx, status, defaults.ClusterMeshDeploymentName, \"k8s-app=clustermesh-apiserver\", nil)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tstatus.mutex.Lock()\n\t\t\t\t\t\tdefer status.mutex.Unlock()\n\t\t\t\t\t\tstatus.CollectionError(err)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nil\n\t\t\t},","sourceCodeStart":595,"sourceCodeEnd":631,"githubUrl":"https://github.com/cilium/cilium/blob/ac7b90affa4baf0642e6685319d56907b3a73a6d/cilium-cli/status/k8s.go#L595-L631","documentation":"The clustermesh-apiserver deployment lookup failed and no clustermesh Pod state exists, so the collector warns 'clustermesh is not deployed'. This is the multi-cluster feature check in cilium-cli status distinguishing an absent component from a broken one.","triggerScenarios":"Running `cilium-cli status` when deploymentStatus() for the clustermesh-apiserver Deployment errors (typically NotFound) and status.PodState lacks ClusterMeshDeploymentName.","commonSituations":"Single-cluster installs where clustermesh was never enabled (`clustermesh.useAPIServer=false` default); checking status after disconnecting/removing clustermesh; users running `cilium clustermesh status` before `cilium clustermesh enable`.","solutions":["If multi-cluster is wanted: `cilium clustermesh enable` then connect clusters with `cilium clustermesh connect`","If not, ignore the warning — clustermesh is optional","Verify absence with `kubectl -n kube-system get deploy clustermesh-apiserver`","Ensure required `cluster.name` config differs per cluster before enabling"],"exampleFix":"// before\n$ cilium status\n⚠️ clustermesh is not deployed\n// after\n$ cilium clustermesh enable\n$ cilium clustermesh connect --context cluster2\n$ cilium status\n✅ clustermesh-apiserver: Ok","handlingStrategy":"validation","validationCode":"kubectl -n kube-system get deployment clustermesh-apiserver || echo 'clustermesh not enabled'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only run clustermesh commands after `cilium clustermesh enable`","Set unique cluster.name per cluster before enabling clustermesh","Treat the 'not deployed' warning as informational on single-cluster setups","Verify clustermesh state with `cilium clustermesh status` before multi-cluster operations"],"tags":["kubernetes","cilium","clustermesh","deployment-missing"],"backgroundTag":"component-not-deployed","analyzedSha":"ac7b90affa4baf0642e6685319d56907b3a73a6d","analyzedAt":"2026-08-31T18:27:15.868Z","schemaVersion":2},"datasetVersion":"2026-08-31T22:30:34.772Z"}