Как задеплоить приложение в Kubernetes: пошаговая инструкция
Практика3 минРедакция Innovialabs
Коротко
Опубликуйте образ в registry, опишите Deployment, Service и конфигурацию в YAML, примените их через kubectl apply, проверьте rollout status и обновляйте приложение сменой тега образа.
Короткий ответ
Деплой в Kubernetes — это декларативное описание желаемого состояния. Вы не запускаете контейнеры руками, а говорите кластеру: «держи 3 копии этого образа и открой к ним доступ». Минимальный путь:
- Собрать образ и отправить его в container registry.
- Описать Deployment — какой образ и сколько реплик.
- Описать Service — стабильный адрес для подов.
- Вынести настройки в ConfigMap и Secret.
- Выполнить
kubectl applyи проверить статус.
Шаг 1. Образ в registry
Кластер скачивает образ сам, поэтому он должен лежать в доступном registry (Docker Hub, GitHub Container Registry, облачный или собственный).
docker build -t registry.example.com/shop/api:1.0.0 .
docker push registry.example.com/shop/api:1.0.0
Используйте конкретный тег версии, а не latest: так понятно, что именно запущено, и можно откатиться.
Шаг 2. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: registry.example.com/shop/api:1.0.0
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: api-config
- secretRef:
name: api-secrets
readinessProbe:
httpGet:
path: /health
port: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 256Mi
Ключевые моменты:
- labels и selector должны совпадать — по ним Deployment находит свои поды.
- readinessProbe не пускает трафик на под, пока приложение не готово.
- resources помогают планировщику и защищают ноду от прожорливого контейнера. Значения подбирайте под своё приложение.
Шаг 3. Service
Поды пересоздаются и меняют IP. Service даёт им постоянное имя внутри кластера:
apiVersion: v1
kind: Service
metadata:
name: api
spec:
selector:
app: api
ports:
- port: 80
targetPort: 8080
Другие сервисы обращаются к приложению по адресу http://api. Для доступа извне обычно добавляют Ingress.
Шаг 4. Конфигурация
kubectl create configmap api-config --from-literal=LOG_LEVEL=info
kubectl create secret generic api-secrets --from-literal=DB_PASSWORD=change-me
Не храните секреты в образе и в открытом виде в Git. Для GitOps-подхода используют зашифрованные секреты или внешние хранилища.
Шаг 5. Применение и проверка
kubectl apply -f deployment.yaml -f service.yaml
kubectl rollout status deployment/api
kubectl get pods -l app=api
kubectl logs deployment/api
Если под не стартует, начните с kubectl describe pod <name> — в разделе Events видны ошибки вроде ImagePullBackOff (нет доступа к образу) или CrashLoopBackOff (приложение падает при старте).
Обновление и откат
Чтобы выкатить новую версию, поменяйте тег образа в YAML и снова выполните kubectl apply. По умолчанию Deployment делает rolling update: поднимает новые поды и убирает старые постепенно, ориентируясь на readinessProbe.
kubectl rollout history deployment/api
kubectl rollout undo deployment/api
Частые ошибки
- Тег
latest— непонятно, какая версия работает, а откат становится лотереей. - Нет readinessProbe — трафик идёт на ещё не готовые поды во время обновления.
- Ручные правки через
kubectl editбез отражения в YAML — конфигурация в Git и в кластере расходится. - Отсутствие
imagePullSecretsдля приватного registry.