{"record":{"id":"8ae8783d1e1ca24d","repo":"kubernetes/kops","slug":"expected-exactly-one-container-in-etcd-manager-pod","errorCode":null,"errorMessage":"expected exactly one container in etcd-manager Pod, found %d","messagePattern":"expected exactly one container in etcd-manager Pod, found (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/model/components/etcdmanager/model.go","lineNumber":295,"sourceCode":"\n\tfor _, etcdVersion := range etcdVersions {\n\t\tif etcdVersion.SymlinkToVersion == \"\" {\n\t\t\tvolume := v1.Volume{\n\t\t\t\tName: \"etcd-v\" + strings.ReplaceAll(etcdVersion.Version, \".\", \"-\"),\n\t\t\t\tVolumeSource: v1.VolumeSource{\n\t\t\t\t\tImage: &v1.ImageVolumeSource{\n\t\t\t\t\t\tReference:  b.AssetBuilder.RemapImage(etcdVersion.Image),\n\t\t\t\t\t\tPullPolicy: v1.PullIfNotPresent,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\t\t\tpod.Spec.Volumes = append(pod.Spec.Volumes, volume)\n\t\t}\n\t}\n\n\t{\n\t\tif len(pod.Spec.Containers) != 1 {\n\t\t\treturn nil, fmt.Errorf(\"expected exactly one container in etcd-manager Pod, found %d\", len(pod.Spec.Containers))\n\t\t}\n\t\tcontainer = &pod.Spec.Containers[0]\n\n\t\tif etcdCluster.Manager != nil && etcdCluster.Manager.Image != \"\" {\n\t\t\tklog.Warningf(\"overloading image in manifest %s with images %s\", bundle, etcdCluster.Manager.Image)\n\t\t\tcontainer.Image = etcdCluster.Manager.Image\n\t\t}\n\n\t\t// Remap image via AssetBuilder\n\t\tcontainer.Image = b.AssetBuilder.RemapImage(container.Image)\n\n\t\tfor _, etcdVersion := range etcdVersions {\n\t\t\tvolumeMount := v1.VolumeMount{\n\t\t\t\tMountPath: \"/opt/etcd-v\" + etcdVersion.Version,\n\t\t\t}\n\t\t\tif etcdVersion.SymlinkToVersion == \"\" {\n\t\t\t\tvolumeMount.Name = \"etcd-v\" + strings.ReplaceAll(etcdVersion.Version, \".\", \"-\")\n\t\t\t} else {","sourceCodeStart":277,"sourceCodeEnd":313,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/model/components/etcdmanager/model.go#L277-L313","documentation":"buildPod assumes the etcd-manager Pod template contains exactly one container, whose settings it then mutates (image override, ports, env). If the parsed Pod has zero or multiple containers, the builder cannot know which to configure and fails.","triggerScenarios":"buildManifest -> buildPod with a customized etcd-manager Pod manifest listing 0 or 2+ entries under spec.containers (e.g. a added sidecar container).","commonSituations":"Users adding sidecars (log shippers, monitors) to the etcd-manager Pod template; stripping containers during templating; merge tooling duplicating the container entry.","solutions":["Keep exactly one container in the etcd-manager Pod manifest; move sidecars into a separate Pod or static manifest.","Restore the vendored template and re-apply only supported overrides (etcdCluster.Manager.image).","If a sidecar is essential, run it as a separate DaemonSet/standalone Pod rather than editing this template."],"exampleFix":"// before\ncontainers:\n- name: etcd-manager\n  ...\n- name: log-sidecar\n  ...\n// after\ncontainers:\n- name: etcd-manager\n  ...","handlingStrategy":"validation","validationCode":"if len(pod.Spec.Containers) != 1 {\n\treturn fmt.Errorf(\"etcd-manager manifest must have exactly one container, found %d\", len(pod.Spec.Containers))\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not add sidecar containers to the etcd-manager Pod template.","Run auxiliary agents as separate DaemonSets/Pods.","Diff modified templates against upstream kops to catch accidental container edits."],"tags":["kops","etcd-manager","pod","manifest"],"backgroundTag":"unexpected-container-count","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}