Введение: Зачем деплоить JavaScript на Kubernetes?
Современная веб-разработка немыслима без контейнеризации. Если вы пишете на JavaScript (Node.js) и хотите, чтобы ваше приложение работало стабильно, масштабировалось автоматически и было отказоустойчивым — Kubernetes (K8s) станет вашим лучшим другом.
Kubernetes — это платформа оркестрации контейнеров. Она управляет развертыванием, масштабированием и работой ваших приложений. В этом руководстве мы разберем базовый деплой простого Node.js приложения на Kubernetes. Вы узнаете, как упаковать код в Docker-образ, создать Pod, Service и Deployment.
Статья рассчитана на начинающих. Предполагается, что у вас уже установлены Docker и Minikube (или доступ к кластеру K8s).
Шаг 1: Подготовка Node.js приложения и Docker-образа
Для начала создадим простое веб-приложение на Express. Оно будет отвечать на HTTP-запросы.
1.1. Код приложения (app.js)
Создайте файл app.js:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Привет из Kubernetes!');
});
app.listen(PORT, () => {
console.log(`Сервер запущен на порту ${PORT}`);
});
1.2. Файл package.json
Создайте package.json:
{
"name": "k8s-node-app",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.18.2"
}
}
1.3. Dockerfile
Теперь создадим Dockerfile для сборки образа:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
1.4. Сборка и загрузка образа
Выполните команды:
docker build -t my-node-app:v1 .
Если вы используете Minikube, соберите образ внутри его окружения:
minikube image build -t my-node-app:v1 .
Или загрузите образ в Docker Hub/любой registry и укажите его в манифесте.
Шаг 2: Основные объекты Kubernetes (Pod, Deployment, Service)
Kubernetes работает с объектами. Для деплоя нам понадобятся три основных:
- Pod — минимальная единица, один или несколько контейнеров.
- Deployment — управляет Pod'ами, обеспечивает масштабирование и обновления.
- Service — стабильная точка доступа к Pod'ам (обычно через ClusterIP или NodePort).
2.1. Создание Deployment
Создайте файл deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node-app
image: my-node-app:v1
ports:
- containerPort: 3000
env:
- name: PORT
value: "3000"
Объяснение:
replicas: 3— запустим 3 копии приложения для отказоустойчивости.selectorиlabels— связывают Deployment с Pod'ами.image— имя вашего Docker-образа.
2.2. Создание Service
Создайте файл service.yaml для доступа к приложению:
apiVersion: v1
kind: Service
metadata:
name: node-app-service
spec:
selector:
app: node-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: NodePort
Что здесь происходит:
- Service перенаправляет трафик с порта 80 на порт 3000 контейнера.
type: NodePortоткрывает доступ к приложению через IP узла кластера (для Minikube — черезminikube service).
Шаг 3: Деплой и проверка приложения
3.1. Применение манифестов
Убедитесь, что ваш кластер запущен (например, minikube start). Выполните:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
3.2. Проверка статуса
Посмотрите, что создалось:
kubectl get pods
kubectl get deployments
kubectl get services
Вы должны увидеть три Pod'а в статусе Running.
3.3. Доступ к приложению
Если вы используете Minikube, выполните:
minikube service node-app-service
Откроется браузер с вашим приложением. Если вы работаете с облачным кластером, используйте внешний IP или порт NodePort.
Шаг 4: Масштабирование и обновление
4.1. Масштабирование
Kubernetes позволяет легко менять количество реплик:
kubectl scale deployment node-app-deployment --replicas=5
kubectl get pods
Теперь у вас 5 копий приложения.
4.2. Обновление образа
Измените код, соберите новую версию образа (v2) и выполните:
kubectl set image deployment/node-app-deployment node-app=my-node-app:v2
Kubernetes выполнит rolling update — постепенно заменит старые Pod'ы на новые.
Заключение
Мы прошли базовый путь: от Node.js приложения до его деплоя в Kubernetes. Вы узнали,