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.

Посмотреть переменные можно подключившись к контейнеру, так как мы это делали в разделе 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).