Leideanna & cleasanna Kubernetes: gnéithe de mhúchadh galánta i NGINX agus PHP-FPM

Coinníoll tipiciúil le linn CI/CD a chur i bhfeidhm in Kubernetes: ní mór don fheidhmchlár a bheith in ann gan glacadh le hiarratais nua ó chliaint sula stopann sé go hiomlán, agus níos tábhachtaí fós, na cinn atá ann cheana a chomhlánú go rathúil.

Leideanna & cleasanna Kubernetes: gnéithe de mhúchadh galánta i NGINX agus PHP-FPM

Ligeann comhlíonadh an choinníll seo duit náid downtime a bhaint amach le linn imscaradh. Mar sin féin, fiú nuair a bhíonn babhtaí an-tóir orthu (cosúil le NGINX agus PHP-FPM), is féidir leat teacht ar dheacrachtaí as a dtiocfaidh méadú ar earráidí le gach imscaradh ...

Teoiric. Conas a chónaíonn pod

Tá go mion foilsithe againn cheana féin faoi shaolré pod airteagal seo. I gcomhthéacs an ábhair atá faoi bhreithniú, tá suim againn sna nithe seo a leanas: i láthair na huaire nuair a théann an pod isteach sa stát Foirceannadh, stoptar iarratais nua a sheoladh chuige (pod scriosta ón liosta críochphointí don tseirbhís). Mar sin, chun downtime a sheachaint le linn imscaradh, is leor dúinn an fhadhb a bhaineann le stop a chur leis an bhfeidhmchlár a réiteach i gceart.

Ba cheart duit cuimhneamh freisin gurb é an tréimhse cairde réamhshocraithe 30 soicind: tar éis seo, cuirfear deireadh leis an pod agus ní mór go mbeadh am ag an iarratas gach iarratas a phróiseáil roimh an tréimhse seo. Tabhair faoi deara: cé go bhfuil fadhb ar bith ag aon iarratas a thógann níos mó ná 5-10 soicind cheana féin, agus ní chuideoidh múchadh galánta leis a thuilleadh...

Chun tuiscint níos fearr a fháil ar cad a tharlaíonn nuair a chríochnaíonn pod, níl le déanamh ach breathnú ar an léaráid seo a leanas:

Leideanna & cleasanna Kubernetes: gnéithe de mhúchadh galánta i NGINX agus PHP-FPM

A1, B1 - Athruithe a fháil ar staid an teallaigh
A2 - SIGTERM Imeachta
B2 - Poda a bhaint de chríochphointí
B3 - Athruithe a fháil (tá liosta na gcríochphointí athraithe)
B4 - Rialacha iptables a nuashonrú

Tabhair faoi deara le do thoil: ní tharlaíonn sé go seicheamhach má scriostar an pod críochphointe agus má sheoltar SITERM, ach go comhthreomhar. Agus mar gheall ar an bhfíric nach bhfaigheann Ingress an liosta nuashonraithe de Chríochphointí láithreach, seolfar iarratais nua ó chliaint chuig an pod, rud a chuirfidh earráid 500 le linn fhoirceannadh an pod. (Le haghaidh ábhar níos mionsonraithe ar an gceist seo, táimid aistrithe). Is gá an fhadhb seo a réiteach ar na bealaí seo a leanas:

  • Seol Ceangal: dún na ceanntásca freagartha (má bhaineann sé seo le feidhmchlár HTTP).
  • Mura féidir athruithe a dhéanamh ar an gcód, déanann an t-alt seo a leanas cur síos ar réiteach a ligfidh duit iarratais a phróiseáil go dtí deireadh na tréimhse galánta.

Teoiric. Conas a chríochnaíonn NGINX agus PHP-FPM a gcuid próiseas

nginx

