Перейти к содержанию

Пример продовый

Пример проекта на Django, ngnix, rabbitmq, celery worker, redis и celery beat

Структура

data find . | sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"

 |-django-microservice-chart
 | |-Chart.yaml
 | |-templates
 | | |-deployment.yaml
 | | |-ingress.yaml
 | | |-celery-worker.yaml
 | | |-rabbitmq.yaml
 | | |-service.yaml
 | | |-nginx.yaml
 | | |-pvc.yaml
 | | |-configmap.yaml
 | | |-secret.yaml
 | | |-redis.yaml
 | | |-celery-beat.yaml
 | |-values.yaml

Chart.yaml

apiVersion: v2
name: django-microservice
description: A Django app with Celery, Redis, RabbitMQ and Nginx
type: application
version: 0.1.0
appVersion: "1.0"

values.yaml

django:
  image: your-django-image:latest
  replicas: 1
  env:
    SECRET_KEY: "replace-me"
    DEBUG: "False"
    ALLOWED_HOSTS: "*"
    RABBITMQ_URL: "amqp://guest:guest@rabbitmq:5672//"
    REDIS_URL: "redis://redis:6379/0"

nginx:
  image: nginx:alpine

rabbitmq:
  image: rabbitmq:3-management

redis:
  image: redis:alpine

celery:
  worker:
    replicas: 1
  beat:
    enabled: true

templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: django
spec:
  replicas: {{ .Values.django.replicas }}
  selector:
    matchLabels:
      app: django
  template:
    metadata:
      labels:
        app: django
    spec:
      containers:
      - name: django
        image: {{ .Values.django.image }}
        ports:
        - containerPort: 8000
        readinessProbe:
          httpGet:
            path: /
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 8000
          initialDelaySeconds: 15
          periodSeconds: 20
        env:
        {{- range $key, $value := .Values.django.env }}
        - name: {{ $key }}
          value: "{{ $value }}"
        {{- end }}

templates/ingress.yaml

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

templates/celery-worker.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: celery-worker
spec:
  replicas: {{ .Values.celery.worker.replicas }}
  selector:
    matchLabels:
      app: celery-worker
  template:
    metadata:
      labels:
        app: celery-worker
    spec:
      containers:
      - name: celery-worker
        image: {{ .Values.django.image }}
        command: ["celery", "-A", "yourproject", "worker", "--loglevel=info"]
        env:
        {{- range $key, $value := .Values.django.env }}
        - name: {{ $key }}
          value: "{{ $value }}"
        {{- end }}

templates/rabbitmq.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabbitmq
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      labels:
        app: rabbitmq
    spec:
      containers:
      - name: rabbitmq
        image: {{ .Values.rabbitmq.image }}
        ports:
        - containerPort: 5672
        - containerPort: 15672

templates/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: django-service
spec:
  selector:
    app: django
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8000
  type: ClusterIP

templates/nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: {{ .Values.nginx.image }}
        ports:
        - containerPort: 80

templates/pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: django-media-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: django-config
data:
  DJANGO_SETTINGS_MODULE: "yourproject.settings"
  LOG_LEVEL: "INFO"

templates/secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: django-secret
type: Opaque
stringData:
  SECRET_KEY: "your-production-secret-key"

templates/redis.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: {{ .Values.redis.image }}
        ports:
        - containerPort: 6379

templates/celery-beat.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: celery-beat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: celery-beat
  template:
    metadata:
      labels:
        app: celery-beat
    spec:
      containers:
      - name: celery-beat
        image: {{ .Values.django.image }}
        command: ["celery", "-A", "yourproject", "beat", "--loglevel=info"]
        env:
        {{- range $key, $value := .Values.django.env }}
        - name: {{ $key }}
          value: "{{ $value }}"
        {{- end }}

🚀 Инструкция по запуску

⚠️ Перед запуском убедись, что у тебя установлен helm, kubectl и настроен доступ к Kubernetes кластеру (например, minikube или prod-кластер).


1. Подготовь ingress-контроллер (если ещё не установлен)

Пример (для Minikube):

minikube addons enable ingress

2. Установи Helm-чарт

helm install django-release ./django-microservice-chart

3. Проверь, что все поды запущены

kubectl get pods

4. Проверь доступ к приложению

Для Minikube:

minikube tunnel
kubectl get ingress

Открой указанный IP (или укажи 127.0.0.1 yourdomain.com в /etc/hosts).


5. Обновление чарта

Если ты изменил конфигурации:

helm upgrade django-release ./django-microservice-chart

6. Удаление релиза

helm uninstall django-release