====== volumes: secrets ====== Секрет – это объект, который содержит небольшое количество конфиденциальных данных, таких как пароль, токен или ключ. Секрет может быть использован: * Как файлы в томе, смонтированном на одном или нескольких его контейнерах. * В качестве переменной среды окружения контейнера. Рассмотрим generic тип секретов. Файл описания секрета может выглядеть следующим образом: apiVersion: v1 kind: Secret metadata: name: user-password-secret namespace: volumes-sample type: Opaque data: user: YWRtaW51c2VyCg== password: YWRtaW5wYXNzd29yZAo= В разделе data, по одному на строке находятся названое секрета и его значение. Значение должно быть закодировано в base64. Что бы получить представленные в примере значения, в командной строке достаочно было выполнить команды: echo adminuser | base64 YWRtaW51c2VyCg== echo adminpassword | base64 YWRtaW5wYXNzd29yZAo= Полученные значения подставить в yaml файл. Другой способ создание secret, воспользоваться программой kubectl и указать названия и значения полей секрета в командной строке. kubectl -n volumes-sample create secret generic my-secret \ --from-literal=user= adminuser --from-literal=password= adminpassword В данном примере создается секрет с именем my-secret в namespace volumes-sample. Значения секретов можно поместить в текстовый файл. Например, в файловой системе есть два файла user.txt и password.txt, содержащие логин и пароль пользователя. Создать секрет с использованием этих файлов можно следующим образом: kubectl -n volumes-sample create secret generic my-secret \ --from-file=user=user.txt --from-file=password=password.txt ==== Подключение секретов в качестве переменных среды окружения. ==== Ниже приведён приме подключения секретов в виде переменных среды окружения. apiVersion: apps/v1 kind: Deployment metadata: name: openresty namespace: volumes-sample labels: app: openresty spec: replicas: 1 selector: matchLabels: app: openresty template: metadata: labels: app: openresty spec: containers: - name: openresty image: openresty/openresty:centos-rpm env: - name: NGINX_HOST valueFrom: fieldRef: fieldPath: metadata.name envFrom: - secretRef: name: user-password-secret ports: - containerPort: 80 name: http protocol: TCP В описании контейнера, при помощи envFrom указывается секрет или секреты, откуда берутся значения для переменных среды окружения. Если использовать секрет из предыдущего примера, будут созданы две переменные среды окружения: user и password. Посмотреть переменные можно подключившись к контейнеру, так как мы это делали в разделе [[https://fatalex.cifro.netdoku.php/devops/k8s/volumes/configmap|configMap]]. Если мы хотим использовать только определенные значения из секрета или указать другие имена переменных среды окружения, потребуется явно определять каждую переменную среды окружения. apiVersion: apps/v1 kind: Deployment metadata: name: openresty namespace: volumes-sample labels: app: openresty spec: replicas: 1 selector: matchLabels: app: openresty template: metadata: labels: app: openresty spec: containers: - name: openresty image: openresty/openresty:centos-rpm env: - name: NGINX_HOST valueFrom: fieldRef: fieldPath: metadata.name - name: ENV_USER valueFrom: secretKeyRef: name: user-password-secret key: user ports: - containerPort: 80 name: http protocol: TCP В этом примере мы определили переменную среды окружения ENV_USER, значение для которой взяли из секрета user-password-secret из поля user. ==== Подключение секрет в виде файлов ==== Еще один способ подключения секретов – в виде файлов в файловой системе. В качестве примера возьмём предыдущий секрет. Пример файла манифеста: apiVersion: apps/v1 kind: Deployment metadata: name: openresty namespace: volumes-sample labels: app: openresty spec: replicas: 1 selector: matchLabels: app: openresty template: metadata: labels: app: openresty spec: containers: - name: openresty image: openresty/openresty:centos-rpm env: - name: NGINX_HOST valueFrom: fieldRef: fieldPath: metadata.name ports: - containerPort: 80 name: http protocol: TCP volumeMounts: - mountPath: "/etc/secrets" name: secret-volume readOnly: true volumes: - name: secret-volume secret: secretName: user-password-secret Традиционно в разделе volumes определяем volume c именем secret-volume. У которого значение берется из секрета с именем user-password-secret. В описании контейнера, в разделе volumeMounts подключаем этот volume к точке монтирования /etc/secrets, в режиме только для чтения. Если подключиться к контейнеру, в директории /etc/secrets можно увидеть два файла: user и password, внутри которых будет дешифрованное значение секретов. Если во время работы пода изменить содержимое секрета, то в течение некоторого времени изменится значение файлов директории /etc/secrets. При условии, что при подключении не использовали параметр subPath (//подробности в главе // //[[https://fatalex.cifro.netdoku.php/devops/k8s/volumes/configmap|configMap]]// ).