Ответ
Деплой Go-приложения в Kubernetes — это стандартный процесс, состоящий из нескольких ключевых этапов:
Шаг 1: Контейнеризация приложения (создание Docker-образа)
Для Go-приложений лучшей практикой является использование многоступенчатой сборки (multi-stage build) в Dockerfile. Это позволяет создать минимальный по размеру и безопасный образ, не содержащий исходного кода и инструментов для сборки.
Пример Dockerfile
:
# --- Стадия сборки --- #
# Используем официальный образ Go как сборщик
FROM golang:1.21-alpine AS builder
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файлы для управления зависимостями
COPY go.mod go.sum ./
# Скачиваем зависимости
RUN go mod download
# Копируем исходный код
COPY . .
# Собираем статически скомпилированный бинарный файл
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o my-app .
# --- Финальная стадия --- #
# Используем минимальный базовый образ
FROM alpine:latest
WORKDIR /root/
# Копируем только скомпилированный бинарник из стадии сборки
COPY --from=builder /app/my-app .
# Открываем порт, который слушает наше приложение
EXPOSE 8080
# Команда для запуска приложения
CMD ["./my-app"]
После создания Dockerfile, образ собирается и загружается в репозиторий (registry), например, Docker Hub, Google Container Registry (GCR) или Amazon ECR.
Шаг 2: Создание Kubernetes-манифестов
Манифесты — это YAML-файлы, описывающие желаемое состояние объектов в Kubernetes.
-
Deployment
: Описывает, как запустить и масштабировать ваше приложение. Он следит за тем, чтобы нужное количество копий (реплик) вашего приложения всегда было запущено.apiVersion: apps/v1 kind: Deployment metadata: name: my-go-app-deployment spec: replicas: 3 # Запустить 3 экземпляра приложения selector: matchLabels: app: my-go-app template: metadata: labels: app: my-go-app spec: containers: - name: my-go-app-container # Укажите путь к вашему образу image: your-registry/my-go-app:v1.0.0 ports: - containerPort: 8080 # Порт внутри контейнера
-
Service
: Предоставляет стабильный сетевой доступ к вашим подам (экземплярам приложения). Он может выступать в роли внутреннего или внешнего балансировщика нагрузки.apiVersion: v1 kind: Service metadata: name: my-go-app-service spec: # тип LoadBalancer делает сервис доступным извне кластера type: LoadBalancer selector: # Направляет трафик на поды с этой меткой app: my-go-app ports: - protocol: TCP port: 80 # Внешний порт сервиса targetPort: 8080 # Порт на подах, куда направлять трафик
Шаг 3: Применение манифестов в кластере
Манифесты применяются с помощью утилиты kubectl
:
# Применить все .yaml файлы из текущей директории
kubectl apply -f .
# Или по одному
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
Дополнительные важные концепции:
- Health Checks (
Liveness
иReadiness Probes
): Настройка проверок состояния в Deployment, чтобы Kubernetes мог автоматически перезапускать нездоровые контейнеры и не направлять трафик на еще не готовые. ConfigMaps
иSecrets
: Для управления конфигурацией и секретными данными (пароли, токены) без их встраивания в образ.Ingress
: Для более гибкого управления внешним доступом к сервисам, особенно для маршрутизации по HTTP/HTTPS путям.- Helm/Kustomize: Инструменты для шаблонизации и управления сложными наборами Kubernetes-манифестов.