Чем отличаются Secrets и ConfigMaps в Kubernetes?

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

Ответ

Secrets и ConfigMaps — это ресурсы Kubernetes для управления конфигурацией, но с разным назначением и уровнем безопасности.

Основные различия:

Аспект ConfigMap Secret
Назначение Хранение неконфиденциальных данных (настройки приложений, конфигурационные файлы, переменные окружения). Хранение конфиденциальных данных (пароли, токены API, SSH-ключи, TLS-сертификаты).
Хранение Данные хранятся в открытом виде (plain text). Данные хранятся в кодировке base64 (это кодирование, а не шифрование). Для повышения безопасности следует использовать шифрование на уровне etcd (например, через EncryptionConfiguration) или внешние секреты-менеджеры (HashiCorp Vault, AWS Secrets Manager).
Типы Обычный ресурс. Имеет встроенные типы (Opaque, kubernetes.io/tls, kubernetes.io/dockerconfigjson, kubernetes.io/service-account-token).
Обновление Изменения не применяются автоматически в запущенных подах. Для обновления требуется перезапуск пода, использование sidecar-контейнера (например, Reloader) или чтение конфигурации приложением динамически. Аналогично ConfigMap — изменения не применяются автоматически.

Пример ConfigMap для настроек приложения:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  app.properties: |
    logging.level=INFO
    cache.size=100
    feature.flag.enabled=true

Пример Secret для пароля БД:

apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
data:
  username: YWRtaW4=          # base64 для 'admin'
  password: cGFzc3dvcmQxMjM=  # base64 для 'password123'

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

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: app
    image: myapp:latest
    env:
      - name: DB_PASSWORD
        valueFrom:
          secretKeyRef:
            name: db-credentials
            key: password
    envFrom:
      - configMapRef:
          name: app-config
    volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: app-config

Практический совет: Всегда используйте минимально необходимые права доступа (RBAC) для секретов и избегайте хранения их в репозитории кода. Для управления секретами в Git используйте инструменты типа Sealed Secrets или SOPS.