Kubernetes tips & tricks: особСнности выполнСния graceful shutdown Π² NGINX ΠΈ PHP-FPM

Π’ΠΈΠΏΠΎΠ²ΠΎΠ΅ условиС ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ CI/CD Π² Kubernetes: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠ»Π½ΠΎΠΉ остановкой Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ клиСнтскиС запросы, Π° самоС Π³Π»Π°Π²Π½ΠΎΠ΅ β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅.

Kubernetes tips & tricks: особСнности выполнСния graceful shutdown Π² NGINX ΠΈ PHP-FPM

БоблюдСниС Ρ‚Π°ΠΊΠΎΠ³ΠΎ условия позволяСт Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ простоя Π²ΠΎ врСмя дСплоя. Однако, Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ использовании ΠΎΡ‡Π΅Π½ΡŒ популярных связок (Π²Ρ€ΠΎΠ΄Π΅ NGINX ΠΈ PHP-FPM) ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ со слоТностями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ всплСску ошибок ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ дСплоС…

ВСория. Как ΠΆΠΈΠ²Ρ‘Ρ‚ pod

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ pod’а ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ. Π’ контСкстС рассматриваСмой Ρ‚Π΅ΠΌΡ‹ нас интСрСсуСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° pod ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС Terminating, Π½Π° Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°ΡŽΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹Π΅ запросы (pod удаляСтся ΠΈΠ· списка endpoints для сСрвиса). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, для избСТания простоя Π²ΠΎ врСмя дСплоя, с нашСй стороны достаточно Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ остановки прилоТСния.

Π’Π°ΠΊΠΆΠ΅ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ grace period ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ 30 сСкундам: послС этого pod Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΡΠΏΠ΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ всС запросы Π΄ΠΎ этого ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: хотя любой запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Π±ΠΎΠ»Π΅Π΅ 5-10 сСкунд, ΡƒΠΆΠ΅ являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΌ, ΠΈ graceful shutdown Π΅ΠΌΡƒ ΡƒΠΆΠ΅ Π½Π΅ помоТСт…

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° pod Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, достаточно ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму:

Kubernetes tips & tricks: особСнности выполнСния graceful shutdown Π² NGINX ΠΈ PHP-FPM

А1, B1 β€” ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΎ состоянии ΠΏΠΎΠ΄Π°
A2 β€” ΠžΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ SIGTERM
B2 β€” Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ pod’а ΠΈΠ· endpoints
B3 β€” ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ (измСнился список endpoints)
B4 β€” ОбновлСниС ΠΏΡ€Π°Π²ΠΈΠ» iptables

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ endpoint pod’а ΠΈ посылка SIGTERM происходит Π½Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. А ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ingress ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ список Endpoints Π½Π΅ сразу, Π² pod Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹Π΅ запросы ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ 500 ошибки Π²ΠΎ врСмя Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ†ΠΈΠΈ pod’а (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΏΠΎ этому вопросу ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠ»ΠΈ). Π Π΅ΡˆΠ°Ρ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ способами:

  • ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… ΠΎΡ‚Π²Π΅Ρ‚Π° Connection: close (Ссли это касаСтся HTTP-прилоТСния).
  • Если Π½Π΅Ρ‚ возмоТности Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² ΠΊΠΎΠ΄, Ρ‚ΠΎ Π΄Π°Π»Π΅Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ описано Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ запросы Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° graceful period.

ВСория. Как NGINX ΠΈ PHP-FPM Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ свои процСссы

NGINX

НачнСм с NGINX, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ с Π½ΠΈΠΌ всС Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ. ΠŸΠΎΠ³Ρ€ΡƒΠ·ΠΈΠ²ΡˆΠΈΡΡŒ Π² Ρ‚Π΅ΠΎΡ€ΠΈΡŽ, ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ NGINX Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ мастСр-процСсс ΠΈ нСсколько Β«Π²ΠΎΡ€ΠΊΠ΅Ρ€ΠΎΠ²Β» β€” это Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ клиСнтскиС запросы. ΠŸΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½Π° удобная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ nginx -s <SIGNAL> Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ процСссы Π»ΠΈΠ±ΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ fast shutdown, Π»ΠΈΠ±ΠΎ Π² graceful shutdown. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ нас интСрСсуСт ΠΈΠΌΠ΅Π½Π½ΠΎ послСдний Π²Π°Ρ€ΠΈΠ°Π½Ρ‚.

