Kubernetes talooyinka & tabaha: sifooyinka xidhitaanka quruxda badan ee NGINX iyo PHP-FPM

Xaalad caadi ah marka la fulinayo CI / CD gudaha Kubernetes: codsigu waa inuu awood u leeyahay inuu aqbalo codsiyada cusub ee macmiilka ka hor inta uusan si buuxda u joojin, iyo tan ugu muhiimsan, si guul leh u dhamaystirto kuwa hadda jira.

Kubernetes talooyinka & tabaha: sifooyinka xidhitaanka quruxda badan ee NGINX iyo PHP-FPM

U hoggaansanaanta xaaladdan waxay kuu oggolaaneysaa inaad gaarto eber hoos u dhac inta lagu jiro hawlgalka. Si kastaba ha noqotee, xitaa markaad isticmaaleyso xirmooyinka aadka loo jecel yahay (sida NGINX iyo PHP-FPM), waxaad la kulmi kartaa dhibaatooyin u horseedi doona khaladaad badan oo la diro kasta…

Aragtida. Sidee bay u nooshahay

Waxaan horay u daabacnay si faahfaahsan oo ku saabsan wareegga nolosha ee podska maqaalkan. Marka la eego mawduuca la tixgelinayo, waxaan xiisayneynaa kuwan soo socda: waqtigan marka boodhka uu galo gobolka Joojinta, codsiyada cusub waa la joojiyay in loo soo diro (pod laga saaray laga soo bilaabo liiska dhammaadka ee adeegga). Sidaa darteed, si aan uga fogaano wakhtiga dhimista inta lagu jiro hawlgalka, way nagu filan tahay inaan xallino dhibaatada joojinta codsiga si sax ah.

Waa inaad sidoo kale xasuusataa in muddada nimcada ee caadiga ah ay tahay 30 ilbiriqsi: tan ka dib, boodhka waa la joojin doonaa codsiguna waa inuu haystaa wakhti uu ku socodsiiyo dhammaan codsiyada muddadan ka hor. tacliiq: in kasta oo codsi kasta oo qaata in ka badan 5-10 ilbiriqsi uu horeba dhib u leeyahay, xidhidhnimada quruxda badana ma caawin doonto...

Si aad si fiican u fahamto waxa dhacaya marka boodhku joojiyo, kaliya eeg jaantuska soo socda:

Kubernetes talooyinka & tabaha: sifooyinka xidhitaanka quruxda badan ee NGINX iyo PHP-FPM

A1, B1 - Helitaanka isbeddelada ku saabsan xaaladda wadnaha
A2 - bixitaanka SIGTERM
B2 - Ka saarida boodhka meelaha dhamaadka
B3 - Helitaanka isbeddelada (liiska dhammaadka ayaa isbeddelay)
B4 - Cusbooneysii xeerarka iptables

Fadlan ogow: Tirtiridda boodhka dhamaadka iyo dirista SIGTERM ma dhacayso si isdaba joog ah, laakiin waa barbar socda. Sababtoo ah xaqiiqda ah in Ingress uusan isla markiiba helin liiska la cusboonaysiiyay ee Endpoints, codsiyada cusub ee macaamiisha ayaa loo diri doonaa boodhka, taas oo keeni doonta qalad 500 ah inta lagu jiro joojinta boodhka. (waxyaabo faahfaahsan oo arrintan ku saabsan, annagu turjumay). Dhibaatadan waxay u baahan tahay in lagu xalliyo siyaabaha soo socda:

  • Dir Xidhiidhka: xidh jawaabaha madaxyada (haddii ay tani khusayso codsiga HTTP).
  • Haddii aysan suurtagal ahayn in wax laga beddelo koodhka, markaa maqaalkan soo socdaa wuxuu qeexayaa xal kuu oggolaanaya inaad ka baaraandegto codsiyada illaa dhammaadka muddada nimcada.

Aragtida. Sida NGINX iyo PHP-FPM u joojiyaan hawlahooda

NGINX

