Kubernetes tips & tricks: karatteristiċi ta 'għeluq graceful f'NGINX u PHP-FPM

Kondizzjoni tipika meta timplimenta CI/CD f'Kubernetes: l-applikazzjoni trid tkun kapaċi ma taċċettax talbiet ġodda tal-klijenti qabel ma tieqaf kompletament, u l-aktar importanti, tlesti b'suċċess dawk eżistenti.

Kubernetes tips & tricks: karatteristiċi ta 'għeluq graceful f'NGINX u PHP-FPM

Il-konformità ma 'din il-kundizzjoni tippermettilek li tikseb ħin ta' waqfien żero waqt l-iskjerament. Madankollu, anke meta tuża qatet popolari ħafna (bħal NGINX u PHP-FPM), tista’ tiltaqa’ ma’ diffikultajiet li jwasslu għal żieda qawwija ta’ żbalji ma’ kull skjerament...

Teorija. Kif jgħix pod

Diġà ppubblikajna fid-dettall dwar iċ-ċiklu tal-ħajja ta’ pod dan l-artikolu. Fil-kuntest tas-suġġett taħt konsiderazzjoni, aħna interessati f'dan li ġej: fil-mument meta l-pod jidħol fl-istat Ittemm, talbiet ġodda ma jibqgħux jintbagħtu lilha (pod imħassra mil-lista ta’ endpoints għas-servizz). Għalhekk, biex jiġi evitat ħin ta 'waqfien waqt l-iskjerament, huwa biżżejjed għalina li nsolvu l-problema li nwaqqfu l-applikazzjoni b'mod korrett.

Għandek tiftakar ukoll li l-perjodu ta 'grazzja default huwa 30 sekonda: wara dan, il-pod jiġi tterminat u l-applikazzjoni għandu jkollha ħin biex tipproċessa t-talbiet kollha qabel dan il-perjodu. Innota: għalkemm kwalunkwe talba li tieħu aktar minn 5-10 sekondi hija diġà problematika, u l-għeluq grazzjuż mhux se jibqa' jgħinha...

Biex tifhem aħjar x'jiġri meta pod jintemm, ara biss id-dijagramma li ġejja:

Kubernetes tips & tricks: karatteristiċi ta 'għeluq graceful f'NGINX u PHP-FPM

