【问题标题】:Kubernetes / kubectl - "A container name must be specified" but seems like it is?Kubernetes / kubectl - “必须指定容器名称”但看起来是这样吗?
【发布时间】:2018-04-18 04:03:45
【问题描述】:

我正在调试来自 kubectl 的日志输出,其中指出:

Error from server (BadRequest): a container name must be specified for pod postgres-operator-49202276-bjtf4, choose one of: [apiserver postgres-operator]

好的,这是一个解释性错误消息,但是查看我的 JSON 模板,它应该只创建指定的两个容器,对吗?我错过了什么? (请原谅我的无知。)

我只使用标准的 kubectl create -f 命令在 shell 脚本中创建 JSON 文件。 JSON部署文件如下:

{
    "apiVersion": "extensions/v1beta1",
    "kind": "Deployment",
    "metadata": {
        "name": "postgres-operator"
    },
    "spec": {
        "replicas": 1,
        "template": {
            "metadata": {
                "labels": {
                    "name": "postgres-operator"
                }
            },
            "spec": {
                "containers": [{
                    "name": "apiserver",
                    "image": "$CCP_IMAGE_PREFIX/apiserver:$CO_IMAGE_TAG",
                    "imagePullPolicy": "IfNotPresent",
                    "env": [{
                        "name": "DEBUG",
                        "value": "true"
                    }],
                    "volumeMounts": [{
                        "mountPath": "/config",
                        "name": "apiserver-conf",
                        "readOnly": true
                    }, {
                        "mountPath": "/operator-conf",
                        "name": "operator-conf",
                        "readOnly": true
                    }]
                }, {
                    "name": "postgres-operator",
                    "image": "$CCP_IMAGE_PREFIX/postgres-operator:$CO_IMAGE_TAG",
                    "imagePullPolicy": "IfNotPresent",
                    "env": [{
                        "name": "DEBUG",
                        "value": "true"
                    }, {
                        "name": "NAMESPACE",
                        "valueFrom": {
                            "fieldRef": {
                                "fieldPath": "metadata.namespace"
                            }
                        }
                    }, {
                        "name": "MY_POD_NAME",
                        "valueFrom": {
                            "fieldRef": {
                                "fieldPath": "metadata.name"
                            }
                        }
                    }],
                    "volumeMounts": [{
                        "mountPath": "/operator-conf",
                        "name": "operator-conf",
                        "readOnly": true
                    }]
                }],
                "volumes": [{
                    "name": "operator-conf",
                    "configMap": {
                        "name": "operator-conf"
                    }
                }, {
                    "name": "apiserver-conf",
                    "configMap": {
                        "name": "apiserver-conf"
                    }
                }]
            }
        }
    }
}

【问题讨论】:

  • 使用kubectl -c <container_name> ...。在你的情况下,kubectl -c apiserver ...
  • 发布导致错误消息的命令通常是个好主意。

标签: json kubernetes kubectl


【解决方案1】:

如果一个 pod 有超过 1 个容器,那么您需要提供特定容器的名称。

在您的情况下,有一个 pod (postgres-operator-49202276-bjtf4) 有 2 个容器(apiserver 和 postgres-operator )。 以下命令将为特定容器提供日志

kubectl logs deployment/postgres-operator -c apiserver


kubectl logs deployment/postgres-operator -c postgres-operator

【讨论】:

  • 很好地指出,容器日志的检查是这里的关键。来自多容器 pod 的错误消息有点误导。当我第一次遇到这个错误时,我只关注 pod 的元数据和容器名称,但问题在于容器的命令属性。
【解决方案2】:

如果 pod 有多个容器,则必须提供容器名称(如上述答案中所述)。

要了解我们可以使用的 pod 内的所有容器:

kubectl -n <NAMESPACE> get pods <POD_NAME> -o jsonpath="{..image}"

【讨论】:

  • 您还可以使用kubectl logs pod/XXXX --all-containers查看此 pod 中所有容器的日志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 2021-04-30
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多