kubernetes 在Minikube群集中Pod状态为'CreateContainerConfigError'

eagi6jfj  于 2022-12-29  发布在  Kubernetes
关注(0)|答案(6)|浏览(219)

我正在尝试使用以下helm chart运行Sonarqube服务。
因此,设置就像是在minikube集群中启动MySQL和Sonarqube服务,然后Sonarqube服务与MySQL服务进行通信以转储数据。
当我在kubectl get pods之后执行helm install时,我看到MySQL pod的状态为running,但Sonarqube pod的状态显示为CreateContainerConfigError。链接。虽然我不太确定如何修复它(对Kubernetes环境来说相当新,直到学习:)

f8rj6qna

f8rj6qna1#

这个问题可以通过多种方式解决,我建议最好使用kubectl describe pod podname名称,现在您可能会看到您尝试的服务失败的原因。在我的情况下,我发现在进行部署时,configmap中缺少了一些键值。

bn31dyow

bn31dyow2#

我今天遇到了这个问题,因为我试图创建密码,并在我的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进行查询时,项中的1个将显示为正确的输出,但在后一种情况下,将仅针对键值对评估secret_name_definition.yaml中的第一个数据项,因此kubectl get secrets secret_name的输出将仅显示1个数据项,此时我们会看到错误“创建容器配置错误”。
注意,如果我们使用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/中的“Note:”部分。另外,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“的输出没有多大帮助。

ctzwtxfj

ctzwtxfj3#

最近,我遇到了同样的CreateContainerConfigError错误,经过少量调试后,我发现这是因为我在Deploymentyaml中使用了kubernetessecret,而在创建pod的名称空间中实际上并不存在/没有创建它。
另外,在阅读了前面的答案后,我想这可以保证,这个特定的错误是围绕kubernetes秘密!

fykwrbwg

fykwrbwg4#

检查您的secretsconfig mapskubectl get [secrets|configmaps])是否已经存在并且在YAML描述符文件中正确指向,在这两种情况下,不正确的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
k2fxgqgv

k2fxgqgv5#

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

- 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}]"
wwwo4jvm

wwwo4jvm6#

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

我的秘密.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

相关问题