Π”Π°Π»ΡŒΡˆΠ΅ всё просто: трСбуСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² preStop-Ρ…ΡƒΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигнал ΠΎ graceful shutdown. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² Deployment, Π² Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

       lifecycle:
          preStop:
            exec:
              command:
              - /usr/sbin/nginx
              - -s
              - quit

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ pod’а Π² Π»ΠΎΠ³Π°Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° NGINX ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

2018/01/25 13:58:31 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down
2018/01/25 13:58:31 [notice] 11#11: gracefully shutting down

И это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ: NGINX ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния запросов, послС Ρ‡Π΅Π³ΠΎ ΡƒΠ±ΠΈΠ²Π°Π΅Ρ‚ процСсс. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π½ΠΈΠΆΠ΅ Π΅Ρ‰Ρ‘ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСна распространСнная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ nginx -s quit процСсс Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

А Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС с NGINX Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ: ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΠΎ Π»ΠΎΠ³Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ.

Как обстоят Π΄Π΅Π»Π° с PHP-FPM? Как ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ graceful shutdown? Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ.

PHP-FPM

Π’ случаС с PHP-FPM ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ мСньшС. Если ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Π½ΡƒΠ°Π» ΠΏΠΎ PHP-FPM, Ρ‚ΠΎ Π² Π½Ρ‘ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ рассказано, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ POSIX-сигналы:

  1. SIGINT, SIGTERM β€” fast shutdown;
  2. SIGQUIT β€” graceful shutdown (Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ).

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ сигналы Π² Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ, поэтому ΠΈΡ… Ρ€Π°Π·Π±ΠΎΡ€ опустим. Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса понадобится Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ preStop-Ρ…ΡƒΠΊ:

        lifecycle:
          preStop:
            exec:
              command:
              - /bin/kill
              - -SIGQUIT
              - "1"

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, это всё, Ρ‡Ρ‚ΠΎ трСбуСтся для выполнСния graceful shutdown Π² ΠΎΠ±ΠΎΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π·Π°Π΄Π°Ρ‡Π° слоТнСС, Ρ‡Π΅ΠΌ каТСтся. Π”Π°Π»Π΅Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Ρ‹ Π΄Π²Π° случая, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… graceful shutdown Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π» ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²ΠΎ врСмя дСплоя.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с graceful shutdown

NGINX

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ: ΠΏΠΎΠΌΠΈΠΌΠΎ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ nginx -s quit Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ этап, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠœΡ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° NGINX вмСсто сигнала SIGQUIT всё Ρ€Π°Π²Π½ΠΎ отправлял SIGTERM, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ запросы Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π»ΠΈΡΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ случаи ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, здСсь. К соТалСнию, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Ρ‚Π°ΠΊΠΎΠ³ΠΎ повСдСния Π½Π°ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ: Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π½ΠΈΠ΅ Π½Π° вСрсии NGINX, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΠ»ΠΎΡΡŒ. Π‘ΠΈΠΌΠΏΡ‚ΠΎΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΆΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π»Π°ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π»ΠΎΠ³Π°Ρ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° NGINX наблюдались сообщСния Β«open socket #10 left in connection 5Β», послС Ρ‡Π΅Π³ΠΎ pod останавливался.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌ Π½Π° Π½ΡƒΠΆΠ½ΠΎΠΌ Π½Π°ΠΌ Ingress’e:

Kubernetes tips & tricks: особСнности выполнСния graceful shutdown Π² NGINX ΠΈ PHP-FPM
ΠŸΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ статус-ΠΊΠΎΠ΄ΠΎΠ² Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ дСплоя

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π· 503 ΠΊΠΎΠ΄ ошибки ΠΎΡ‚ самого Ingress: ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ NGINX, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‚ ΡƒΠΆΠ΅ нСдоступСн. Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π»ΠΎΠ³ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с NGINX, Π² Π½ΠΈΡ… β€” ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

