• Русский
  • Настройка Secrets

    Понимание Secrets

    В Kubernetes (k8s) Secret — это базовый объект, предназначенный для хранения и управления конфиденциальной информацией, такой как пароли, OAuth-токены, SSH-ключи, TLS-сертификаты и API-ключи. Его основная цель — предотвратить прямое внедрение чувствительных данных в определения Pod или образы контейнеров, что повышает безопасность и переносимость.

    Secrets похожи на ConfigMaps, но предназначены специально для конфиденциальных данных. Обычно они хранятся в base64-кодировке и могут использоваться подами различными способами, включая монтирование в виде томов или предоставление в виде переменных окружения.

    Характеристики использования

    • Повышенная безопасность: По сравнению с конфигурационными картами в открытом виде (Kubernetes ConfigMap), Secrets обеспечивают лучшую защиту, храня конфиденциальную информацию в Base64-кодировке. Этот механизм в сочетании с возможностями Kubernetes по контролю доступа значительно снижает риск утечки данных.

    • Гибкость и управление: Использование Secrets предоставляет более безопасный и гибкий подход, чем жесткое кодирование конфиденциальной информации непосредственно в файлах определения Pod или образах контейнеров. Такое разделение упрощает управление и изменение чувствительных данных без необходимости менять код приложения или образы контейнеров.

    Поддерживаемые типы

    Kubernetes поддерживает различные типы Secrets, каждый из которых предназначен для конкретных случаев использования. Платформа обычно поддерживает следующие типы:

    • Opaque: универсальный тип Secret для хранения произвольных пар ключ-значение с конфиденциальными данными, такими как пароли или API-ключи.

    • TLS: специально предназначен для хранения сертификатов и приватных ключей протокола TLS (Transport Layer Security), часто используемых для HTTPS и безопасного ingress.

    • SSH Key: используется для хранения приватных SSH-ключей, часто для безопасного доступа к Git-репозиториям или другим сервисам с поддержкой SSH.

    • SSH Authentication (kubernetes.io/ssh-auth): хранит данные аутентификации для передачи данных по протоколу SSH.

    • Username/Password (kubernetes.io/basic-auth): используется для хранения учетных данных базовой аутентификации (имя пользователя и пароль).

    • Image Pull Secret (kubernetes.io/dockerconfigjson): хранит JSON-строку аутентификации, необходимую для загрузки образов контейнеров из приватных репозиториев образов (Docker Registry).

    Способы использования

    Secrets могут использоваться приложениями внутри подов различными способами:

    • В виде переменных окружения: конфиденциальные данные из Secret могут быть внедрены непосредственно в переменные окружения контейнера.

    • В виде смонтированных файлов (тома): Secrets могут монтироваться в виде файлов в том пода, позволяя приложениям читать конфиденциальные данные по заданному пути.

    Примечание: Экземпляры Pod в рабочих нагрузках могут ссылаться только на Secrets в том же namespace. Для расширенного использования и YAML-конфигураций обратитесь к официальной документации Kubernetes.

    Создание Secret типа Opaque

    kubectl create secret generic my-secret \
      --from-literal=username=admin \
      --from-literal=password=Pa$$w0rd

    YAML

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    type: Opaque
    data:
      username: YWRtaW4= # base64 от "admin"
      password: UGEkJHcwcmQ= # base64 от "Pa$$w0rd"

    Вы можете декодировать их так:

    echo YWRtaW4= | base64 --decode  # вывод: admin

    Создание Secret типа Docker registry

    kubectl create secret docker-registry my-docker-creds \
      --docker-username=myuser \
      --docker-password=mypass \
      --docker-server=https://index.docker.io/v1/ \
      --docker-email=my@example.com

    YAML

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-docker-creds
    type: kubernetes.io/dockerconfigjson
    data:
      .dockerconfigjson: eyJhdXRocyI6eyJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOnsidXNlcm5hbWUiOiJteXVzZXIiLCJwYXNzd29yZCI6Im15cGFzcyIsImVtYWlsIjoibXlAZXhhbXBsZS5jb20iLCJhdXRoIjoiYlhsMWMyVnlPbTE1Y0dGemN3PT0ifX19

    K8s автоматически преобразует ваше имя пользователя, пароль, email и информацию о сервере в стандартный формат входа Docker:

    {
      "auths": {
        "https://index.docker.io/v1/": {
          "username": "myuser",
          "password": "mypass",
          "email": "my@example.com",
          "auth": "bXl1c2VyOm15cGFzcw=="  # base64(username:password)
        }
      }
    }

    Этот JSON затем кодируется в base64 и используется в поле data Secret.

    Используйте его в Pod:

    imagePullSecrets:
      - name: my-docker-creds

    Создание Secret типа Basic Auth

    apiVersion: v1
    kind: Secret
    metadata:
      name: basic-auth-secret
    type: kubernetes.io/basic-auth
    stringData:
      username: myuser
      password: mypass

    Создание Secret типа SSH-Auth

    Сценарий использования: хранение приватных SSH-ключей (например, для доступа к Git).

    apiVersion: v1
    kind: Secret
    metadata:
      name: ssh-key-secret
    type: kubernetes.io/ssh-auth
    stringData:
      ssh-privatekey: |
        -----BEGIN OPENSSH PRIVATE KEY-----
        ...
        -----END OPENSSH PRIVATE KEY-----

    Создание Secret типа TLS

    Сценарий использования: TLS-сертификаты (используются Ingress, вебхуками и др.)

    kubectl create secret tls tls-secret \
    --cert=path/to/tls.crt \
    --key=path/to/tls.key

    YAML

    apiVersion: v1
    kind: Secret
    metadata:
      name: tls-secret
    type: kubernetes.io/tls
    data:
      tls.crt: <base64>
      tls.key: <base64>

    Создание Secret через веб-консоль

    1. Перейдите в Container Platform.

    2. В левой навигационной панели выберите Configuration > Secrets.

    3. Нажмите Create Secret.

    4. Настройте параметры.

      Примечание: В форме ввода конфиденциальные данные, такие как имя пользователя и пароль, автоматически кодируются в Base64 перед сохранением в Secret. Преобразованные данные можно просмотреть в YAML-виде.

    5. Нажмите Create.

    Как использовать Secret в Pod

    В виде переменных окружения

    env:
      - name: DB_USERNAME
        valueFrom:
          secretKeyRef:
            name: my-secret
            key: username

    Из секрета с именем my-secret берется значение по ключу username и присваивается переменной окружения DB_USERNAME.

    В виде смонтированных файлов (тома)

    volumes:
      - name: secret-volume
        secret:
          secretName: my-secret
    
    volumeMounts:
      - name: secret-volume
        mountPath: "/etc/secret"

    Последующие действия

    При создании рабочих нагрузок для нативных приложений в том же namespace вы можете ссылаться на уже созданные Secrets.

    Операции

    Вы можете нажать (⋮) справа на странице списка или выбрать Actions в правом верхнем углу страницы деталей, чтобы при необходимости обновить или удалить Secret.

    ОперацияОписание
    ОбновитьПосле добавления или обновления Secret, рабочие нагрузки, которые ссылались на этот Secret (или его элементы конфигурации) через переменные окружения, должны пересоздать свои Pods, чтобы новые настройки вступили в силу.
    Удалить
    • После удаления Secret рабочие нагрузки, которые ссылались на этот Secret (или его элементы конфигурации) через переменные окружения, могут столкнуться с проблемами из-за отсутствия источника ссылки при пересоздании Pods.
    • Пожалуйста, не удаляйте Secrets, автоматически созданные платформой, так как это может нарушить работу платформы. Например: Secrets типа service-account-token, содержащие информацию аутентификации для ресурсов namespace, и Secrets в системных namespace (таких как kube-system).