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 这可以通过多种方式解决,我建议最好使用kubectl describe pod podname
名称,您现在可能会看到您一直在尝试的服务失败的原因。就我而言,我发现在进行部署时配置映射中缺少我的一些键值。
【讨论】:
【参考方案2】:我今天自己遇到了这个问题,因为我试图创建秘密并在我的 pod 定义 yaml 文件中使用它们。如果您检查kubectl get secrets
和kubectl get configmaps
的输出(如果您正在使用它们中的任何一个)并验证您想要的数据项的数量是否正确列出,将会有所帮助。
我认识到,在我的案例中,问题是当我们创建包含多个数据项的机密时:kubectl get secrets <secret_name>
的输出只有一项数据,而我在 secret_name_definition.yaml
中指定了两项数据。这是因为使用 kubectl create -f secret_name_definition.yaml
和 kubectl 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】:
检查您的 secrets
和 config 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和容器(五)应用资源配额和限制