次の helm chart を使用してSonarqube
サービスを実行しようとしています。
したがって、設定はminikubeクラスターでMySQLおよびSonarqubeサービスを開始し、SonarqubeサービスはMySQLサービスと通信してデータをダンプするようなものです。
helm install
に続いてkubectl get pods
を実行すると、MySQL
ポッドステータスがrunning
と表示されますが、Sonarqube
posステータスはCreateContainerConfigError
と表示されます。マウントボリュームに関係があると思います: link 。私はそれを修正する方法がよくわかりませんが(Kubernetes環境に慣れていないと学習するまで:))
今日、私は秘密を作成し、ポッド定義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
で2つの項目を指定したときに1つのデータしかありませんでした。これは、kubectl get secrets secret_name
とsecret_name_definition.yaml
の使用の違いによるものです。前者の場合、yamlのデータセクションにリストされているすべてのアイテムがキーと値のペアと見なされるため、アイテムの数が表示されます。 kubectl get secrets secret_name
を使用してクエリするときの正しい出力としてエラー「CreateContainerConfigError」を参照してください。
オプションkubectl create secret <secret_name>
で--from-literal=
を使用する場合、定義するすべてのキーと値のペアに対してプレフィックス--from-literal=
を使用する必要があるため、この問題は発生しないことに注意してください。
同様に、--from-file=
オプションを使用している場合、キーと値のペアごとに1回ずつプレフィックスを複数回指定する必要がありますが、--from-literal
とエンコードされた形式(つまりvalue 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
エラーが発生しましたが、少しデバッグした後、kubernetes secretをDeployment yamlで使用していることが原因であることがわかりました。実際には、ポッドが作成されていた名前空間に存在/作成されていませんでした。
また、前の回答を読んだ後、この特定のエラーが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}]"
既に存在し、YAML記述子ファイルで正しく指定されているsecrets
およびconfig 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
を使用して、この問題が解決するかどうかを確認してください。同じエラーが発生し、ポッドイベントを調べたところ、mysecrets.txtファイル内のキーと値のペアが正しく読み取られていないことが示唆されました。 1行しかない場合、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