Let tús le NGINX, ós rud é go bhfuil gach rud níos mó nó níos lú soiléir leis. Ag tumadh isteach sa teoiric, foghlaimímid go bhfuil máistirphróiseas amháin agus roinnt “oibrithe” ag NGINX - is próisis leanaí iad seo a phróiseálann iarratais na gcliant. Cuirtear rogha áisiúil ar fáil: an t-ordú a úsáid nginx -s <SIGNAL> próisis a fhoirceannadh i múchadh tapa nó modh múchadh galánta. Ar ndóigh, is é an dara rogha a bhfuil leas againn.

Ansin tá gach rud simplí: ní mór duit a chur leis preStop-dubhán ordú a sheolfaidh comhartha múchta galánta. Is féidir é seo a dhéanamh in Imscaradh, sa bhloc coimeádán:

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

Anois, nuair a dhúnann an pod síos, feicfimid an méid seo a leanas i logaí coimeádán 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

Agus ciallóidh sé seo an méid a theastaíonn uainn: fanann NGINX le hiarratais a chomhlánú, agus ansin maraíonn sé an próiseas. Mar sin féin, thíos beimid ag smaoineamh freisin ar fhadhb choitianta mar gheall ar a, fiú leis an ordú nginx -s quit cuirtear deireadh leis an bpróiseas go mícheart.

Agus ag an gcéim seo táimid ag déanamh le NGINX: ar a laghad ó na logs is féidir leat a thuiscint go bhfuil gach rud ag obair mar ba chóir.

Cad é an déileáil le PHP-FPM? Conas a dhéileálann sé le múchadh galánta? A ligean ar figiúr sé amach.

PHP-FPM

I gcás PHP-FPM, tá beagán níos lú faisnéise ann. Má dhíríonn tú ar lámhleabhar oifigiúil de réir PHP-FPM, déarfaidh sé go nglactar leis na comharthaí POSIX seo a leanas:

  1. SIGINT, SIGTERM - múchadh tapa;
  2. SIGQUIT - múchadh galánta (an méid is gá dúinn).

Níl na comharthaí atá fágtha ag teastáil sa tasc seo, mar sin fágfaimid a n-anailís ar lár. Chun an próiseas a fhoirceannadh i gceart, beidh ort an duán preStop seo a leanas a scríobh:

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

Ar an gcéad amharc, is é seo go léir atá ag teastáil chun múchadh galánta a dhéanamh sa dá choimeádán. Mar sin féin, tá an tasc níos deacra ná mar is cosúil. Anseo thíos tá dhá chás nár oibrigh múchadh galánta agus ba chúis le neamh-infhaighteacht gearrthéarmach an tionscadail le linn an imscartha.

Cleachtadh. Fadhbanna féideartha le múchadh galánta

nginx

Ar an gcéad dul síos, tá sé úsáideach cuimhneamh: chomh maith leis an ordú a fhorghníomhú nginx -s quit Tá céim amháin eile ann ar fiú aird a thabhairt air. Thángamar ar fhadhb ina mbeadh NGINX fós ag seoladh SITERM in ionad an chomhartha SIGQUIT, rud a fhágann nach raibh iarratais críochnaithe i gceart. Is féidir cásanna den chineál céanna a fháil, mar shampla, anseo. Ar an drochuair, níorbh fhéidir linn an chúis shonrach leis an iompar seo a chinneadh: bhí amhras ann faoin leagan NGINX, ach níor deimhníodh é. Ba é an symptom ná gur breathnaíodh teachtaireachtaí i logaí coimeádán NGINX: msgstr "soicéad oscailte #10 fágtha i gceangal 5", ina dhiaidh sin stop an pod.

Is féidir linn fadhb den sórt sin a fheiceáil, mar shampla, ó na freagraí ar an Ingress a theastaíonn uainn:

Leideanna & cleasanna Kubernetes: gnéithe de mhúchadh galánta i NGINX agus PHP-FPM
Táscairí na gcód stádais tráth an imscartha

