Допишите минимальный манифест Deployment для приложения с 3 репликами и портом контейнера.
Допишите минимальный Deployment для stateless веб-приложения.
Ограничения: 3 реплики; контейнер слушает порт 8080; держите selector и метки Pod-шаблона согласованными. Не добавляйте Service или пробы — только валидный Deployment.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: # ??? сколько
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
# объявите порт контейнера здесь
Впишите число реплик и порт контейнера.
Задайте spec.replicas: 3 и добавьте ports под контейнером с containerPort: 8080. selector.matchLabels должен совпадать с template.metadata.labels (app: web), иначе Deployment не подхватит ни одного Pod. apiVersion — apps/v1, kind — Deployment; template — это Pod-спека, которую ReplicaSet штампует три раза.
- ✗Метки selector не совпадают с метками шаблона, и Pod не управляются
- ✗Класть
containerPortилиreplicasна неверный уровень вложенности - ✗Ставить
kind: Pod/apiVersion: v1вместоDeployment/apps/v1
- →Что API отклонит при apply, если selector не совпадает с метками шаблона?
- →Почему
containerPortинформационный, а не то, что реально открывает приложение?
Решение
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 8080
Если они расходятся, apiserver отклонит объект: Deployment не смог бы подхватить свои Pod. containerPort — это информационное поле (документирует порт); трафик к приложению открывает Service, а не оно.
replicas: 3живёт на уровнеspecсамого Deployment (не у контейнера).- Порт объявляется как список
portsсcontainerPort: 8080внутри контейнера. selector.matchLabels(app: web) обязан совпадать сtemplate.metadata.labels.