Как работать с Secret в Kubernetes?

«Как работать с Secret в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Secrets в Kubernetes используются для хранения конфиденциальных данных, таких как пароли, токены API или TLS-сертификаты. В production я никогда не храню их в виде plain-text в манифестах, закоммиченных в Git.

Безопасное создание и использование:

  1. Создание Secret из файла или переменных окружения (предпочтительный способ):

    # Пароль хранится в локальном файле, который добавлен в .gitignore
    echo -n 'mySuperSecretPassword123' > ./db_password.txt
    
    kubectl create secret generic app-db-credentials 
      --from-file=password=./db_password.txt 
      --from-literal=username=prod-user 
      --namespace my-app
  2. Подключение Secret к Pod'у в качестве переменных окружения:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-app-pod
    spec:
      containers:
      - name: app
        image: my-app:latest
        env:
        - name: DB_USERNAME          # Имя переменной в контейнере
          valueFrom:
            secretKeyRef:
              name: app-db-credentials # Имя Secret
              key: username            # Ключ в Secret
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-db-credentials
              key: password
  3. Монтирование Secret как файла (например, для TLS-сертификата):

    spec:
      volumes:
      - name: tls-certs
        secret:
          secretName: nginx-tls-secret
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: tls-certs
          mountPath: /etc/nginx/ssl
          readOnly: true

Критически важные практики для production:

  • Шифрование в etcd: Обязательно настраиваю EncryptionConfiguration для Kubernetes, чтобы данные Secrets шифровались на уровне хранилища (etcd). Без этого они хранятся в base64, что легко обратимо.
  • Внешние системы (Secrets as a Service): Для высоких требований безопасности использую интеграцию с внешними хранилищами: HashiCorp Vault (через CSI Driver или Vault Agent Sidecar), AWS Secrets Manager (через External Secrets Operator) или Azure Key Vault.
  • RBAC: Строго ограничиваю доступ к Secrets с помощью RoleBindings и ServiceAccounts. Приложения получают доступ только к своим Secrets.
  • Ротация: Регулярно ротирую секреты (например, токены доступа) и обновляю их в Kubernetes, часто с помощью операторов, которые автоматически синхронизируют их из внешних систем.