Рекомендации по использованию файлов сертификатов (.pem) в контейнере

#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

  1. Создайте карту конфигурации

     kubectl -n <namespace-for-config-map-optional> create configmap ca-pemstore  from-file=my-cert.pem
      
  2. Добавьте новую конфигурацию в свой файл 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 .