Sa chás seo, ní fhaighimid ach cód earráide 503 ó Ingress féin: ní féidir leis rochtain a fháil ar an gcoimeádán NGINX, toisc nach bhfuil sé inrochtana a thuilleadh. Má fhéachann tú ar na logaí coimeádán le NGINX, tá na nithe seo a leanas iontu:

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

Tar éis an comhartha stad a athrú, tosaíonn an coimeádán ag stopadh i gceart: deimhnítear é seo leis an bhfíric nach dtugtar faoi deara an earráid 503 a thuilleadh.

Má thagann tú trasna ar fhadhb den chineál céanna, is fiú a dhéanamh amach cén comhartha stad a úsáidtear sa choimeádán agus cad é go díreach atá ar an gcrúca preStop. Is féidir go leor go luíonn an chúis go beacht leis seo.

PHP-FPM... agus níos mó

Déantar cur síos ar an bhfadhb le PHP-FPM ar bhealach fánach: ní fhanann sé le próisis leanaí a chríochnú, cuireann sé deireadh leo, agus is é sin an fáth a tharlaíonn earráidí 502 le linn imscaradh agus oibríochtaí eile. Tá roinnt tuairiscí fabhtanna ar bugs.php.net ó 2005 (m.sh anseo и anseo), a chuireann síos ar an bhfadhb seo. Ach is dócha nach bhfeicfidh tú rud ar bith sna logaí: fógróidh PHP-FPM críochnú a phróisis gan aon earráidí nó fógraí tríú páirtí.

Is fiú a shoiléiriú go bhféadfadh an fhadhb féin a bheith ag brath go pointe níos lú nó níos mó ar an iarratas féin agus go bhféadfadh sé nach léireofaí í féin, mar shampla, i monatóireacht. Má thagann tú trasna air, tagann réiteach simplí chun cuimhne ar dtús: cuir duán preStop leis sleep(30). Tabharfaidh sé deis duit gach iarratas a bhí roimhe seo a chomhlánú (agus ní ghlacaimid le cinn nua, ós rud é pod cheana féin ábalta Foirceannadh), agus tar éis 30 soicind críochnóidh an pod féin le comhartha SIGTERM.

Casadh sé amach go lifecycle le haghaidh beidh an coimeádán cuma mar seo:

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

Mar sin féin, mar gheall ar an 30-dara sleep táimid ag go láidir méadóimid an t-am imscartha, ós rud é go gcuirfear deireadh le gach pod íosmhéid 30 soicind, rud atá dona. Cad is féidir a dhéanamh faoi seo?

Rachaimid chuig an bpáirtí atá freagrach as an iarratas a chur i gcrích go díreach. Is é ár gcás go bhfuil sé PHP-FPMCén de réir réamhshocraithe ní dhéanann sé monatóireacht ar fhorghníomhú a phróisis leanbh: Cuirtear deireadh leis an bpróiseas máistir láithreach. Is féidir leat an t-iompar seo a athrú tríd an treoir a úsáid process_control_timeout, a shonraíonn na teorainneacha ama do phróisis leanaí fanacht le haghaidh comharthaí ón máistir. Má shocraíonn tú an luach go 20 soicind, clúdóidh sé seo an chuid is mó de na fiosrúcháin a ritheann sa choimeádán agus stopfaidh sé an máistirphróiseas nuair a bheidh siad críochnaithe.

Leis an eolas seo, fillfimid ar ár bhfadhb dheireanach. Mar a luadh, ní ardán monolithic é Kubernetes: glacann cumarsáid idir a chomhpháirteanna éagsúla roinnt ama. Tá sé seo fíor go háirithe nuair a dhéanaimid breithniú ar oibriú Ingresses agus comhpháirteanna gaolmhara eile, toisc go bhfuil sé éasca borrtha de 500 earráid a fháil mar gheall ar mhoill den sórt sin tráth an imscartha. Mar shampla, d’fhéadfadh earráid tarlú ag an gcéim ina gcuirtear iarratas chuig sruth in aghaidh an tsrutha, ach tá “moill ama” na hidirghníomhaíochta idir comhpháirteanna gearr go leor - níos lú ná soicind.

