Я сам столкнулся с этой проблемой сегодня, когда пытался создать секреты и использовать их в своем файле 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, будут рассматриваться как пары ключ-значение и, следовательно, # 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
и закодированная форма (т.е. значение ключа теперь будет 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/ имеет очень четкое объяснение создания секретов
Также убедитесь, чточто для deploy.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
" не сильно помог.