[alert] 13939#0: *154 open socket #3 left in connection 16
[alert] 13939#0: *168 open socket #6 left in connection 13

ПослС измСнСния стоп-сигнала ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ: это подтвСрТдаСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ большС Π½Π΅ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ 503 ошибка.

Если Π²Ρ‹ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ с ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π΅ΡΡ‚ΡŒ смысл Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊΠΎΠΉ стоп-сигнал ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΈ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ выглядит preStop-Ρ…ΡƒΠΊ. Π’ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° кроСтся ΠΊΠ°ΠΊ Ρ€Π°Π· Π² этом.

PHP-FPM… ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с PHP-FPM описываСтся Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ: ΠΎΠ½ Π½Π΅ доТидаСтся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов, Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ…, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ 502-Π΅ ошибки Π²ΠΎ врСмя дСплоя ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. На bugs.php.net с 2005 Π³ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ нСсколько сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, здСсь ΠΈ здСсь), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… описываСтся данная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. А Π²ΠΎΡ‚ Π² Π»ΠΎΠ³Π°Ρ… Π²Ρ‹, вСроятнСС всСго, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅: PHP-FPM ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ своСго процСсса Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ошибок ΠΈΠ»ΠΈ сторонних ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.

Π‘Ρ‚ΠΎΠΈΡ‚ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сама ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π² мСньшСй ΠΈΠ»ΠΈ большСй стСпСни Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ самого прилоТСния ΠΈ Π½Π΅ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅. Если Π²Ρ‹ всС ΠΆΠ΅ ΡΡ‚ΠΎΠ»ΠΊΠ½Π΅Ρ‚Π΅ΡΡŒ с Π½Π΅ΠΉ, Ρ‚ΠΎ Π½Π° ΡƒΠΌ сначала ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ простой workaround: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ preStop-Ρ…ΡƒΠΊ со sleep(30). Он ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ всС запросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π΄ΠΎ этого (Π° Π½ΠΎΠ²Ρ‹Π΅ ΠΌΡ‹ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ pod ΡƒΠΆΠ΅ Π² состоянии Terminating), Π° ΠΏΠΎ истСчСнии 30 сСкунд сам pod Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ сигналом SIGTERM.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ lifecycle для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    lifecycle:
      preStop:
        exec:
          command:
          - /bin/sleep
          - "30"

Однако, ΠΈΠ·-Π·Π° указания 30-сСкундного sleep ΠΌΡ‹ сильно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠΌ врСмя дСплоя, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ pod Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 30 сСкунд, Ρ‡Ρ‚ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ. Π§Ρ‚ΠΎ с этим ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ?

ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌΡΡ ΠΊ сторонС, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅ΠΉ Π·Π° нСпосрСдствСнноС исполнСниС прилоТСния. Π’ нашСм случаС это PHP-FPM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ слСдит Π·Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ своих child-процСссов: мастСр-процСсс тСрминируСтся сразу ΠΆΠ΅. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ process_control_timeout, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π»ΠΈΠΌΠΈΡ‚Ρ‹ для оТидания сигналов ΠΎΡ‚ мастСра Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ процСссами. Если ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² 20 сСкунд, Ρ‚Π΅ΠΌ самым покроСтся Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ запросов, выполняСмых Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, ΠΈ послС ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ мастСр-процСсс Π±ΡƒΠ΄Π΅Ρ‚ остановлСн.

Π‘ этим Π·Π½Π°Π½ΠΈΠ΅ΠΌ вСрнёмся ΠΊ нашСй послСднСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅. Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ, Kubernetes Π½Π΅ являСтся ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ: Π½Π° взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π΅Ρ‘ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ трСбуСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассматриваСм Ρ€Π°Π±ΠΎΡ‚Ρƒ Ingress’ов ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… смСТных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ·-Π·Π° Ρ‚Π°ΠΊΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ дСплоя Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всплСск 500-Ρ… ошибок. НапримСр, ошибка ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π½Π° этапС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ запроса ΠΊ upstream’у, Π½ΠΎ сам Β«Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π»Π°Π³Β» взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ довольно ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ β€” мСньшС сСкунды.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π² совокупности с ΡƒΠΆΠ΅ упомянутой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ process_control_timeout ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ для lifecycle:

