Minikube 集群中 Pod 状态为“CreateContainerConfigError”

Posted

技术标签:

【中文标题】Minikube 集群中 Pod 状态为“CreateContainerConfigError”【英文标题】:Pod status as `CreateContainerConfigError` in Minikube cluster 【发布时间】:2018-10-29 16:30:53 【问题描述】:

我正在尝试使用以下helm chart 运行Sonarqube 服务。

所以设置就像它在 minikube 集群中启动 mysql 和 Sonarqube 服务,Sonarqube 服务与 MySQL 服务对话以转储数据。

当我执行helm install 后跟kubectl get pods 时,我看到MySQL pod 状态为running,但Sonarqube pos 状态显示为CreateContainerConfigError。我认为这与安装量有关:link。虽然我不太确定如何修复它(对 Kubernetes 环境非常陌生,直到学习:))

【问题讨论】:

您好,可以添加容器的日志吗? kubectl logs POD_NAME 因为 pod 位于 CreateContainerConfigError 中。 kubectl logs 返回:Error from server (BadRequest): container "sonar-play-sonarqube" in pod "sonar-play-sonarqube-6ffdff74d4-w2pvs" is waiting to start: CreateContainerConfigError 是的,这可能是安装卷引起的。据我了解,init 容器确保这些目录需要可用于应用程序容器。是否可以获取init容器kubectl logs podname -c init-container-name的日志? “kubectl describe pod ”显示了什么?日志将向您显示应用程序错误,但您的容器尚未启动,因此应用程序尚未启动。 “描述 pod”将使您深入了解 k8s 配置错误。 在我遇到同样错误的情况下,有一个配置映射链接到 cronjob,但实际的配置映射丢失了。 【参考方案1】:

这可以通过多种方式解决,我建议最好使用kubectl describe pod podname 名称,您现在可能会看到您一直在尝试的服务失败的原因。就我而言,我发现在进行部署时配置映射中缺少我的一些键值。

【讨论】:

【参考方案2】:

我今天自己遇到了这个问题,因为我试图创建秘密并在我的 pod 定义 yaml 文件中使用它们。如果您检查kubectl get secretskubectl get configmaps 的输出(如果您正在使用它们中的任何一个)并验证您想要的数据项的数量是否正确列出,将会有所帮助。

我认识到,在我的案例中,问题是当我们创建包含多个数据项的机密时:kubectl get secrets <secret_name> 的输出只有一项数据,而我在 secret_name_definition.yaml 中指定了两项数据。这是因为使用 kubectl create -f secret_name_definition.yamlkubectl create secret <secret_name> --from-file=secret_name_definition.yaml 的区别在于前者的情况下,yaml 的数据部分中列出的所有项目都将被视为键值对,因此 # of当我们使用kubectl get secrets secret_name 查询时,项目将显示为正确的输出,但在后者的情况下,只有secret_name_definition.yaml 中的第一个数据项将针对键值对进行评估,因此kubectl get secrets secret_name 的输出将仅显示 1 个数据项,这是我们看到错误“CreateContainerConfigError”的时候。

请注意,如果我们将kubectl create secret <secret_name>--from-literal= 选项一起使用,则不会出现此问题,因为我们必须为要定义的每个键值对使用前缀--from-literal=

