====== 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]]// ).