Aan ku bilowno NGINX, maadaama wax walba ay ka badan yihiin ama ka yar yihiin kuwa iska cad. Gelitaanka aragtida, waxaan baraneynaa in NGINX uu leeyahay hal nidaam oo heer sare ah iyo dhowr "shaqaale" - kuwani waa hababka carruurta ee ka baaraandegaya codsiyada macmiilka. Doorasho ku habboon ayaa la bixiyaa: iyadoo la adeegsanayo amarka nginx -s <SIGNAL> Jooji hababka si degdeg ah u xidhidh ama hab xidhid qurux badan. Sida iska cad, waa doorashada dambe ta ina danaynaysa.

Markaa wax walba waa sahlan yihiin: waxaad u baahan tahay inaad ku darto Jillaab-joojin hore amar soo diri doona calaamad xiritaan qurux badan. Tan waxaa lagu samayn karaa Deployment, oo ku jira qaybta weelka:

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

Hadda, marka boodhku xidho, waxaan ku arki doonaa kuwan soo socda ee kujira weelka 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

Tani waxay ka dhigan tahay waxa aan u baahanahay: NGINX waxay sugtaa codsiyada si loo dhamaystiro, ka dibna dila habka. Si kastaba ha ahaatee, hoos waxaan sidoo kale tixgelin doonaa dhibaato caadi ah oo ay sabab u tahay, xitaa amarka nginx -s quit nidaamku si khaldan ayuu u dhamaanayaa.

Marxaladdan waxaan ku dhammeynay NGINX: ugu yaraan laga bilaabo diiwaannada waxaad fahmi kartaa in wax walba ay u shaqeynayaan sidii ay ahayd.

Waa maxay heshiiska PHP-FPM? Sidee u maamushaa xidhidhnimada quruxda badan? Aynu ogaano.

PHP-FPM

Xaaladda PHP-FPM, waxaa jira macluumaad yar oo yar. Hadii aad diirada saarto buug-gacmeedka rasmiga ah Marka loo eego PHP-FPM, waxay sheegi doontaa in calaamadaha POSIX ee soo socda la aqbalo:

  1. SIGINT, SIGTERM - xirid degdeg ah;
  2. SIGQUIT - xidhid qurux badan (waxa aan u baahanahay).

Calaamadaha soo haray loogama baahna hawshan, markaa waxaan ka tagi doonaa falanqayntooda. Si aad habka saxda ah u joojiso, waxaad u baahan doontaa inaad qorto jilbaha soo socda ee Joojinta:

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

Jaleecada hore, tani waa waxa kaliya ee loo baahan yahay si loo sameeyo xidhid qurux badan labada weel. Si kastaba ha ahaatee, hawshu way ka adag tahay sida ay u muuqato. Hoos waxaa ku yaal laba kiis oo xiritaan qurux badan ay shaqeyn weyday oo ay sababtay maqnaanshaha mashruuca muddada gaaban ee muddada la dirayo.

Ku celceli. Dhibaatooyinka suurtagalka ah ee xiritaanka quruxda badan

NGINX

Ugu horreyntii, waxaa faa'iido leh in la xasuusto: marka lagu daro fulinta amarka nginx -s quit Waxaa jira hal mar oo kale oo mudan in fiiro gaar ah loo yeesho. Waxaan la kulanay arin meesha NGINX ay wali u soo diri doonto SIGTERM halkii ay ka diri lahayd calaamada SIGQUIT, taasoo keentay in codsiyada aan si sax ah loo dhamaystirin. Kiisas la mid ah ayaa la heli karaa, tusaale ahaan, halkan. Nasiib darro, ma awoodno inaan go'aamino sababta gaarka ah ee dhaqankan: waxaa jiray shaki ku saabsan nooca NGINX, laakiin lama xaqiijin. Astaantu waxay ahayd in fariimaha lagu arkay diiwaannada weelka NGINX: "Socket-ka furan #10 bidix ee xiriirka 5", ka bacdi baqshii way istaagtay.

Waxaan ku eegi karnaa dhibaatadan oo kale, tusaale ahaan, jawaabaha ku saabsan Soo galitaanka waxaan u baahanahay:

Kubernetes talooyinka & tabaha: sifooyinka xidhitaanka quruxda badan ee NGINX iyo PHP-FPM
Tilmaamayaasha koodka xaaladda wakhtiga la dirayo

