{"record":{"id":"2028ce5590b80445","repo":"tailscale/tailscale","slug":"failed-to-apply-statefulset-for-peerrelay-q-w","errorCode":null,"errorMessage":"failed to apply StatefulSet for PeerRelay %q: %w","messagePattern":"failed to apply StatefulSet for PeerRelay %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"k8s-operator/reconciler/peerrelay/peerrelay.go","lineNumber":272,"sourceCode":"\n\tendpointsByReplica := make(map[int32][]tsapi.PeerRelayEndpoint, len(endpoints))\n\tfor _, ep := range endpoints {\n\t\tendpointsByReplica[ep.Replica] = append(endpointsByReplica[ep.Replica], ep)\n\t}\n\n\tfor i := int32(0); i < replicas; i++ {\n\t\tif err = r.ensureStateSecret(ctx, logger, pr, i); err != nil {\n\t\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to apply state Secret for PeerRelay %q replica %d: %w\", pr.Name, i, err)\n\t\t}\n\n\t\tif err = r.ensureConfigSecret(ctx, logger, pr, i, endpointsByReplica[i]); err != nil {\n\t\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to apply config Secret for PeerRelay %q replica %d: %w\", pr.Name, i, err)\n\t\t}\n\t}\n\n\tss, err := r.ensureStatefulSet(ctx, logger, pr, replicas)\n\tif err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to apply StatefulSet for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err = r.deleteDevicesFrom(ctx, logger, pr, replicas); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to clean up scaled-down tailnet devices for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err = r.deleteServicesFrom(ctx, logger, pr, replicas); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to clean up scaled-down Services for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err = r.deleteConfigSecretsFrom(ctx, logger, pr, replicas); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to clean up scaled-down config Secrets for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err = r.writeStatus(ctx, logger, pr, endpoints, replicas, ss); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to update PeerRelay status for %q: %w\", pr.Name, err)\n\t}\n","sourceCodeStart":254,"sourceCodeEnd":290,"githubUrl":"https://github.com/tailscale/tailscale/blob/6e0912f97994f927632b34ae9e63b53d6516a6ac/k8s-operator/reconciler/peerrelay/peerrelay.go#L254-L290","documentation":"Raised in createOrUpdate when ensureStatefulSet cannot fetch the referenced ProxyClass, apply the StatefulSet, or read it back. All replica Secrets were already applied; the workload itself could not be created or updated.","triggerScenarios":"Thrown at k8s-operator/reconciler/peerrelay/peerrelay.go:272 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Applying the StatefulSet for the PeerRelay failed; validate the StatefulSet spec and RBAC permissions on StatefulSets, then retry."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6e0912f97994f927632b34ae9e63b53d6516a6ac","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}