Dá bhrí sin, San iomlán leis an treoir a luadh cheana process_control_timeout is féidir leat an tógáil seo a leanas a úsáid le haghaidh lifecycle:

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

Sa chás seo, déanfaimid cúiteamh ar an moill leis an ordú sleep agus nach méadaíonn tú an t-am imscartha go mór: an bhfuil difríocht shuntasach idir 30 soicind agus soicind amháin?.. Go deimhin, is é an process_control_timeoutAgus lifecycle a úsáid mar “líon sábhála” amháin i gcás moille.

Go ginearálta ní bhaineann an t-iompar a bhfuil cur síos déanta air agus an t-imoibriú comhfhreagrach le PHP-FPM amháin. D’fhéadfadh go n-eascródh cás den chineál céanna ar bhealach amháin nó ar bhealach eile agus teangacha/creatacha eile á n-úsáid. Mura féidir leat múchadh galánta a shocrú ar bhealaí eile - mar shampla, tríd an gcód a athscríobh ionas go bpróiseálann an feidhmchlár comharthaí foirceanta i gceart - is féidir leat an modh a bhfuil cur síos déanta air a úsáid. B'fhéidir nach é an ceann is áille, ach oibríonn sé.

Cleachtadh. Tástáil luchtaithe chun oibriú an phota a sheiceáil

Tá tástáil ualaigh ar cheann de na bealaí chun conas a oibríonn an coimeádán a sheiceáil, ós rud é go dtugann an nós imeachta seo níos gaire do choinníollacha comhraic fíor nuair a thugann úsáideoirí cuairt ar an suíomh. Chun na moltaí thuas a thástáil, is féidir leat é a úsáid Yandex.Tankom: Clúdaíonn sé ár gcuid riachtanas go léir go foirfe. Seo a leanas leideanna agus moltaí maidir le tástáil a dhéanamh le sampla soiléir ónár dtaithí a bhuíochas le graif Grafana agus Yandex.Tank féin.

Is é an rud is tábhachtaí anseo seiceáil na hathruithe céim ar chéim. Tar éis do shocrú nua a chur leis, reáchtáil an tástáil agus féach an bhfuil na torthaí athraithe i gcomparáid leis an rith dheireanach. Seachas sin, beidh sé deacair réitigh neamhéifeachtacha a aithint, agus san fhadtréimhse ní féidir leis ach dochar a dhéanamh (mar shampla, an t-am imscaradh a mhéadú).

Is nuance eile breathnú ar na logaí coimeádán le linn a fhoirceannadh. An bhfuil faisnéis maidir le múchadh galánta taifeadta ann? An bhfuil aon earráidí sna logaí agus rochtain á fáil ar acmhainní eile (mar shampla, chuig coimeádán PHP-FPM in aice láimhe)? Earráidí san iarratas féin (mar atá sa chás le NGINX a thuairiscítear thuas)? Tá súil agam go gcabhróidh an fhaisnéis tosaigh ón alt seo leat tuiscint níos fearr a fháil ar cad a tharlaíonn don choimeádán le linn a fhoirceanta.

Mar sin, tharla an chéad rith tástála gan lifecycle agus gan treoracha breise don fhreastalaí feidhmchláir (process_control_timeout i PHP-FPM). Ba é cuspóir na tástála seo líon na n-earráidí (agus an bhfuil aon earráidí) a shainaithint. Chomh maith leis sin, ó fhaisnéis bhreise, ba chóir go mbeadh a fhios agat go raibh an meán-am imscaradh do gach pod thart ar 5-10 soicind go dtí go raibh sé réidh go hiomlán. Is iad na torthaí:

Leideanna & cleasanna Kubernetes: gnéithe de mhúchadh galánta i NGINX agus PHP-FPM