Xaaladdan oo kale, waxaan ka helnaa koodka qaladka 503 ee Ingress laftiisa: ma geli karo weelka NGINX, maadaama aan la heli karin. Haddii aad eegto diiwaannada weelka ee NGINX, waxay ka kooban yihiin kuwan soo socda:

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

Ka dib markii la beddelo calaamadda joogsiga, weelku wuxuu bilaabaa inuu si sax ah u istaago: tan waxaa lagu xaqiijiyay xaqiiqda ah in qaladka 503 aan la arkin.

Haddii aad la kulanto dhibaato la mid ah, waxay macno samaynaysaa in la ogaado waxa calaamada joogsiga loo isticmaalo weelka iyo sida dhabta ah ee jilitaanka preStop u eg yahay. Waa suurtogal in sababtu ay tan si sax ah ugu jirto.

PHP-FPM... iyo in ka badan

Dhibaatada PHP-FPM waxaa lagu sifeeyaa si fudud: ma sugin dhamaystirka hababka ilmaha, waxay joojisaa, taas oo ah sababta 502 khaladaad ay dhacaan inta lagu jiro hawlgalinta iyo hawlgallada kale. Waxaa jira dhowr warbixinood oo bug ah oo ku saabsan bugs.php.net ilaa 2005 (tusaale halkan и halkan), kaas oo qeexaya dhibaatadan. Laakiin waxay u badan tahay inaadan waxba ku arki doonin diiwaanka: PHP-FPM waxay ku dhawaaqi doontaa dhamaystirka hawsheeda iyada oo aan wax qalad ah ama ogeysiis dhinac saddexaad ah jirin.

Waxaa habboon in la caddeeyo in dhibka laftiisa uu ku xirnaan karo in ka yar ama ka weyn codsiga laftiisa oo laga yaabo in uusan isu muujin, tusaale ahaan, la socodka. Haddii aad la kulanto, hab fudud ayaa maskaxdaada ku soo dhacaya marka hore: ku dar jilbaha preStop sleep(30). Waxay kuu ogolaan doontaa inaad buuxiso dhammaan codsiyada hore (ma aqbalno kuwa cusub, tan iyo pod horay awood u leh Joojinta), iyo 30 ilbiriqsi ka dib boodhka laftiisa wuxuu ku dhamaan doonaa calaamad SIGTERM.

Waxay soo baxaysaa in lifecycle waayo weelku wuxuu u ekaan doonaa sidan:

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

Si kastaba ha ahaatee, sababtoo ah 30-ilbiriqsi sleep ы si xoog leh waxaanu kordhin doonaa wakhtiga dirista, mar haddii boodh kasta la joojin doono ugu yaraan 30 ilbiriqsi, taas oo xun. Maxaa laga qaban karaa arrintan?

Aan u leexano dhinaca mas'uulka ka ah fulinta tooska ah ee codsiga. Xaaladeena waa PHP-FPMtaas Sida caadiga ah ma la socdaan fulinta hababka ilmaheeda: Hannaanka sayidku isla markiiba waa la joojiyay. Waxaad ku beddeli kartaa hab-dhaqankan adigoo isticmaalaya dardaaranka process_control_timeout, kaas oo qeexaya wakhtiga xaddidan ee hababka ilmahu ay sugaan calaamadaha sayidkiisa. Haddii aad qiimaha u dejiso 20 ilbiriqsi, tani waxay dabooli doontaa inta badan weydiimaha ku dhex jira weelka waxayna joojin doontaa habka sare marka ay dhammeeyaan.

Aqoontan, aynu u soo noqono dhibkeenii u danbeeyay. Sida ku xusan, Kubernetes ma aha madal monolithic ah: xidhiidhka ka dhexeeya qaybihiisa kala duwan waxay qaadataa waqti. Tani waxay si gaar ah run u tahay marka aan tixgelinno hawlgalka Ingresses iyo qaybaha kale ee la xidhiidha, maadaama ay sabab u tahay dib u dhac ku yimaada wakhtiga la dirayo way fududahay in la helo khaladaadka 500. Tusaale ahaan, khaladku wuxuu ku dhici karaa heerka codsiga loo dirayo korka, laakiin "waqti daaha" ee isdhexgalka qaybaha waa mid gaaban - wax ka yar ilbiriqsi.

