Секрет – это объект, который содержит небольшое количество конфиденциальных данных, таких как пароль, токен или ключ.
Секрет может быть использован:
- Как файлы в томе, смонтированном на одном или нескольких его контейнерах.
- В качестве переменной среды окружения контейнера.
Рассмотрим 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.
Посмотреть переменные можно подключившись к контейнеру, так как мы это делали в разделе 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 (подробности в главе configMap).
<- Оглавление