#docker #kubernetes #certificate
#docker #kubernetes #сертификат
Вопрос:
я изучаю docker / k8s; Я хочу передать / сохранить файл .pem в свой контейнер boostrap, который работает в кластере k8s. Этот контейнер использует .pem для создания секрета k8s (kubectl create secrets …), который будет использоваться другими приложениями, работающими на k8s, путем монтирования секретов kubernetes.
Я могу придумать следующие варианты,
- Я могу передать данные .pem как ENV в контейнер.
- Я могу создать образ с помощью файла .pem.
- Я могу сохранить файл .pem в S3 и загрузить его из контейнера.
Хотел понять, какой из них является наилучшим практическим / безопасным методом для выполнения этой задачи.
Ответ №1:
Я видел, как это делается несколькими способами, но я бы предложил использовать карту конфигурации, чтобы файл pem находился внутри вашего кластера k8s, и вам не приходилось иметь дело с шифрованием в s3 и тому подобным. Кроме того, это позволяет вашей команде devops обрабатывать обслуживание, а не разработчикам приложений, если вы включите это в код docker
Карта конфигурации Kubernetes Docs
-
Создайте карту конфигурации
kubectl -n <namespace-for-config-map-optional> create configmap ca-pemstore — from-file=my-cert.pem
-
Добавьте новую конфигурацию в свой файл pod yaml
apiVersion: v1 kind: Pod metadata: name: <some metadata name> spec: containers: - name: <container name> image: <container image> volumeMounts: - name: ca-pemstore mountPath: /etc/ssl/certs/my-cert.pem subPath: my-cert.pem readOnly: false ports: - containerPort: 80 command: ... args: ... volumes: - name: ca-pemstore configMap: name: ca-pemstore
Комментарии:
1. Спасибо, Эдвард, но это именно то, что делает мой контейнер начальной загрузки… он создает секреты k8s с помощью файла .pem, который затем монтируется приложением. Мой вопрос в том, как лучше всего передавать .pem в контейнер начальной загрузки?
2. @nevosial Итак, проблема в том, что вы пытаетесь выяснить, как создать файл pem динамически? например, действие github, которое создает файл pem, а затем создает configmap для использования?
3. Отредактировал вопрос. У меня тоже есть файл .pem. мне нужно передать его в контейнер начальной загрузки, который создаст секрет k8s. Я просто пытаюсь понять, как наилучшим образом передать файл .pem в контейнер начальной загрузки.
4. Что такое контейнер начальной загрузки? Вы говорите о контейнере инициализации? Чтобы прояснить это в моей голове, у вас есть файл (.pem), из которого вы создаете секрет (k create secret —from-file), и этот секрет монтируется как нечто (env или volume) во втором контейнере? Если вы посмотрите на контейнеры инициализации. Их цель — подготовить среду для приложения перед запуском приложения.
5. @Zambozo Итак, контейнеры инициализации связаны с конкретным приложением / модулем, где его можно определить так, чтобы модуль имел необходимый ресурс….. Однако секрет, который создает этот загрузчик, является общим для всех последующих модулей в кластере k8s. Тем не менее, я думаю, что вопрос справедлив и для контейнера инициализации… каков наилучший способ передачи файла .pem в контейнер инициализации?
Ответ №2:
(Хотя можно сказать, что секреты K8S являются типом карты конфигурации).
Я думаю, что лучшим подходом является использование секретов K8S (поверх конфигурационных карт), как указано в здесь.
apiVersion: v1
kind: Secret
metadata:
name: secret-tls
type: kubernetes.io/tls
data:
# the data is abbreviated in this example
tls.crt: |
MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
tls.key: |
MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
Затем вы можете создать модуль, который имеет доступ к секретным данным через том:
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
# name must match the volume name below
- name: secret-volume
mountPath: /etc/secret-dir
# The secret data is exposed to Containers in the Pod through a Volume.
volumes:
- name: secret-volume
secret:
secretName: secret-tls
(*) В этом конкретном примере tls.crt
и tls.key
будут созданы под /etc/secret-dir
.