3.3.3 · блок 3
Конфигурация и планирование: ConfigMap, Secret, scheduling
Конфигурация и планирование: ConfigMap, Secret, scheduling
Зачем это нужно
Образ inference один; окружения разные: dev/staging/prod, разные URL S3, пороги модели, лимиты batch size. Зашивать это в Dockerfile — антипаттерн. Kubernetes отделяет образ от конфигурации (ConfigMap, Secret) и решает куда посадить Pod (scheduler, taints, affinity).
Для ML-платформы это же механизм: GPU-ноды только для тяжёлых Pod'ов, prod namespace без debug env.
Основные идеи
ConfigMap — некритичная конфигурация. Key-value или целые файлы. Монтируют как env или volume:
env:
- name: MODEL_NAME
valueFrom:
configMapKeyRef:
name: scorer-config
key: model_name
Пример: batch_size, log_level, путь к конфигу препроцессинга.
Secret — чувствительные данные. Base64 в etcd (не шифрование по умолчанию — в prod нужен encryption at rest). API keys, пароли БД, imagePullSecrets для private registry. Не коммитьте Secret YAML с реальными значениями в Git — используйте Sealed Secrets / external secret operator в enterprise; на курсе — kubectl create secret.
Разделение config и secrets. В Helm (3.4) values для ConfigMap; Secret — отдельный chart overlay или CI-generated.
Scheduler basics. kube-scheduler фильтрует nodes (достаточно ресурсов? tolerations?) и ранжирует (affinity, spread).
Taints и tolerations. Node «загрязнена» taint gpu=true:NoSchedule — обычные Pod'ы не сядут. Pod с matching tolerations — может. Так выделяют GPU-пул для inference на Triton.
Node affinity / anti-affinity. «Запускать только на nodes с label zone=east» или «не класть все реплики на одну node» — для отказоустойчивости.
Pod topology spread. Равномерное распределение реплик по зонам — меньше риск, что падение одной AZ убьёт весь сервис.
Priority and preemption. В перегруженном кластере важные Pod'ы (prod inference) могут вытеснять менее приоритетные — тема эксплуатации.
Как это выглядит на практике
Inference Deployment:
- ConfigMap
scorer-config:S3_BUCKET,FEATURE_VERSION. - Secret
scorer-secrets:AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY. - Node selector:
workload: inference-cpuдля лёгкого API; для GPU — tolerationnvidia.com/gpu.
Изменили ConfigMap — Pod не перезапустится автоматически (если только env не через downward API с reload sidecar). После kubectl apply ConfigMap нужен rollout restart: kubectl rollout restart deployment/scorer.
Scheduling debug:
kubectl describe pod scorer-xxx | grep -A5 Events
FailedScheduling + 0/5 nodes available: 5 Insufficient nvidia.com/gpu — ясный сигнал.
Практикум: связать Deployment с PVC (следующий урок), ConfigMap для пути модели на томе, limits CPU/RAM.
Что сделать после занятия
- [ ] Вынесите все env из Dockerfile в ConfigMap + Secret; пересоберите образ без секретов.
- [ ] Добавьте label на node (или используйте учебный taint) и настройте toleration на Pod.
- [ ] Выполните rollout restart после смены ConfigMap и проверьте, что новые env подхватились.