Sidaa darteed, Guud ahaan oo leh dardaarankii hore loo sheegay process_control_timeout waxaad u isticmaali kartaa dhismaha soo socda lifecycle:

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

Xaaladdan oo kale, waxaan ku magdhabi doonaa daahitaanka amarka sleep oo si weyn ha u kordhin wakhtiga geynta: ma jiraa farqi muuqda oo u dhexeeya 30 ilbiriqsi iyo hal?.. Dhab ahaantii, waa process_control_timeoutiyo lifecycle loo isticmaalo oo kaliya sida "shabagga badbaadada" haddii ay dhacdo dib u dhac.

Guud ahaan Hab-dhaqanka lagu sharraxay iyo ka-hortagga u dhigma ma khuseeyaan oo keliya PHP-FPM. Xaalad la mid ah ayaa laga yaabaa in si uun ama si kale ay soo baxdo marka la isticmaalayo luqado kale / qaab-dhismeedka. Haddii aadan siyaalo kale u hagaajin karin xiritaanka quruxda badan - tusaale ahaan, adoo dib u qoraya koodka si codsigu si sax ah u socodsiiyo calaamadaha joojinta - waxaad isticmaali kartaa habka lagu sharraxay. Waxaa laga yaabaa inaysan ahayn tan ugu quruxda badan, laakiin way shaqeysaa.

Ku celceli. Ku shub tijaabada si aad u hubiso shaqada boodhka

Tijaabada culeysku waa mid ka mid ah siyaabaha lagu hubinayo sida weelku u shaqeeyo, maadaama habkani uu u soo dhaweynayo xaaladaha dhabta ah ee dagaalka marka dadka isticmaala ay booqdaan goobta. Si aad u tijaabiso talooyinka kor ku xusan, waxaad isticmaali kartaa Yandex.Tankom: Waxay si buuxda u dabooshaa dhammaan baahiyahayaga. Kuwa soo socdaa waa talooyin iyo talooyin ku saabsan samaynta imtixaanka oo leh tusaale cad oo ka yimid khibradeena iyada oo ay ugu mahadcelinayaan garaafyada Grafana iyo Yandex.Tank lafteeda.

Waxa ugu muhiimsan halkan waa talaabo talaabo u eeg isbeddelada. Ka dib markaad ku darto hagaajin cusub, samee tijaabada oo arag haddii natiijadu ay isbedeshay marka loo eego orodkii u dambeeyay. Haddii kale, way adkaan doontaa in la ogaado xalalka aan waxtarka lahayn, iyo mustaqbalka fog waxay keeni kartaa oo kaliya waxyeello (tusaale, kordhinta wakhtiga dirista).

Nuuc kale ayaa ah in la eego diiwaannada weelka inta uu joojinayo. Xogta ku saabsan xidhidhiyaha quruxda badan ma lagu duubay halkaas? Ma jiraan wax khaladaad ah oo ku jira diiwaanka marka la gelayo agabyada kale (tusaale ahaan, weelka PHP-FPM ee deriska la ah)? Khaladaadka codsiga laftiisa (sida kiiska NGINX ee kor lagu sharaxay)? Waxaan rajeynayaa in macluumaadka hordhaca ah ee maqaalkani uu kaa caawin doono inaad si fiican u fahamto waxa ku dhacaya weelka inta lagu jiro joojinta.

Sidaa darteed, imtixaankii ugu horreeyay ayaa dhacay iyada oo aan lahayn lifecycle iyo iyada oo aan lahayn amaro dheeraad ah oo ku saabsan server-ka codsiga (process_control_timeout ee PHP-FPM). Ujeedada tijaabadani waxay ahayd in la ogaado tirada ku dhow ee khaladaadka (iyo haddii ay jiraan). Sidoo kale, macluumaadka dheeraadka ah, waa inaad ogaataa in celceliska wakhtiga geynta boodhka kasta uu ahaa ilaa 5-10 ilbiriqsi ilaa ay si buuxda diyaar u tahay. Natiijadu waa:

Kubernetes talooyinka & tabaha: sifooyinka xidhitaanka quruxda badan ee NGINX iyo PHP-FPM

