Комментарии (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
Ключевые моменты для успешного деплоя:
- Идемпотентность: многократное выполнение
kubectl applyбезопасно - Версионирование: тегировать образы семантическим версионированием
- Инфраструктура как код: хранить манифесты в Git
- Декларативный подход: описывать желаемое состояние
- Мониторинг: настраивать алертинг на сбои деплоя
- Disaster Recovery: иметь план отката и backup конфигураций
Деплой в Kubernetes — это комплексный процесс, требующий понимания как самого Kubernetes, так и особенностей вашего приложения. Начинайте с простых деплоев, постепенно внедряя более сложные практики по мере роста проекта.