Taispeánann painéal faisnéise Yandex.Tank spike de 502 earráid, a tharla tráth an imscartha agus a mhair suas le 5 soicind ar an meán. Is dócha gur tharla sé seo toisc go raibh deireadh á chur le hiarrataí a bhí ann cheana ar an seanphota nuair a bhí deireadh á chur leis. Tar éis seo, tháinig earráidí 503 le feiceáil, a bhí mar thoradh ar choimeádán NGINX stoptha, a thit naisc freisin mar gheall ar an inneall (rud a chuir cosc ​​​​ar Ingress nascadh leis).

A ligean ar a fheiceáil conas process_control_timeout i PHP-FPM cabhróidh sé linn fanacht le próisis linbh a chríochnú, i.e. earráidí den sórt sin a cheartú. Athimscaradh ag baint úsáide as an treoir seo:

Leideanna & cleasanna Kubernetes: gnéithe de mhúchadh galánta i NGINX agus PHP-FPM

Níl a thuilleadh earráidí le linn an 500ú imscaradh! Tá an t-imscaradh rathúil, oibreacha múchadh galánta.

Mar sin féin, is fiú cuimhneamh ar an tsaincheist le coimeádáin Ingress, céatadán beag de na hearráidí a d’fhéadfaimis a fháil mar gheall ar aga moille. Chun iad a sheachaint, níl fágtha ach struchtúr a chur leis sleep agus an t-imscaradh arís. Mar sin féin, inár gcás ar leith, ní raibh aon athruithe le feiceáil (arís, gan aon earráidí).

Conclúid

Chun an próiseas a fhoirceannadh go galánta, táimid ag súil leis an iompar seo a leanas ón iarratas:

  1. Fan cúpla soicind agus ansin stop a ghlacadh le naisc nua.
  2. Fan go gcríochnóidh agus go ndúnfaidh gach iarratas gach nasc coimeádta nach bhfuil ag déanamh iarratais.
  3. Cuir deireadh le do phróiseas.

Mar sin féin, ní féidir le gach iarratas oibriú ar an mbealach seo. Réiteach amháin ar an bhfadhb i réaltachtaí Kubernetes ná:

  • ag cur Hook réamh-stad a fanacht cúpla soicind;
  • ag déanamh staidéir ar chomhad cumraíochta ár n-innill le haghaidh na bparaiméadar cuí.

Déanann an sampla le NGINX sé soiléir go bhféadfadh sé nach ndéanfadh fiú feidhmchlár ar cheart dó comharthaí foirceanta a phróiseáil i gceart ar dtús, agus mar sin tá sé ríthábhachtach seiceáil le haghaidh 500 earráid le linn imscaradh iarratais. Ligeann sé seo duit freisin breathnú ar an bhfadhb níos leithne agus gan díriú ar phoda nó coimeádán amháin, ach breathnú ar an mbonneagar iomlán ina iomláine.

Mar uirlis tástála, is féidir leat Yandex.Tank a úsáid i gcomhar le haon chóras monatóireachta (inár gcás, tógadh sonraí ó Grafana le hinnill Prometheus don tástáil). Tá fadhbanna le múchadh galánta le feiceáil go soiléir faoi ualaí troma is féidir leis an tagarmharc a ghiniúint, agus cuidíonn monatóireacht le hanailís níos mine a dhéanamh ar an gcás le linn na tástála nó ina diaidh.

Mar fhreagra ar aiseolas ar an alt: is fiú a lua go bhfuil cur síos anseo ar na fadhbanna agus na réitigh maidir le NGINX Ingress. I gcásanna eile, tá réitigh eile ann, ar féidir linn a mheas sna hábhair seo a leanas den tsraith.

PS

Eile ón tsraith leideanna & cleasanna K8s:

Foinse: will.com

Ceannaigh óstáil iontaofa do shuímh le cosaint DDoS, freastalaithe VPS VDS 🔥 Ceannaigh óstáil gréasáin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster