в образе докера nginx не работает из-за состояния гонки, упомянутого @Lindsay Landry. Вы ненадолго потеряете соединения, поэтому придерживайтесь сценария bash выше.

аюсь выполнить развертывание kubernetes nginx с нулевым временем простоя. Часть этого процесса состояла в том, чтобы инициировать rollUpdate, который гарантирует, что по крайней мере один модуль всегда запускает nginx. Это прекрасно работает.

Я сталкиваюсь с ошибками, когда старый модуль nginx заканчивается. В соответствии с документами Куберне напрекращениеКубернетес будут:

удалите модуль из списка конечных точек для службы, чтобы он не получал никакого нового трафика, когда начинается завершениевызовите пре-стоп-хук, если он определен, и дождитесь его завершенияотправить SIGTERM всем остальным процессамотправить SIGKILL всем оставшимся процессам после истечения льготного периода.

Я понимаю что командаnginx -s quit Предполагается, что nginx будет корректно завершать работу, ожидая, пока все рабочие завершат запросы, прежде чем мастер завершит работу. Он изящно реагирует на команду SIGQUIT, а SIGTERM приводит к принудительному завершению. Другие форумы говорят, что это так же просто, как добавить следующую ловушку preStop к вашему развертыванию:

lifecycle:
  preStop:
    exec:
      command: ["/usr/sbin/nginx", "-s", "quit"]

Однако из тестирования этой команды я обнаружил, чтоnginx -s quit возвращается немедленно, вместо того, чтобы ждать, пока рабочие закончат. Он также не возвращает PID основного процесса, на что я надеялся D:

Что происходит, kubernetes вызываетnginx -s quit, который отправит надлежащего SIGQUIT работающим детям, но не будет ждать их завершения. Вместо этого он перейдет прямо к шагу 3 и вместо этого выполнит SIGTERM эти процессы, что приведет к насильственному завершению и, следовательно, к потере соединений.

ВОПРОС: Кто-нибудь нашел хороший способ изящно завершить работу своего контроллера nginx во время непрерывного развертывания и иметь нулевое время простоя?sleep Обходной путь недостаточно хорош, я ищу что-то более надежное.

Ниже приведено полное развертывание yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
 template:
    metadata:
      labels:
        app: nginx-ingress-lb
    spec:
      terminationGracePeriodSeconds: 60
      serviceAccount: nginx
      containers:
        - name: nginx-ingress-controller
          image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.8
          imagePullPolicy: Always
          readinessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
          livenessProbe:
            httpGet:
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            timeoutSeconds: 5
          args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-backend
            - --v=2
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - containerPort: 80
          lifecycle:
            preStop:
              exec:
                command: ["/usr/sbin/nginx", "-s", "quit"]

Ответы на вопрос(1)

Ваш ответ на вопрос