В проде нужен веб-сервис из трёх одинаковых реплик. Почему не стоит создавать три Pod вручную и что в этой задаче даёт Deployment?
как ответить Pod — отдельный экземпляр приложения, а не контроллер желаемого состояния. Deployment через ReplicaSet поддерживает нужное число взаимозаменяемых Pod, создаёт замену при их потере и управляет постепенным обновлением шаблона. Поэтому в проде обычно описывают Deployment, а не набор Pod вручную.
разбор Одиночный Pod подходит для эксперимента или объекта, жизненным циклом которого управляет другой контроллер. Если такой Pod удалить, сам по себе он не восстановится. restartPolicy решает другую задачу: kubelet может перезапустить контейнер внутри существующего Pod на том же узле, но это не заменяет потерянный Pod на уровне кластера.
Deployment хранит шаблон Pod и желаемое число реплик. Его контроллер создаёт ReplicaSet, постоянно сравнивает желаемое состояние с фактическим и добавляет либо убирает реплики. Изменение шаблона запускает rollout новой ревизии, которым можно управлять отдельно.
Практическая граница: Deployment рассчитан на взаимозаменяемые stateless-реплики. Он не переносит данные с погибшего контейнера и не делает приложение отказоустойчивым сам по себе — состояние, зависимости и корректное завершение процесса проектируют отдельно.
чтобы прозвучать сильнее Добавь, что ручное удаление Pod под управлением Deployment не меняет желаемое число реплик: ReplicaSet создаст замену. Для стабильной сетевой идентичности или привязанного хранилища уже рассматривают StatefulSet.
devops-kubernetes-001 · junior · high Pod запущен, но Service не отправляет на него трафик. Что не так в манифестах и как ты проверишь гипотезу?
apiVersion: v1
kind: Service
metadata:
name: api
spec:
selector:
app: api
ports:
- port: 80
targetPort: 8080
---
apiVersion: v1
kind: Pod
metadata:
name: api-1
labels:
app: backend
spec:
containers:
- name: api
image: example/api:1
ports:
- containerPort: 8080
как ответить Селектор Service ищет app: api, а у Pod стоит app: backend, поэтому контроллер не добавит его адрес в EndpointSlice. Я бы сравнил селектор и метки, затем посмотрел kubectl get endpointslice -l kubernetes.io/service-name=api. После исправления метки проверил бы readiness и соответствие targetPort порту, который действительно слушает приложение.
разбор Service даёт стабильную точку доступа к меняющемуся набору backend-адресов. Для Service с селектором control plane находит подходящие Pod и ведёт связанные EndpointSlice; IP конкретного Pod клиентам запоминать не нужно. В примере пересечение селектора и меток пустое, поэтому Service существует, но направлять соединения ему некуда.
Проверка идёт от декларации к факту:
kubectl get service api -o yaml — увидеть селектор, port и targetPort;kubectl get pods --show-labels — проверить точные ключи и значения меток;kubectl get endpointslice -l kubernetes.io/service-name=api — увидеть реальные backend-адреса и их условия готовности;- запросить приложение напрямую внутри Pod или через временный диагностический Pod, чтобы отделить проблему Service от проблемы процесса.
containerPort сам по себе не открывает порт и не проверяет, что процесс его слушает. Даже после исправления метки трафик не заработает при неверном targetPort, неготовом Pod или сетевой политике, запрещающей соединение.
чтобы прозвучать сильнее Уточни, что Service может работать и без селектора, но тогда EndpointSlice создаёт другой контроллер или оператор. Для обычного Deployment пустой EndpointSlice почти всегда заставляет сначала проверить labels, selector и readiness.
devops-kubernetes-002 · junior · high Чем readiness probe отличается от liveness probe и зачем отдельно нужна startup probe?
как ответить Readiness отвечает, можно ли сейчас направлять трафик в контейнер: при провале Pod исключают из обычного обслуживания через Service, но контейнер не перезапускают. Liveness ищет состояние, из которого нужен перезапуск контейнера. Startup probe защищает медленный старт: пока она не прошла, liveness и readiness не запускаются.
полный разбор и проверка ответа арбитром — в приложении
devops-kubernetes-003 · junior · high На дашборде узлы почти пусты, но Pod с такими resources остаётся Pending с Insufficient cpu. Почему scheduler не смотрит на текущую загрузку и какую роль играют requests и limits?
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
как ответить Scheduler сравнивает сумму requests с allocatable узла, а не с мгновенной загрузкой: для этого Pod ему нужны 250m CPU и 256 MiB памяти. Limit задаёт границу использования во время работы, но его уменьшение само по себе не освобождает планировочную ёмкость. Нужно проверить фактический манифест после admission, requests всех контейнеров и уже зарезервированные requests на узлах.
полный разбор и проверка ответа арбитром — в приложении
devops-kubernetes-004 · junior · high Что положишь в ConfigMap, а что в Secret? Почему Kubernetes Secret нельзя считать шифрованием секрета по умолчанию?
как ответить ConfigMap хранит несекретную конфигурацию, а Secret предназначен для паролей, токенов и ключей. Значения Secret обычно представлены в base64, но кодирование не даёт конфиденциальности; без отдельной настройки данные в etcd могут храниться незашифрованными. Нужны шифрование at rest, минимальный RBAC и ограничение того, какие контейнеры получают Secret.
полный разбор и проверка ответа арбитром — в приложении
devops-kubernetes-005 · junior · medium