Создать ConfigMap или обычный Secret из пар ключ-значение командной строки.
→Используйте `kubectl create configmap <name> --from-literal=<key>=<value>` или `kubectl create secret generic <name> --from-literal=<key>=<value>`.
Почему: `--from-literal` предназначен для прямого ввода пар ключ-значение. Используйте флаг несколько раз для нескольких ключей. Это быстрее, чем создание YAML-файла для простых случаев.
Источник↗
Внедрить все пары ключ-значение из ConfigMap или Secret в контейнер как переменные среды.
→В спецификации контейнера используйте `envFrom` с `configMapRef` или `secretRef`. Пример: `envFrom: [{configMapRef: {name: my-config}}]`.
Почему: `envFrom` — это массовая операция, которая сопоставляет все ключи из источника с переменными среды. Это позволяет избежать ручного перечисления каждого ключа.
Источник↗
Внедрить одно конкретное значение из ConfigMap или Secret как переменную среды.
→Используйте `env.valueFrom`. Пример: `env: [{name: LOG_LEVEL, valueFrom: {configMapKeyRef: {name: my-config, key: log_level}}}]`.
Почему: `valueFrom` обеспечивает выборочное внедрение и позволяет сопоставлять ключ источника с другим именем переменной среды.
Монтировать ConfigMap или Secret как файлы в Pod, что позволяет обновлять их в реальном времени.
→Определите `volume` типа `configMap` или `secret`. Смонтируйте его в контейнер с помощью `volumeMounts`. Файлы будут названы в соответствии с ключами.
Почему: Смонтированные файлы из ConfigMap/Secret автоматически обновляются при изменении источника. Переменные среды — нет, что требует перезапуска Pod.
Источник↗
Применить лучшие практики безопасности: запретить запуск от имени root, сделать корневую файловую систему только для чтения или указать ID пользователя.
→Используйте `securityContext` на уровне Pod или контейнера. Установите `runAsNonRoot: true`, `readOnlyRootFilesystem: true` и/или `runAsUser: <UID>`.
Почему: SecurityContext обеспечивает детальный, декларативный контроль над привилегиями контейнера, что важно для усиления безопасности приложений и соблюдения политик безопасности.
Источник↗
Предоставить Pod минимальные разрешения для доступа к Kubernetes API.
→1. Создайте пользовательский `ServiceAccount`. 2. Создайте `Role` только с необходимыми разрешениями API (например, list pods). 3. Создайте `RoleBinding` для связывания ServiceAccount и Role. 4. Назначьте ServiceAccount Pod через `spec.serviceAccountName`.
Почему: Следует принципу наименьших привилегий, минимизируя поверхность атаки в случае компрометации Pod.
Предотвратить автоматическое монтирование токена ServiceAccount в Pod, которому не требуется доступ к API.
→Установите `automountServiceAccountToken: false` в спецификации Pod или в самом ServiceAccount.
Почему: Уменьшает поверхность атаки, не предоставляя учетные данные API контейнерам, которым они не требуются.
Создать Secret для использования при завершении TLS для Ingress или другого защищенного сервиса.
→Используйте `kubectl create secret tls <secret-name> --cert=<path/to/cert.pem> --key=<path/to/key.pem>`.
Почему: Это создает Secret правильного типа `kubernetes.io/tls` со стандартными ключами данных `tls.crt` и `tls.key`, ожидаемыми контроллерами Ingress.
Предоставить метаданные Pod (например, имя, пространство имен, метки или IP-адрес узла) контейнеру.
→Используйте Downward API для проецирования метаданных как переменных среды или файлов в том `downwardAPI`. Пример: `valueFrom: {fieldRef: {fieldPath: metadata.name}}`.
Почему: Позволяет контейнерам быть самодостаточными, не требуя запросов к Kubernetes API, что упрощает конфигурацию и снижает требования RBAC.
Источник↗
Установить значения по умолчанию для запросов и лимитов CPU/памяти для всех Pod в пространстве имен.
→Создайте объект `LimitRange` в пространстве имен. Определите значения `default` и `defaultRequest` для ресурсов.
Почему: Обеспечивает наличие ограничений ресурсов для всех Pod, улучшая планирование и стабильность, даже если разработчики забыли их указать. Работает совместно с ResourceQuota.
Ограничить общий объем ресурсов (CPU, память, количество объектов), которые могут быть потреблены в пространстве имен.
→Создайте объект `ResourceQuota`. Определите жесткие лимиты в `spec.hard`, например, `requests.cpu: "4"`, `pods: "10"`.
Почему: Предотвращает потребление всех ресурсов кластера одним пространством имен или командой, обеспечивая справедливое распределение ресурсов.