lifecycle:
  preStop:
    exec:
      command: ["/bin/bash","-c","/bin/sleep 1; kill -QUIT 1"]

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΡ‹ компСнсируСм Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ sleep ΠΈ сильно Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ врСмя дСплоя: вСдь Π·Π°ΠΌΠ΅Ρ‚Π½Π° Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ 30 сСкундами ΠΈ ΠΎΠ΄Π½ΠΎΠΉ?.. По сути Β«ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚ΡƒΒ» Π½Π° сСбя Π±Π΅Ρ€Ρ‘Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ process_control_timeout, Π° lifecycle ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ лишь Π² качСствС «подстраховки» Π½Π° случай Π»Π°Π³Π°.

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, описанноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ workaround ΠΊΠ°ΡΠ°ΡŽΡ‚ΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ PHP-FPM. БхоТая ситуация ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ использовании Π΄Ρ€ΡƒΠ³ΠΈΡ… ЯП/Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ². Если Π½Π΅ получаСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ graceful shutdown β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΎ сигналы Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, β€” ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ описанный способ. ΠŸΡƒΡΡ‚ΡŒ ΠΎΠ½ Π½Π΅ самый красивый, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. НагрузочноС тСстированиС для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ pod’а

НагрузочноС тСстированиС β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ°Π΅Ρ‚ ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π±ΠΎΠ΅Π²Ρ‹ΠΌ условиям, ΠΊΠΎΠ³Π΄Π° Π½Π° сайт заходят ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ. Для тСстирования ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ЯндСкс.Π’Π°Π½ΠΊΠΎΠΌ: ΠΎΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всС наши потрСбности. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ совСты ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡŽ тСстирования с наглядным β€” благодаря Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌ Grafana ΠΈ самого ЯндСкс.Π’Π°Π½ΠΊΠ° β€” ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΈΠ· нашСго ΠΎΠΏΡ‹Ρ‚Π°.

Π‘Π°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ здСсь β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ измСнСния поэтапно. ПослС добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ исправлСния запускайтС тСстированиС ΠΈ смотритС, измСнились Π»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΌ запуском. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ слоТно Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ нСэффСктивныС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π° Π² пСрспСктивС ΠΌΠΎΠΆΠ½ΠΎ ΠΈ вовсС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ врСмя дСплоя).

Π”Ρ€ΡƒΠ³ΠΎΠΉ нюанс β€” смотритС Π»ΠΎΠ³ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π²ΠΎ врСмя Π΅Π³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ†ΠΈΠΈ. ЀиксируСтся Π»ΠΈ Ρ‚Π°ΠΌ информация ΠΎ graceful shutdown? Π•ΡΡ‚ΡŒ Π»ΠΈ Π² Π»ΠΎΠ³Π°Ρ… ошибки ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ рСсурсам (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊ сосСднСму ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ PHP-FPM)? Ошибки самого прилоТСния (ΠΊΠ°ΠΊ Π² описанном Π²Ρ‹ΡˆΠ΅ случаС с NGINX)? НадСюсь, Ρ‡Ρ‚ΠΎ вводная информация ΠΈΠ· этой ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ происходит с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Π²ΠΎ врСмя Π΅Π³ΠΎ тСрминирования.

Π˜Ρ‚Π°ΠΊ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запуск тСстирования происходил Π±Π΅Π· lifecycle ΠΈ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² для сСрвСра ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ (process_control_timeout Π² PHP-FPM). ЦСлью этого тСста Π±Ρ‹Π»ΠΎ выявлСниС ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ количСства ошибок (ΠΈ Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΎΠ½ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅). Π’Π°ΠΊΠΆΠ΅ ΠΈΠ· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ слСдуСт Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ срСднСС врСмя дСплоя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π° составляло ΠΎΠΊΠΎΠ»ΠΎ 5-10 сСкунд Π΄ΠΎ состояния ΠΏΠΎΠ»Π½ΠΎΠΉ готовности. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΎΠ²Ρ‹:

