в образе докера 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"]