Введение
Ещё год назад мой деплой в прод выглядел так: я собирал образ локально, пушил в реестр, потом вручную правил deployment.yaml, применял kubectl apply и молился, чтобы поды не упали. Часто не обходилось: то контейнер падал из-за неверного CMD, то Kubernetes отказывался обновлять образ, потому что тег latest не менялся. Каждый релиз занимал минимум час, а в пятницу вечером я вообще старался ничего не трогать.
Проблема была не в том, что я не знал Docker или Kubernetes. Я знал их достаточно, чтобы писать манифесты и собирать образы. Но рутина съедала время и нервы. Я решил автоматизировать всё, что можно, с помощью промтов для AI-ассистентов. В этой статье я делюсь подборкой из 12 промтов, которые превратили мой хаотичный деплой в стабильный CI/CD-пайплайн. Теперь я деплою в прод за 5 минут и практически без участия человека.
Почему промты, а не готовые шаблоны?
Готовые шаблоны CI/CD часто не учитывают специфику проекта: монорепозиторий, нестандартные зависимости, требования безопасности. Промты позволяют AI-агенту сгенерировать конфигурацию под конкретный стек, а затем доработать её. Я использую AI-ассистента как парного программиста, который знает синтаксис Dockerfile, Kubernetes API и GitHub Actions.
Все промты я разделил на три уровня: базовые (для быстрого старта), продвинутые (для оптимизации и безопасности) и экспертные (для сложных сценариев). Каждый промт я проверял на реальном проекте — микросервисном приложении на Python (FastAPI) и Node.js, развёрнутом в Kubernetes в Yandex Cloud.
Базовые промты
1. Генерация Dockerfile для Python-приложения
Задача: Написать оптимальный Dockerfile для FastAPI-приложения с учётом кэширования слоёв.
Промт:
Ты — эксперт по Docker. Напиши Dockerfile для Python 3.11 приложения на FastAPI. Требования: использовать multi-stage сборку, кэшировать зависимости, не запускать от root, финальный образ на базе python:3.11-slim. Объясни каждую строку.
Пример результата:
# Stage 1: builder
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
# Stage 2: runtime
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
RUN useradd -m appuser && chown -R appuser /app
USER appuser
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
2. Создание Deployment и Service для Kubernetes
Задача: Сгенерировать манифесты для деплоя приложения с проверками здоровья.
Промт:
Создай Kubernetes Deployment и Service для приложения на порту 8000. Используй образ myapp:1.0.0. Добавь liveness и readiness пробу на /health. Реплик — 3.
Пример результата:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0.0
ports:
- containerPort: 8000
livenessProbe:
httpGet:
path: /health
port: 8000
readinessProbe:
httpGet:
path: /health
port: 8000
---
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8000
3. Настройка GitHub Actions для сборки и пуша образа
Задача: Автоматически собирать Docker-образ и пушить в Docker Hub при пуше в main.
Промт:
Напиши GitHub Actions workflow, который собирает Docker-образ и пушит в Docker Hub при пуше в main. Используй секреты DOCKER_USERNAME и DOCKER_PASSWORD. Тег образа — sha коммита.
Пример результата:
name: Build and Push
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: myapp:${{ github.sha }}
Продвинутые промты
4. Оптимизация Docker-образа с помощью dive
Задача: Уменьшить размер образа и убрать лишние слои.
Промт:
Проанализируй Dockerfile и предложи оптимизации: уменьшение размера, кэширование, безопасность. Используй dive для анализа. Напиши команду для проверки.
Пример результата:
- Объединить RUN apt-get update && apt-get install -y ... && rm -rf /var/lib/apt/lists/* в один слой.
- Использовать .dockerignore для исключения тестов и документации.
- Проверка: dive myapp:latest.
5. Настройка Horizontal Pod Autoscaler
Задача: Автоматически масштабировать поды при нагрузке.
Промт:
Создай HPA для Deployment myapp. Минимум 2 пода, максимум 10. Целевая загрузка CPU — 70%. Укажи apiVersion autoscaling/v2.
Пример результата:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
6. Секреты в Kubernetes
Задача: Безопасно хранить пароли и токены.
Промт:
Как создать Secret в Kubernetes для хранения DATABASE_URL и API_KEY? Покажи пример с kubectl и в манифесте. Как использовать Secret в Deployment?
Пример результата:
kubectl create secret generic app-secrets --from-literal=DATABASE_URL=postgres://... --from-literal=API_KEY=xyz
В Deployment:
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: app-secrets
key: DATABASE_URL
Экспертные промты
7. Построение GitOps-пайплайна с ArgoCD
Задача: Автоматически синхронизировать состояние кластера с Git-репозиторием.
Промт:
Настрой ArgoCD для GitOps. Приложение myapp должно автоматически деплоиться при изменении в репозитории. Напиши Application манифест и объясни шаги установки ArgoCD.
Пример результата:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
project: default
source:
repoURL: 'https://github.com/user/myapp-config.git'
targetRevision: HEAD
path: k8s
destination:
server: 'https://kubernetes.default.svc'
namespace: default
syncPolicy:
automated:
selfHeal: true
prune: true
8. Канареечный деплой с Flagger
Задача: Постепенно переключать трафик на новую версию.
Промт:
Опиши, как настроить канареечный деплой с Flagger для приложения myapp. Какие метрики использовать? Приведи пример Canary-ресурса.
Пример результата:
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
name: myapp
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
service:
port: 80
analysis:
interval: 1m
threshold: 5
metrics:
- name: request-success-rate
thresholdRange:
min: 99
interval: 1m
9. Сбор метрик с Prometheus и Grafana
Задача: Мониторить состояние приложения и кластера.
Промт:
Как установить Prometheus и Grafana в Kubernetes с помощью Helm? Настрой сбор метрик с приложения myapp. Покажи пример ServiceMonitor.
Пример результата:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack
ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myapp-monitor
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: web
10. Автоматическое обновление секретов с External Secrets Operator
Задача: Синхронизировать секреты из внешнего хранилища (Vault, AWS Secrets Manager).
Промт:
Как использовать External Secrets Operator для получения секретов из HashiCorp Vault? Напиши пример SecretStore и ExternalSecret.
Пример результата:
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault-backend
spec:
provider:
vault:
server: "https://vault.example.com"
path: "secret"
version: "v2"
auth:
tokenSecretRef:
name: vault-token
key: token
11. Отладка падающих подов
Задача: Быстро находить причину CrashLoopBackOff.
Промт:
Под myapp в статусе CrashLoopBackOff. Как найти причину? Опиши шаги с kubectl logs, describe, events.
Пример результата:
kubectl logs myapp-5f6d7c8b9-abcde --previous
kubectl describe pod myapp-5f6d7c8b9-abcde
kubectl get events --sort-by=.metadata.creationTimestamp
12. Оптимизация затрат на Kubernetes
Задача: Снизить расходы на облако.
Промт:
Проанализируй ресурсы кластера. Предложи способы снижения затрат: right-sizing, spot-инстансы, автомасштабирование. Напиши пример Vertical Pod Autoscaler.
Пример результата:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: myapp-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: myapp
updatePolicy:
updateMode: "Auto"
Результаты
После внедрения этих промтов и пайплайна время деплоя сократилось с 1 часа до 5 минут. Количество ошибок при деплое уменьшилось на порядок. Я перестал вручную править YAML и запускать kubectl. Теперь любой коммит в main автоматически проходит сборку, тесты, деплой в staging и, после подтверждения, в прод. В пятницу вечером я спокоен.
Выводы
Промты — это не замена знаниям, а ускоритель. Они помогают не забыть про liveness-пробы, правильно настроить HPA и не запустить контейнер от root. Если вы хотите глубже разобраться в Docker, Kubernetes и CI/CD, рекомендую начать с официальной документации и практики. А если хотите сэкономить время — используйте эти промты как отправную точку. Помните: AI-ассистент не несёт ответственности за ваши деплои, но может сделать их безопаснее и быстрее.
Комментарии