Ответ
В моих проектах на Node.js развертывание в Kubernetes было частью CI/CD-пайплайна. Вот типичный процесс:
-
Сборка и тегирование Docker-образа: После успешного прохождения тестов в GitLab CI/CD (или аналогичном инструменте) запускался скрипт сборки.
# Определяем тег образа (например, по хэшу коммита или номеру сборки) IMAGE_TAG=$CI_COMMIT_SHA docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG . docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG -
Обновление конфигурации развертывания: Для управления манифестами мы использовали Helm. Обновление сводилось к изменению значения тега образа в
values.yamlили через команду.# Способ 1: Обновление через set (для простых случаев) helm upgrade --install my-app ./chart --set image.tag=$IMAGE_TAG --namespace production # Способ 2: Использование отдельного values-файла, который обновлялся в пайплайне -
Стратегия обновления: В манифесте Deployment была настроена стратегия
RollingUpdate. Это позволяло Kubernetes постепенно заменять старые поды новыми без простоя сервиса.spec: strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 1Kubernetes сам управлял процессом: создавал под с новой версией, ждал его готовности (readiness probe), затем удалял один старый под, и так далее.
-
Проверки (Health Checks): Критически важны были
livenessProbeиreadinessProbeв конфигурации пода. Для Node.js-приложения это обычно HTTP-эндпоинт/health, который проверяет подключение к БД и другим критическим сервисам.livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 30 periodSeconds: 10 -
Откат (Rollback): В случае проблем (например, падение метрик в Prometheus после деплоя) откат выполнялся одной командой:
helm rollback my-app 0 # Откат к предыдущему релизу # или kubectl rollout undo deployment/my-app
Таким образом, процесс был автоматизирован, предсказуем и позволял быстро реагировать на проблемы.
Ответ 18+ 🔞
Ну и история, блядь, с этими деплоями в кубере! Как будто на дворе 2002-й год, а не современная разработка. Слушай, я тебе сейчас так распишу, что ты сам от себя охуеешь от простоты.
В общем, у меня в Node.js проектах этот цирк с Kubernetes был впаян прямо в CI/CD пайплайн. Представляешь? Автоматизация, ёпта, полная — чтобы руками не ебаться каждый раз.
Первым делом, конечно, сборка и тегирование Docker-образа. После того как все тесты в GitLab CI/CD пролетели удачно (а если нет — всем пидарасам шерстяным по шапке), запускался скрипт. Тут всё просто, как хуй с горы:
# Определяем тег образа (например, по хэшу коммита или номеру сборки)
IMAGE_TAG=$CI_COMMIT_SHA
docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG .
docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG
Толкаем образ в registry и поехали дальше. Дальше самое интересное — обновление конфигурации развертывания. Мы для управления этими манифестами использовали Helm, чтобы не ебаться с кучей yaml-файлов. Обновление сводилось к тому, чтобы подменить тег образа. Делалось это либо через прямое указание в команде, либо через файл values.yaml.
# Способ 1: Обновление через set (для простых случаев)
helm upgrade --install my-app ./chart
--set image.tag=$IMAGE_TAG
--namespace production
# Способ 2: Использование отдельного values-файла, который обновлялся в пайплайне
Дальше — магия. Чтобы сервис не ложился на время обновления, в манифесте Deployment была настроена стратегия RollingUpdate. Это, блядь, гениальная штука! Кубер сам, как хитрая жопа, постепенно заменяет старые поды новыми.
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 1
Он создаёт новый под, ждёт, пока тот скажет «я готов» (это вот readiness probe), потом один старый удаляет. И так по кругу, пока все не обновились. Красота, ёбана!
А про проверки (Health Checks) я тебе что скажу? Это святое! Без livenessProbe и readinessProbe — вообще никуда. Для Node.js-приложения мы всегда делали HTTP-эндпоинт /health, который проверял, жива ли база данных и прочая требуха.
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
Если проба не проходит — кубер сам понимает, что под сдох, и убивает его. Автоматизация, ёпта!
Ну и главный козырь — откат (Rollback). Вдруг после деплоя метрики в Prometheus поползли вниз, как угарелые? Без паники! Одна команда — и ты уже в прошлом.
helm rollback my-app 0 # Откат к предыдущему релизу
# или
kubectl rollout undo deployment/my-app
Вот и весь сказ. Процесс получается автоматизированный, предсказуемый, и если что-то пошло не так — терпения ноль ебать, откатываемся за секунды. Удобно, блядь, как вилкой в глаз!