A1, B1 - Jirċievu bidliet dwar l-istat tal-fuklar
A2 - Tluq SIGTERM
B2 - It-tneħħija ta' pod minn endpoints
B3 - Nirċievu bidliet (il-lista ta' endpoints inbidlet)
B4 - Aġġorna r-regoli tal-iptables

Jekk jogħġbok innota: it-tħassir tal-pod tal-endpoint u li jintbagħat SIGTERM ma jseħħx b'mod sekwenzjali, iżda b'mod parallel. U minħabba l-fatt li Ingress ma jirċievix immedjatament il-lista aġġornata ta 'Endpoints, talbiet ġodda mill-klijenti se jintbagħtu lill-pod, li se jikkawża żball 500 waqt it-terminazzjoni tal-pod. (għal materjal aktar dettaljat dwar din il-kwistjoni, aħna tradott). Din il-problema trid tissolva bil-modi li ġejjin:

  • Ibgħat Konnessjoni: agħlaq fl-intestaturi tar-rispons (jekk dan jikkonċerna applikazzjoni HTTP).
  • Jekk ma jkunx possibbli li tagħmel bidliet fil-kodiċi, allura l-artikolu li ġej jiddeskrivi soluzzjoni li tippermettilek tipproċessa t-talbiet sa tmiem il-perjodu graceful.

Teorija. Kif NGINX u PHP-FPM itemmu l-proċessi tagħhom

NGINX

Nibdew b'NGINX, peress li kollox huwa ftit jew wisq ovvju magħha. Għaddas fit-teorija, nitgħallmu li NGINX għandu proċess ewlieni wieħed u diversi "ħaddiema" - dawn huma proċessi tfal li jipproċessaw it-talbiet tal-klijenti. Għażla konvenjenti hija pprovduta: bl-użu tal-kmand nginx -s <SIGNAL> ittemm il-proċessi jew fil-mod ta 'għeluq mgħaġġel jew ta' għeluq graceful. Ovvjament, hija l-aħħar għażla li tinteressana.

Imbagħad kollox huwa sempliċi: għandek bżonn iżżid preStop-ganċ kmand li se jibgħat sinjal ta 'għeluq graceful. Dan jista' jsir fl-Iskjerament, fil-blokk tal-kontejners:

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

Issa, meta l-pod tintefa, se naraw dan li ġej fir-zkuk tal-kontenituri 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

U dan se jfisser dak li għandna bżonn: NGINX jistenna li t-talbiet jitlestew, u mbagħad joqtol il-proċess. Madankollu, hawn taħt se nikkunsidraw ukoll problema komuni li minħabba fiha, anke bil-kmand nginx -s quit il-proċess jintemm ħażin.

U f'dan l-istadju lestejna ma 'NGINX: mill-inqas mir-zkuk tista' tifhem li kollox qed jaħdem kif suppost.

X'inhu l-ftehim ma PHP-FPM? Kif timmaniġġja għeluq graceful? Ejja insemmu.

PHP-FPM

Fil-każ ta 'PHP-FPM, hemm ftit inqas informazzjoni. Jekk tiffoka fuq manwal uffiċjali skont PHP-FPM, se jgħid li s-sinjali POSIX li ġejjin huma aċċettati:

  1. SIGINT, SIGTERM — għeluq mgħaġġel;
  2. SIGQUIT — għeluq grazzjuż (dak li għandna bżonn).

Is-sinjali li fadal mhumiex meħtieġa f'dan il-kompitu, għalhekk se nħallu barra l-analiżi tagħhom. Biex ittemm il-proċess b'mod korrett, ser ikollok bżonn tikteb il-ganċ preStop li ġej:

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

L-ewwel daqqa t'għajn, dan huwa dak kollu li huwa meħtieġ biex twettaq għeluq grazzjuż fiż-żewġ kontenituri. Madankollu, il-kompitu huwa aktar diffiċli milli jidher. Hawn taħt hemm żewġ każijiet li fihom għeluq graceful ma ħadimx u kkawża indisponibbiltà tal-proġett għal żmien qasir waqt l-iskjerament.

Prattika. Problemi possibbli bl-għeluq graceful

NGINX

L-ewwelnett, huwa utli li tiftakar: minbarra l-eżekuzzjoni tal-kmand nginx -s quit Hemm stadju ieħor li ta' min joqgħod attent għalih. Iltqajna ma 'kwistjoni fejn NGINX xorta jibgħat SIGTERM minflok is-sinjal SIGQUIT, li wassal biex it-talbiet ma jitlestewx b'mod korrett. Każijiet simili jistgħu jinstabu, pereżempju, hawn. Sfortunatament, ma stajniex niddeterminaw ir-raġuni speċifika għal din l-imġieba: kien hemm suspett dwar il-verżjoni NGINX, iżda ma kienx ikkonfermat. Is-sintomu kien li ġew osservati messaġġi fir-reġistri tal-kontenituri NGINX: "socket miftuħ #10 xellug f'konnessjoni 5", wara li l-pod waqaf.

Nistgħu nosservaw problema bħal din, pereżempju, mit-tweġibiet dwar l-Ingress li għandna bżonn:

Kubernetes tips & tricks: karatteristiċi ta 'għeluq graceful f'NGINX u PHP-FPM
Indikaturi tal-kodiċi tal-istatus fil-ħin tal-iskjerament

F'dan il-każ, nirċievu biss kodiċi ta 'żball 503 minn Ingress innifsu: ma jistax jaċċessa l-kontenitur NGINX, peress li m'għadux aċċessibbli. Jekk tħares lejn ir-zkuk tal-kontenituri b'NGINX, fihom dan li ġej:

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

Wara li jinbidel is-sinjal tal-waqfien, il-kontenitur jibda jieqaf b'mod korrett: dan huwa kkonfermat mill-fatt li l-iżball 503 ma jibqax osservat.

Jekk tiltaqa 'ma' problema simili, jagħmel sens li tiddetermina liema sinjal ta 'waqfien jintuża fil-kontenitur u kif jidher eżatt il-ganċ preStop. Huwa pjuttost possibbli li r-raġuni tinsab preċiżament f'dan.

PHP-FPM... u aktar

Il-problema ma 'PHP-FPM hija deskritta b'mod trivjali: ma tistennax it-tlestija tal-proċessi tat-tfal, ittemmhom, u huwa għalhekk li jseħħu żbalji 502 waqt l-iskjerament u operazzjonijiet oħra. Hemm diversi rapporti dwar bugs.php.net mill-2005 (eż hawn и hawn), li jiddeskrivi din il-problema. Imma x'aktarx ma tara xejn fir-zkuk: PHP-FPM se jħabbar it-tlestija tal-proċess tiegħu mingħajr żbalji jew notifiki ta 'partijiet terzi.

Ta 'min jiġi ċċarat li l-problema nnifisha tista' tiddependi sa ċertu punt fuq l-applikazzjoni nnifisha u ma tistax timmanifesta ruħha, pereżempju, fil-monitoraġġ. Jekk tiltaqa' magħha, tiġi f'moħħna l-ewwel soluzzjoni sempliċi: żid ganċ preStop bi sleep(30). Dan jippermettilek timla t-talbiet kollha li kienu qabel (u aħna ma naċċettawx oħrajn ġodda, peress li pod diġà kapaċi Ittemm), u wara 30 sekonda l-powd innifsu jintemm b'sinjal SIGTERM.

Jirriżulta li lifecycle għall-kontenitur se jidher bħal dan:

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

Madankollu, minħabba l-30-sekonda sleep aħna bil-qawwa se nżidu l-ħin tal-iskjerament, peress li kull pod se jiġi tterminat minimu 30 sekonda, li hija ħażina. X'jista' jsir dwar dan?

Ejja nduru lejn il-parti responsabbli għall-eżekuzzjoni diretta tal-applikazzjoni. Fil-każ tagħna huwa PHP-FPMLiema awtomatikament ma jimmonitorjax l-eżekuzzjoni tal-proċessi tfal tiegħu: Il-proċess prinċipali jintemm immedjatament. Tista' tibdel din l-imġiba billi tuża d-direttiva process_control_timeout, li jispeċifika l-limiti ta' żmien għall-proċessi tat-tfal biex jistennew sinjali mill-kaptan. Jekk issettja l-valur għal 20 sekonda, dan ikopri l-biċċa l-kbira tal-mistoqsijiet li jaħdmu fil-kontenitur u jwaqqaf il-proċess prinċipali ladarba jitlestew.

B'dan l-għarfien, ejja nerġgħu lura għall-aħħar problema tagħna. Kif issemma, Kubernetes mhix pjattaforma monolitika: il-komunikazzjoni bejn il-komponenti differenti tagħha tieħu xi żmien. Dan huwa veru speċjalment meta nikkunsidraw l-operat ta 'Ingresses u komponenti oħra relatati, peress li minħabba dewmien bħal dan fil-ħin tal-iskjerament huwa faċli li tinkiseb żieda ta' 500 żball. Pereżempju, jista 'jseħħ żball fl-istadju li tintbagħat talba lil upstream, iżda d-"dewmien ta' żmien" tal-interazzjoni bejn il-komponenti huwa pjuttost qasir - inqas minn sekonda.

Għaldaqstant B'kollox mad-direttiva diġà msemmija process_control_timeout tista tuża l-kostruzzjoni li ġejja għal lifecycle:

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

F'dan il-każ, aħna se nikkumpensaw għad-dewmien bil-kmand sleep u ma żżidx ħafna l-ħin tal-iskjerament: hemm differenza notevoli bejn 30 sekonda u waħda?.. Fil-fatt, hija l- process_control_timeoutU lifecycle użata biss bħala "xibka ta' sikurezza" f'każ ta' dewmien.

B'mod ġenerali l-imġieba deskritta u l-soluzzjoni korrispondenti japplikaw mhux biss għal PHP-FPM. Sitwazzjoni simili tista' b'xi mod jew ieħor tinħoloq meta jintużaw lingwi/oqfsa oħra. Jekk ma tistax tiffissa għeluq graceful b'modi oħra - pereżempju, billi tikteb mill-ġdid il-kodiċi sabiex l-applikazzjoni tipproċessa b'mod korrett is-sinjali tat-terminazzjoni - tista 'tuża l-metodu deskritt. Jista 'ma jkunx l-isbaħ, iżda jaħdem.

Prattika. Ittestjar tat-tagħbija biex tiċċekkja l-operat tal-pod

L-ittestjar tat-tagħbija huwa wieħed mill-modi biex jiċċekkja kif jaħdem il-kontenitur, peress li din il-proċedura tressaqha eqreb lejn kundizzjonijiet reali tal-ġlieda meta l-utenti jżuru s-sit. Biex tittestja r-rakkomandazzjonijiet ta 'hawn fuq, tista' tuża Yandex.Tankom: Ikopri l-bżonnijiet tagħna perfettament. Dawn li ġejjin huma suġġerimenti u rakkomandazzjonijiet għat-twettiq ta 'ttestjar b'eżempju ċar mill-esperjenza tagħna grazzi għall-graffs ta' Grafana u Yandex.Tank innifsu.

L-iktar ħaġa importanti hawnhekk hija iċċekkja l-bidliet pass pass. Wara li żżid soluzzjoni ġdida, agħmel it-test u ara jekk ir-riżultati nbidlux meta mqabbla mal-aħħar ġirja. Inkella, ikun diffiċli li jiġu identifikati soluzzjonijiet ineffettivi, u fit-tul jista 'jagħmel biss ħsara (pereżempju, iżid il-ħin tal-iskjerament).

Sfumatura oħra hija li tħares lejn ir-zkuk tal-kontenitur waqt it-terminazzjoni tiegħu. Hemm informazzjoni dwar għeluq graceful irreġistrat? Hemm xi żbalji fir-zkuk meta jaċċessaw riżorsi oħra (per eżempju, għal kontenitur PHP-FPM viċin)? Żbalji fl-applikazzjoni nnifisha (bħal fil-każ b'NGINX deskritt hawn fuq)? Nittama li l-informazzjoni introduttorja minn dan l-artikolu tgħinek tifhem aħjar x'jiġri mill-kontenitur waqt it-terminazzjoni tiegħu.

Allura, l-ewwel test run saret mingħajr lifecycle u mingħajr direttivi addizzjonali għas-server tal-applikazzjoni (process_control_timeout fil PHP-FPM). L-iskop ta' dan it-test kien li jidentifika n-numru approssimattiv ta' żbalji (u jekk hemmx). Ukoll, minn informazzjoni addizzjonali, għandek tkun taf li l-ħin medju ta 'skjerament għal kull pod kien ta' madwar 5-10 sekondi sakemm kien lest għal kollox. Ir-riżultati huma:

Kubernetes tips & tricks: karatteristiċi ta 'għeluq graceful f'NGINX u PHP-FPM

Il-pannell tal-informazzjoni Yandex.Tank juri spike ta 'żbalji 502, li seħħew fil-ħin tal-iskjerament u damet bħala medja sa 5 sekondi. Preżumibbilment dan kien minħabba li talbiet eżistenti lill-pod l-antik kienu qed jiġu tterminati meta kien qed jiġi tterminat. Wara dan, dehru 503 żbalji, li kien ir-riżultat ta 'kontenitur NGINX imwaqqaf, li wkoll waqa' konnessjonijiet minħabba l-backend (li ma waqqafx Ingress milli jgħaqqad miegħu).

Ejja naraw kif process_control_timeout fil-PHP-FPM se jgħinna nistennew it-tlestija tal-proċessi tat-tfal, i.e. tikkoreġi żbalji bħal dawn. Uża mill-ġdid din id-direttiva:

Kubernetes tips & tricks: karatteristiċi ta 'għeluq graceful f'NGINX u PHP-FPM

M'hemmx aktar żbalji matul il-500 skjerament! L-iskjerament huwa ta 'suċċess, xogħlijiet ta' għeluq graceful.

Madankollu, ta 'min jiftakar il-kwistjoni mal-kontenituri Ingress, persentaġġ żgħir ta' żbalji li nistgħu nirċievu minħabba dewmien ta 'żmien. Biex tevitahom, kulma jibqa 'huwa li żżid struttura ma' sleep u rrepeti l-iskjerament. Madankollu, fil-każ partikolari tagħna, l-ebda tibdil ma kien viżibbli (għal darb'oħra, l-ebda żball).

Konklużjoni

Biex ttemm il-proċess b'grazzja, nistennew l-imġieba li ġejja mill-applikazzjoni:

  1. Stenna ftit sekondi u mbagħad tieqaf taċċetta konnessjonijiet ġodda.
  2. Stenna li t-talbiet kollha jitlestew u jagħlqu l-konnessjonijiet kollha keepalive li mhumiex qed iwettqu t-talbiet.
  3. Tmiem il-proċess tiegħek.

Madankollu, mhux l-applikazzjonijiet kollha jistgħu jaħdmu b'dan il-mod. Soluzzjoni waħda għall-problema fir-realtajiet Kubernetes hija:

  • iżżid ganċ pre-stop li se jistenna ftit sekondi;
  • nistudjaw il-fajl tal-konfigurazzjoni tal-backend tagħna għall-parametri xierqa.

L-eżempju b'NGINX jagħmilha ċara li anke applikazzjoni li inizjalment għandha tipproċessa s-sinjali tat-terminazzjoni b'mod korrett tista' ma tagħmilx hekk, għalhekk huwa kritiku li tiċċekkja għal 500 żball waqt l-iskjerament tal-applikazzjoni. Dan jippermettilek ukoll li tħares lejn il-problema b'mod aktar wiesa' u ma tiffokax fuq pod jew kontenitur wieħed, iżda tħares lejn l-infrastruttura kollha kollha kemm hi.

Bħala għodda tal-ittestjar, tista 'tuża Yandex.Tank flimkien ma' kwalunkwe sistema ta 'monitoraġġ (fil-każ tagħna, id-dejta ttieħdet minn Grafana b'backend Prometheus għat-test). Problemi ta 'għeluq graceful huma viżibbli b'mod ċar taħt tagħbijiet tqal li l-punt ta' referenza jista 'jiġġenera, u l-monitoraġġ jgħin biex tanalizza s-sitwazzjoni f'aktar dettall waqt jew wara t-test.

Bi tweġiba għall-feedback dwar l-artikolu: ta 'min isemmi li l-problemi u s-soluzzjonijiet huma deskritti hawn b'rabta ma' NGINX Ingress. Għal każijiet oħra, hemm soluzzjonijiet oħra, li nistgħu nikkunsidraw fil-materjali li ġejjin tas-serje.

PS

Oħrajn mis-serje ta' tips & tricks K8s:

Sors: www.habr.com

Żid kumment