同样,如果我们使用--from-file=选项,我们仍然需要多次指定前缀,每个键值对一个,但我们可以在使用--from-literal时传递键的原始值和编码形式(即,当我们使用--from-file 时,键的值现在将是它的echo raw_value | base64 作为值。

例如,假设密钥是“用户名”和“密码”,如果使用命令 kubectl create -f secret_definition.yaml 创建密钥,我们需要将“用户名”和“密码”的值编码为“创建”中所述https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/ 的“秘密”部分

我想强调https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/中的“注意:”部分另外,https://kubernetes.io/docs/concepts/configuration/secret/对创建秘密有非常清楚的解释

还要确保 deployment.yaml 现在具有此容器的正确定义:

      env:
        - name: DB_HOST
          value: 127.0.0.1
        # These secrets are required to start the pod.
        # [START cloudsql_secrets]
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: cloudsql-db-credentials
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: cloudsql-db-credentials
              key: password
        # [END cloudsql_secrets]

正如其他人所引用的那样,“kubectl describe pods pod_name”会有所帮助,但在我的情况下,我只知道首先没有创建容器,并且“kubectl logs pod_name -c container_name”的输出没有太大帮助。

【讨论】:

重要的是在这里提到总是echo -n raw_value | base64-n 删除了一个换行符,该换行符原本会添加到密钥的 raw_value 中,稍后会添加到键盘刘海中。【参考方案3】:

最近,我遇到了同样的CreateContainerConfigError错误,经过一点调试我发现这是因为我在我的部署 yaml中使用了kubernetes secret,在创建 pod 的那个命名空间中实际上并不存在/创建它。

另外,在阅读了上一个答案之后,我想可以确定这个特定的错误集中在 kubernetes 的秘密上!

【讨论】:

你能解释一下实际上不存在/不在那个命名空间中创建,我收到了同样的错误消息,CreateContainerConfigError 如果你在部署中使用了一个在上述命名空间中不存在的秘密,那么它会给你这个错误 这对我来说很相似。我创建了秘密“db-secret”,但随后引用了“db-secrets”(带有尾随 s)。 Kubernetes 真的应该对它们的错误冗长做点什么^^【参考方案4】:

检查您的 secretsconfig maps (kubectl get [secrets|configmaps]),它们已经存在并在 YAML 描述符文件中正确指向,在这两种情况下,不正确的 secret/configmap(未创建、拼写错误等)都会导致 @ 987654324@。

正如答案中已经指出的那样,可以使用kubectl describe pod [pod name] 检查错误,并且类似这样的内容应该出现在输出的底部:

  Warning  Failed     85s (x12 over 3m37s)  kubelet, gke-****-default-pool-300d3c89-9jkz
  Error: configmaps "config-map-1" not found

【讨论】:

【参考方案5】:

我也遇到了这个问题,问题是由于在控制器上使用字段 ref 的环境变量。另一个控制器和工作人员能够解析引用。我们没有时间追查问题的原因,最终拆除了集群并重建它。

          - name: DD_KUBERNETES_KUBELET_HOST
            valueFrom:
              fieldRef:
                fieldPath: status.hostIP
Apr 02 16:35:46 ip-10-30-45-105.ec2.internal sh[1270]: E0402 16:35:46.502567    1270 pod_workers.go:186] Error syncing pod 3eab4618-5564-11e9-a980-12a32bf6e6c0 ("datadog-datadog-spn8j_monitoring(3eab4618-5564-11e9-a980-12a32bf6e6c0)"), skipping: failed to "StartContainer" for "datadog" with CreateContainerConfigError: "host IP unknown; known addresses: [Hostname ip-10-30-45-105.ec2.internal]"

【讨论】:

【参考方案6】:

尝试使用选项--from-env-file 而不是--from-file,看看这个问题是否会消失。我遇到了同样的错误并查看了 pod 事件,它表明 mysecrets.txt 文件中的键值对未正确读取。如果只有一行,Kubernetes 将文件中的内容作为值,文件名作为键。为避免此问题,您需要将该文件作为环境变量文件读取,如下所示。

mysecrets.txt:

MYSQL_PASSWORD=dfsdfsdfkhk

例如:

kubectl create secret generic secret-name --from-env-file=mysecrets.txt
kubectl create configmap generic configmap-name --from-env-file=myconfigs.txt

【讨论】:

以上是关于Minikube 集群中 Pod 状态为“CreateContainerConfigError”的主要内容,如果未能解决你的问题,请参考以下文章

docker container和Minikube之间的链接

Kubernetes 配置Pod和容器(五)应用资源配额和限制

minikube安装ingress

我无法让 Pulsar 集群正确重启

Kubernetes 配置Pod和容器(二)定义容器命令行和参数

Pod预设在minikube上不起作用