Kubernetes tips & tricks: особСнности выполнСния graceful shutdown Π² NGINX ΠΈ PHP-FPM

На ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ ЯндСкс.Π’Π°Π½ΠΊΠ° Π²ΠΈΠ΄Π΅Π½ всплСск 502 ошибок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ дСплоя ΠΈ продолТался Π² срСднСм Π΄ΠΎ 5 сСкунд. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ это ΠΎΠ±Ρ€Ρ‹Π²Π°Π»ΠΈΡΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ запросы ΠΊ старому pod’у, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ тСрминировался. ПослС этого появились 503 ошибки, Ρ‡Ρ‚ΠΎ стало Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ остановлСнного ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° NGINX, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΠΎΡ€Π²Π°Π» соСдинСния ΠΈΠ·-Π·Π° бэкСнда (ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ ΠΊ Π½Π΅ΠΌΡƒ Π½Π΅ смог ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Ingress).

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ process_control_timeout Π² PHP-FPM ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΌ Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ child-процСссов, Ρ‚.Π΅. ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ошибки. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ ΡƒΠΆΠ΅ с использованиСм этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹:

Kubernetes tips & tricks: особСнности выполнСния graceful shutdown Π² NGINX ΠΈ PHP-FPM

Π’ΠΎ врСмя дСплоя 500-Ρ… ошибок большС Π½Π΅Ρ‚! Π”Π΅ΠΏΠ»ΠΎΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, graceful shutdown Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Однако стоит Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚ с Ingress-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ, нСбольшой ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ошибок Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ·-Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π»Π°Π³Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, остаСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ со sleep ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Π΄Π΅ΠΏΠ»ΠΎΠΉ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π² нашСм ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅ Π±Ρ‹Π»ΠΎ Π²ΠΈΠ΄Π½ΠΎ (ошибок снова Π½Π΅Ρ‚).

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΎΡ‚ прилоТСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ повСдСния:

  1. ΠžΠΆΠΈΠ΄Π°Ρ‚ΡŒ нСсколько сСкунд, послС Ρ‡Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ соСдинСния.
  2. Π”ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всСх запросов ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ всС keepalive-ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ запросы Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚.
  3. Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ свой процСсс.

Однако Π½Π΅ всС прилоТСния ΡƒΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Одним ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² рСалиях Kubernetes являСтся:

  • Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ…ΡƒΠΊΠ° pre-stop, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ нСсколько сСкунд;
  • ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° нашСго бэкСнда Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с NGINX позволяСт ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сигналы ΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ, ΠΌΠΎΠΆΠ΅Ρ‚ этого Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, поэтому ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ 500 ошибок Π²ΠΎ врСмя дСплоя прилоТСния. Π’Π°ΠΊΠΆΠ΅ это позволяСт ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΡˆΠΈΡ€Π΅ ΠΈ Π½Π΅ ΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ pod’С ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Π° ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° всю инфраструктуру Π² Ρ†Π΅Π»ΠΎΠΌ.

Π’ качСствС инструмСнта для тСстирования ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ЯндСкс.Π’Π°Π½ΠΊ совмСстно с любой систСмой ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° (Π² нашСм случаС для тСста Π±Ρ€Π°Π»ΠΈΡΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Grafana с бэкСндом Π² Π²ΠΈΠ΄Π΅ Prometheus). ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с graceful shutdown Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π½Ρ‹ ΠΏΡ€ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ benchmark, Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π΅Π΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π²ΠΎ врСмя ΠΈΠ»ΠΈ послС тСста.

ΠžΡ‚Π²Π΅Ρ‡Π°Ρ Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь ΠΏΠΎ ΡΡ‚Π°Ρ‚ΡŒΠ΅: стоит ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΏΡƒΡ‚ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ здСсь ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ NGINX Ingress. Для Π΄Ρ€ΡƒΠ³ΠΈΡ… случаСв Π΅ΡΡ‚ΡŒ ΠΈΠ½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ рассмотрим Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°Ρ… Ρ†ΠΈΠΊΠ»Π°.

P.S.

Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° K8s tips & tricks:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com