在 Minikube 集群中,吊舱状态为“ CreatecontainerConfigError”

我尝试使用以下 舵图运行 Sonarqube服务。

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

当我做 helm install后面的 kubectl get pods我看到的 MySQL豆荚状态为 running,但是 Sonarqube的 pos 状态显示为 CreateContainerConfigError。我认为这与安装音量的东西有关: 链接。虽然我不太确定如何解决这个问题(对 Kubernetes 环境来说很新鲜,直到学习之前:)

135608 次浏览

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

我意识到在我的案例中,问题在于当我们使用多个数据项创建机密时: kubectl get secrets <secret_name>的输出只有1个数据项,而我在 secret_name_definition.yaml中指定了2个项。这是因为使用 kubectl create -f secret_name_definition.yaml和使用 kubectl create secret <secret_name> --from-file=secret_name_definition.yaml的不同之处在前者的情况下,yaml 数据部分中列出的所有项目将被视为键值对,因此当我们使用 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值。

例如,假设密钥是“ username”和“ password”,如果使用命令 kubectl create -f secret_definition.yaml创建机密,我们需要像在 https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/的“ Create a Secret”部分中提到的那样,对“ username”和“ password”进行编码

我想强调的“ 注:”部分在 https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/还有,https://kubernetes.io/docs/concepts/configuration/secret/有一个非常清楚的解释创造秘密

还要确保 loyment.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”的输出没有多大帮助。

最近,我遇到了同样的 CreateContainerConfigError错误,经过小小的调试,我发现这是因为我在我的 部署 yaml 中使用了一个 kubernetes 秘密,它实际上并没有在创建 pods 的名称空间中出现/创建。

在阅读了前面的答案之后,我想这可以肯定,这个特殊的错误是围绕着库伯内特的秘密!

这个问题可以通过多种方式解决,我建议您最好使用 kubectl describe pod podname名称,您现在可能已经看到了您所尝试的服务失败的原因。在我的例子中,我发现在执行部署时,配置图中缺少一些键值。

我也遇到了这个问题,这个问题是由于在控制器上使用 field 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}]"

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

正如已经指出的答案可以检查与 kubectl describe pod [pod name]的错误,这样的东西应该出现在输出的底部:

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

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

返回文章页面我的秘密:

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