我正在尝试使用以下Sonarqube
运行helm chart服务。
因此,设置就像在minikube集群中启动MySQL和Sonarqube服务一样,Sonarqube服务与MySQL服务进行对话以转储数据。
当我做helm install
跟随kubectl get pods
时,我看到MySQL
pod状态为running
,但Sonarqube
pos状态显示为CreateContainerConfigError
。我认为它与安装量有关:link。虽然我不太确定如何解决它(非常新的Kubernetes环境,直到学习:))
我今天遇到了这个问题,因为我试图创建秘密并在我的pod定义yaml文件中使用它们。如果您检查kubectl get secrets
和kubectl 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
和编码形式时传递键的原始值(即值当我们使用echo raw_value | base64
时,关键字现在将--from-file
作为值。
例如,假设密钥是“用户名”和“密码”,如果使用命令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
”的输出并没有多大帮助。
最近,我遇到了同样的CreateContainerConfigError
错误,经过一些调试我发现这是因为我在部署yaml中使用了kubernetes秘密,实际上并没有在该命名空间中创建或创建pod。
在阅读完之前的答案之后,我想这可以肯定这个特定的错误集中在kubernetes的秘密!
这可以通过各种方式解决,我建议更好地选择kubectl describe pod podname
名称,您现在可能会看到为什么您一直在尝试的服务失败的原因。就我而言,我发现在进行部署时,configmap中缺少一些键值。
我也遇到了这个问题,问题是由于在控制器上使用字段引用的环境变量。另一个控制器和工人能够解析参考。我们没有时间追查问题的原因,结束拆除群集并重建它。
- 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}]"
检查你的secrets
和config maps
(kubectl get [secrets|configmaps]
)已经存在并正确指向YAML描述符文件,在这两种情况下,不正确的秘密/配置图(未创建,拼写错误等)会导致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事件,它表明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