← Назад к вопросам

Как задеплоить в Kubernetes?

2.0 Middle🔥 231 комментариев
#Контейнеризация и DevOps

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Развёртывание приложений в Kubernetes

Деплой в Kubernetes — это многоэтапный процесс упаковки, конфигурации и запуска приложений в кластере. Вот комплексное руководство, основанное на лучших практиках.

1. Подготовка приложения

Перед деплоем необходимо:

  • Контейнеризировать приложение: создать Docker-образ
  • Написать Dockerfile
  • Собрать и протестировать образ локально
  • Запушить образ в реестр контейнеров (Docker Hub, GitLab Registry, Harbor, ECR, GCR)

Пример 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 -o main ./cmd/app

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]

2. Создание базовых Kubernetes-манифестов

Основные ресурсы для деплоя:

Deployment — основной объект для управления репликами приложения

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-app-deployment
  labels:
    app: go-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      containers:
      - name: go-app
        image: your-registry/go-app:v1.0.0
        ports:
        - containerPort: 8080
        env:
        - name: APP_ENV
          value: "production"
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

Service — для доступа к подам внутри кластера

apiVersion: v1
kind: Service
metadata:
  name: go-app-service
spec:
  selector:
    app: go-app
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP

Ingress — для внешнего доступа (если требуется)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: go-app-service
            port:
              number: 80

3. Способы деплоя в Kubernetes

Базовый деплой с kubectl

# Применить манифесты
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

# Проверить статус
kubectl get deployments
kubectl get pods
kubectl get services

Использование Helm (рекомендуется для production)

# Создать chart
helm create my-go-app

# Установить/обновить
helm upgrade --install my-go-app ./my-go-app \
  --namespace production \
  --values values-production.yaml

# Rollback при проблемах
helm rollback my-go-app 1

GitOps с ArgoCD/Flux

  • Манифесты хранятся в Git-репозитории
  • Автоматическая синхронизация при изменении
  • Визуальный интерфейс для мониторинга
  • Автоматические rollback при неудачных деплоях

4. Стратегии деплоя

Rolling Update (по умолчанию):

  • Постепенная замена подов
  • Нет downtime
  • Контролируется параметрами maxSurge и maxUnavailable

Blue-Green Deployment:

spec:
  strategy:
    type: BlueGreen

Canary Release:

  • Постепенный трафик на новую версию
  • Мониторинг метрик
  • Используется с Ingress-контроллерами или Service Mesh

5. Мониторинг и отладка

Полезные команды kubectl:

# Логи приложения
kubectl logs -f deployment/go-app-deployment

# События кластера
kubectl get events --sort-by='.lastTimestamp'

# Описание ресурса для диагностики
kubectl describe pod go-app-deployment-abc123

# Доступ к приложению для тестирования
kubectl port-forward svc/go-app-service 8080:80

Инструменты мониторинга:

  • Prometheus + Grafana для метрик
  • Loki + Grafana для логов
  • Jaeger или OpenTelemetry для трассировки

6. Best Practices для Go-приложений

Конфигурация:

  • Использовать ConfigMaps и Secrets вместо hardcoded значений
  • Для секретов использовать external-secrets или Vault

Настройка приложения:

// Graceful shutdown для Kubernetes
func main() {
    // Обработка сигналов
    ctx, stop := signal.NotifyContext(context.Background(), 
        syscall.SIGINT, syscall.SIGTERM)
    defer stop()
    
    // Health checks для K8s
    http.HandleFunc("/health", healthHandler)
    http.HandleFunc("/ready", readinessHandler)
    
    // Graceful shutdown сервера
    server := &http.Server{
        Addr: ":8080",
    }
    
    go func() {
        <-ctx.Done()
        shutdownCtx, cancel := context.WithTimeout(
            context.Background(), 10*time.Second)
        defer cancel()
        server.Shutdown(shutdownCtx)
    }()
}

Безопасность:

  • Использовать SecurityContext в манифестах
  • Запускать от непривилегированного пользователя
  • Монтировать ServiceAccount для доступа к Kubernetes API

7. CI/CD Pipeline пример

# .gitlab-ci.yml пример
stages:
  - test
  - build
  - deploy

deploy-to-k8s:
  stage: deploy
  script:
    # Обновление kubeconfig
    - echo "$KUBECONFIG" > kubeconfig.yml
    
    # Установка/обновление приложения
    - kubectl apply -f k8s/manifests/
    
    # Проверка деплоя
    - kubectl rollout status deployment/go-app-deployment --timeout=300s
  only:
    - main
  environment: production

8. Рекомендуемые инструменты

  • Kustomize для управления конфигурациями окружений
  • Skaffold для локальной разработки
  • Telepresence для отладки в кластере
  • K9s или Lens как UI для Kubernetes

Ключевые моменты для успешного деплоя:

  1. Идемпотентность: многократное выполнение kubectl apply безопасно
  2. Версионирование: тегировать образы семантическим версионированием
  3. Инфраструктура как код: хранить манифесты в Git
  4. Декларативный подход: описывать желаемое состояние
  5. Мониторинг: настраивать алертинг на сбои деплоя
  6. Disaster Recovery: иметь план отката и backup конфигураций

Деплой в Kubernetes — это комплексный процесс, требующий понимания как самого Kubernetes, так и особенностей вашего приложения. Начинайте с простых деплоев, постепенно внедряя более сложные практики по мере роста проекта.

Как задеплоить в Kubernetes? | PrepBro