Как декларативно определить секретную карту Kubernetes в CI, не передавая секреты в git? - PullRequest
0 голосов
/ 21 июня 2020

Я хочу определить карту секретов Kubernetes как часть моего конвейера развертывания. Согласно документации Kubernetes, существует два способа определения секрета.

  1. Декларативное использование .yml с секретным объектом
  2. Императивное использование kubectl create secret generic

Декларативный подход требует написания YAML, подобного приведенному ниже.

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  username: bXktYXBw
  password: Mzk1MjgkdmRnN0pi

Я хочу иметь возможность проверять все файлы Kubernetes YAML на git, чтобы я мог запускать их на CI сервер. Проверка в YAML означает, что секрет хранится в git, что не очень хорошо для безопасности. Я могу поместить секрет в хранилище секретов моей системы CI, но тогда как мне создать секретный YAML, который ссылается на переменную среды ОС во время вызова kubectl.

Вопросы:

  • Как определить секрет Kubernetes из конвейера CI без необходимости фиксировать секреты в системе управления версиями?
  • Есть ли лучший практический подход для определения секретов как части CI для K8s?

Ответы [ 3 ]

3 голосов
/ 21 июня 2020

Нет действительно хорошего способа безопасного управления секретами с ванильным Kubernetes. Если вы расшифруете секрет или внедрите незашифрованный секрет в свой конвейер CI / CD и создадите Kubernetes Secret, у вас будет расшифрованная строка в кодировке Base64 для хранения в вашем кластере Kubernetes (Etcd).

Большинство компаний I недавно мы решили либо сохранить секрет в своем хранилище ключей и использовать контроллер Kubernetes для ввода секрета во время выполнения, либо использовать контроллер для управления зашифрованными секретами, такими как sealed-secrets или Камус . Использование зашифрованных секретов может быть хорошим вариантом, если вы хотите хранить свои секреты в Git.

Первоклассная поддержка Hashicorp Vault и Kubernetes: https://github.com/hashicorp/vault-k8s

Взгляните на это сообщение в блоге Banzai Cloud для более подробного объяснения: Повторно вводить секреты непосредственно в модули из Vault

1 голос
/ 22 июня 2020

Я закончил тем, что взломал это с помощью bash скрипта для вывода секрета yaml secret.yaml.sh

cat <<EOF 
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
type: Opaque
data:
  username: $1
  password: $2
  jdbcUrl: $3
EOF

Затем в моем конвейере CI вызвать secret.yml.sh и передать значения в кодировке base64, которые хранятся в хранилище учетных данных системы CI, а затем направьте его на kubectl, например, ./secret.yaml.sh $USERNAME $PASSWORD $URL | kubectl apply -f -

Этот хак позволяет мне запустить конвейер CI и обновить секреты на основе того, что хранится в системах CI.

Как отмечали другие, секреты в Kubernetes etcd небезопасны, и с k8s лучше использовать систему управления ключами. Однако у меня нет доступа к хранилищу ключей для этого проекта.

0 голосов
/ 21 июня 2020

Вы можете зашифровать секрет и передать зашифрованный секрет в git, и при развертывании его необходимо расшифровать. Например, хранилище ansible можно использовать, если вы используете ansible в качестве инструмента CI.

Если вы используете Jenkins, вы можете использовать учетные данные или плагин хранилища Hashicorp для хранения секрета.

Если вы находитесь в облаке publi c, тогда доступны AWS KMS, Azure Vault et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...