Guddiga macluumaadka Yandex.Tank wuxuu muujinayaa kororka 502 khaladaad, kaas oo dhacay waqtigii la dirayay oo socday celcelis ahaan ilaa 5 ilbiriqsi. Malaha tani waxay ahayd sababtoo ah codsiyadii hore u jiray ayaa la joojiyay markii la joojiyay. Taas ka dib, 503 khaladaad ayaa soo muuqday, taas oo ahayd natiijada weelka NGINX ee la joojiyay, kaas oo sidoo kale hoos u dhigay xiriirinta dhabarka dambe (taas oo ka hor istaagtay Ingress in ay ku xirto).

Aan aragno sida process_control_timeout PHP-FPM waxay naga caawin doontaa inaan sugno dhamaystirka hababka ilmaha, i.e. sax khaladaadka noocaas ah. Dib-u-dejinta adoo isticmaalaya dardaarankan:

Kubernetes talooyinka & tabaha: sifooyinka xidhitaanka quruxda badan ee NGINX iyo PHP-FPM

Ma jiraan khaladaad kale inta lagu jiro hawlgalinta 500aad! Soo diristii waa guul, shaqo joojin oo qurux badan.

Si kastaba ha ahaatee, waxaa habboon in la xasuusto arrinta ku jirta weelasha Ingress, boqolkiiba yar oo khaladaad ah oo laga yaabo in aan helno sababtoo ah waqti gaaban. Si looga fogaado iyaga, waxa hadhay oo dhan waa in lagu daro qaab dhismeed leh sleep oo ku celi hawlgelinta. Si kastaba ha ahaatee, xaaladeena gaarka ah, ma jiraan wax isbedel ah oo muuqda (mar kale, khaladaad ma jiraan).

gunaanad

Si aan u joojino nidaamka si qurux badan, waxaanu ka filaynaa arjiga habdhaqankan soo socda:

  1. Sug dhowr ilbidhiqsi ka dibna jooji aqbalka xidhiidhyada cusub.
  2. Sug dhammaan codsiyada si aad u dhammaystirto oo aad u xidho dhammaan xidhiidhada noolaha ee aan fulin codsiyada.
  3. Jooji nidaamkaaga.

Si kastaba ha ahaatee, dhammaan codsiyada sidan uma shaqayn karaan. Mid ka mid ah xalinta dhibaatada kubernetes xaqiiqooyinka waa:

  • ku darista jillaab joogsi hore ah oo sugi doona dhowr ilbiriqsi;
  • baranaya feylka qaabeynta ee dhabarka dambe ee xuduudaha ku habboon.

Tusaalaha NGINX wuxuu caddaynayaa in xitaa codsiga marka hore si sax ah u socodsiiya calaamadaha joojinta si sax ah uusan sidaas samayn karin, markaa waa muhiim in la hubiyo khaladaadka 500 inta lagu jiro gudbinta codsiga. Tani waxay sidoo kale kuu ogolaaneysaa inaad si ballaaran u eegto dhibaatada oo aadan diiradda saarin hal boodh ama weel, laakiin fiiri dhammaan kaabayaasha guud ahaan.

Sida qalab tijaabo ah, waxaad isticmaali kartaa Yandex.Tank iyada oo la socota nidaam kasta oo la socodka (xaaladkeena, xogta waxaa laga soo qaatay Grafana oo leh dhabarka Prometheus ee imtixaanka). Dhibaatooyinka xidhitaanka quruxda badan waxay si cad ugu muuqdaan culaysyo culus oo bartilmaameedku dhalin karo, iyo la socodka waxa ay caawisaa in si faahfaahsan loo falanqeeyo xaalada inta lagu jiro ama ka dib imtixaanka.

Ka jawaab celinta faallooyinka maqaalka: waxaa habboon in la sheego in dhibaatooyinka iyo xalalka halkan lagu sharraxay ee la xidhiidha NGINX Ingress. Kiisaska kale, waxaa jira xalal kale, kuwaas oo laga yaabo in aan tixgelinno qalabka soo socda ee taxanaha.

PS

Wax kale oo ka mid ah talooyinka iyo tabaha K8s:

Source: www.habr.com

Add a comment