Уссги мастер грациозное отключение - PullRequest
0 голосов
/ 31 января 2019

Я запускаю приложение uwsgi + flask. Приложение работает как модуль k8s.

Когда я развертываю новый модуль (новую версию), существующий модуль получает SIGTERM.

Это приводит к тому, что мастер перестает принимать новое соединение в тот же момент , что вызывает проблемы, поскольку LB все еще передает запросы к модулю (еще на несколько секунд).

Я бы хотел, чтобы мастер подождал 30 секунд ПРЕЖДЕ, чем прекратить принимать новые подключения (при получении SIGTERM), но не смог найти способ, возможно ли это?

Мой файл uwsgi.ini: [uwsgi]

;https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html
http = :8080
wsgi-file = main.py
callable = wsgi_application
processes = 2
enable-threads = true
master = true
reload-mercy = 30
worker-reload-mercy = 30
log-5xx = true
log-4xx = true
disable-logging = true
stats = 127.0.0.1:1717
stats-http = true
single-interpreter= true
;https://github.com/containous/traefik/issues/615
http-keepalive=true
add-header = Connection: Keep-Alive

1 Ответ

0 голосов
/ 01 февраля 2019

Похоже, что это невозможно сделать с помощью uwsgi:

https://github.com/unbit/uwsgi/issues/1974

Решение - (как упомянуто в этой проблеме kubernetes):

https://github.com/kubernetes/contrib/issues/1140

Использовать крючок prestop, довольно некрасиво, но поможет достичь нулевого времени простоя:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sleep","5"]

Шаблон взят из этого ответа: https://stackoverflow.com/a/39493421/3659858

...