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

Shuruudaha caadiga ah marka la fulinayo CI/CD gudaha Kubernetes waa in codsigu uu awood u yeesho inuu joojiyo aqbalida codsiyada macmiilka cusub ka hor inta uusan si buuxda u joojin, iyo, tan ugu muhiimsan, si guul leh u dhamaystirto kuwa jira.

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

U hoggaansanaanta xaaladdan waxay u oggolaaneysaa eber hoos u dhac inta lagu jiro hawlgalka. Si kastaba ha noqotee, xitaa markaad isticmaaleyso qaabeynta aadka loo jecel yahay (sida NGINX iyo PHP-FPM), waxaa laga yaabaa inaad la kulanto arrimo u horseedi doona kororka khaladaad kasta oo la diro.

Aragti: Sida uu Pod u nool yahay

Waxaan mar hore daabacnay maqaal faahfaahsan oo ku saabsan wareegga nolosha podska. maqaalkanMarka 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 waa laga saarayaa (laga bilaabo liiska dhamaadka adeega). Sidaa darteed, si aan uga fogaano wakhtiga dhimista inta lagu jiro hawlgalka, waxaan kaliya u baahanahay inaan xallino arrinta ku saabsan joojinta si xushmad leh codsiga.

Waa in sidoo kale la xusuustaa 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 su'aal kasta oo qaadata in ka badan 5-10 ilbiriqsi in la dhammaystiro ay horeba dhibaato u tahay, xidhidh qurux badanna kama caawinayso...

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 xaaladda podska
A2 - bixitaanka SIGTERM
B2 - Ka saarida boodhka meelaha dhamaadka
B3 - Helitaanka isbeddelada (liiska dhammaadka ayaa isbeddelay)
B4 - Cusbooneysiinta xeerarka iptables

Fadlan ogow: Tirtiridda barta dhamaadka iyo dirista SIGTERM waxay u dhacdaa si isbarbar socda, maahan si isku xigta. Sababtoo ah soo galitaanka isla markiiba ma helo liiska Endpoints ee la cusboonaysiiyay, codsiyada cusub ee macaamiisha ayaa loo diri doonaa boodhka, taasoo keenaysa 500 khalad inta lagu jiro joojinta boodhka. (waxaan haynaa waxyaabo faahfaahsan oo arrintan ku saabsan turjumay)Dhibaatadan waxay u baahan tahay in lagu xalliyo siyaabaha soo socda:

  • Dir Xidhiidhka: ku xidh jawaabaha madaxyada (haddii ay tani khusayso codsiga HTTP).
  • Haddii aysan suurtagal ahayn in wax laga beddelo koodka, maqaalka hoose wuxuu qeexayaa xal u oggolaanaya codsiyada in la habeeyo illaa dhammaadka muddada nimcada.

Aragti: Sida NGINX iyo PHP-FPM u Joojiyaan Hawlahooda

NGINX

Aan ku bilowno NGINX, maadaama ay ka badan tahay ama ka yar tahay is-sharraxaadda. Gelitaanka aragtida, waxaan baraneynaa in NGINX uu leeyahay hal nidaam oo heer sare ah iyo dhowr "shaqaale" -habab caruureed oo qabta codsiyada macmiilka. Doorasho ku habboon ayaa la bixiyaa: iyadoo la adeegsanayo amarka nginx -s <SIGNAL> Jooji hababka adiga oo isticmaalaya xidhidh degdeg ah ama xidhid qurux badan. Sida iska cad, waxaanu xiisaynaynaa doorashada dambe.

Markaa wax walba waa sahlan yihiin: waxaad u baahan tahay inaad ku darto jillaab hor joogsi Amarka soo diri doona calaamad xiritaan qurux badan. Tan waxaa lagu samayn karaa baloogga weelka geynta:

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

Hadda, marka boodhku joojiyo, waxaan ku arki doonaa kuwan soo socda diiwaannada 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 ka wada hadli doonaa dhibaato caadi ah, xitaa amarka nginx -s quit hawshu si aan caadi ahayn ayay u dhamaanaysaa.

Halkaa marka ay marayso, waxaan ku dhammeynay NGINX: ugu yaraan laga bilaabo diiwaanka, waxaad u sheegi kartaa in wax walba ay u shaqeynayaan sidii ay ahayd.

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

PHP-FPM

Xaaladda PHP-FPM, waxaa jira macluumaad yar oo yar. Hadii aad diirada saarto buug-gacmeedka rasmiga ah PHP-FPM, waxay kuu 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 looma baahna hawshan, markaa waanu ka boodi doonaa falanqayntooda. Si loo hubiyo in habsocodku si sax ah u dhamaado, waxaad u baahan doontaa inaad qorto jillaab-joojin ka hor:

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

Jaleecada hore, tani waa waxa kaliya ee loo baahan yahay si loo sameeyo xidhidh qurux badan labada weel. Si kastaba ha ahaatee, hawshu way ka adag tahay sida ay u muuqato. Hoosta, waxaanu baari doonaa laba kiis oo xidhidhsi qurux badan uu ku guul daraystay oo sababay maqnaanshaha mashruuc kooban intii lagu jiray hawlgalinta.

Tababbarka: Arrimaha suurtogalka ah ee xidhidhnimada wanaagsan leh

NGINX

Ugu horreyntii, waxaa faa'iido leh in la xasuusto: marka lagu daro fulinta amarka nginx -s quit Waxaa jirta hal tallaabo oo kale oo mudan in la xuso. Waxaan la kulanay arrin meesha NGINX ay wali u diri doonto SIGTERM halkii ay ka diri lahayd SIGQUIT, ka hortagga codsiyada inay si sax ah u dhammaystiraan. Kiisas la mid ah ayaa la heli karaa, tusaale ahaan, halkanNasiib darro, ma awoodno inaan go'aamino sababta gaarka ah ee dhaqankan: waxaan ka shakinay nooca NGINX, laakiin tan lama xaqiijin. Calaamadaha waxaa ka mid ahaa fariimaha ku jira diiwaannada weelka NGINX. "Socket-ka furan #10 bidix ee xiriirka 5", ka bacdi baqshii way istaagtay.

Waxaan u kuurgeli karnaa dhibaatadan, tusaale ahaan, jawaabaha soo galitaanka waxaan u baahanahay:

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

Xaaladdan oo kale, waxaan ka helnaa lambarka qaladka 503 ee gudaha gudaha laftiisa: ma geli karto weelka NGINX sababtoo ah hadda lama heli karo. Haddii aad eegto diiwaannada weelka NGINX, waxaad arki doontaa 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, waxaa habboon in la baaro waxa nalka biriiga loo isticmaalo weelka iyo sida uu u eg yahay jillaab-joojinta hore. Waa suurtogal in tani ay tahay sababta.

PHP-FPM… iyo in ka badan

Dhibaatada PHP-FPM waxaa lagu sifeeyaa si fudud: ma sugto habraacyada ubadku inay dhammaystiraan, joojiyaan iyaga, taasoo keenaysa 502 qalad inta lagu jiro hawlgalinta iyo hawlgallada kale. Waxaa jiray dhowr warbixinood oo bug ah bugs.php.net ilaa 2005 (tusaale ahaan, halkan и halkan) oo qeexaya arrinta. Si kastaba ha ahaatee, waxaad u badan tahay inaadan waxba ku arki doonin diiwaanka: PHP-FPM waxay ku dhawaaqi doontaa joojinta habraaceeda iyada oo aan wax qalad ah ama ogeysiis dibadeed ah jirin.

Waxaa mudan in la caddeeyo in dhibaatadu lafteedu ay noqon karto mid ka badan ama ka yar mid gaar ah oo codsi gaar ah oo aan iskeed isu muujin, tusaale ahaan, la socodka. Haddii aad la kulanto, xalin fudud ayaa maskaxda ku haysa: ku dar jillaab hore oo joogsi ah sleep(30). Waxay kuu ogolaan doontaa inaad buuxiso dhammaan codsiyada hore loo sameeyay (mana aqbalno kuwa cusub, tan iyo pod horay awood u leh Joojinta), iyo 30 ilbiriqsi ka dib boodhka laftiisa ayaa ku joojin doona calaamad SIGTERM.

Waxay soo baxaysaa in lifecycle weelka wuxuu u ekaan doonaa sidan:

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

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

Aan u leexano dhinaca mas'uulka ka ah fulinta dhabta ah ee codsiga. Xaaladeena, tani waa PHP-FPMtaas Sida caadiga ah ma la socdaan fulinta hababka ilmaheeda: habsocodkii sayidku isla markiiba waa la joojiyay. Dhaqankan waxa lagu bedeli karaa dardaaranka process_control_timeout, kaas oo qeexaya wakhtiga xaddidan ee hababka ilmaha si ay u sugaan calaamadaha sayidkiisa. Dejinta qiimahan ilaa 20 ilbiriqsi waxay dabooli doontaa inta badan codsiyada ku dhex jira weelka, ka dib marka ay dhammeeyaan, nidaamka sare waa la joojin doonaa.

Anigoo aqoontaas maskaxda ku hayna, aan u soo noqonno dhibkeenna u dambeeya. Sida ku xusan, Kubernetes ma aha madal monolithic ah: isdhexgalka ka dhexeeya qaybihiisa kala duwan waxay u baahan yihiin waqti. Tani waxay si gaar ah u khusaysaa marka la tixgelinayo hawlgalka Ingresses iyo qaybaha kale ee la xidhiidha, sida daahitaanka noocan oo kale ah wuxuu si fudud u horseedi karaa kororka khaladaadka 500 inta lagu jiro hawlgalka. Tusaale ahaan, qalad ayaa dhici kara inta lagu jiro codsiga korka, laakiin "waqtiga daahitaanka" ee dhabta ah ee u dhexeeya qaybaha waa mid gaaban-in 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 magdhoweynaa dib u dhigista amarka sleep oo ma kordhinno wakhtiga dirista aad u badan: ka dib oo dhan, farqiga u dhexeeya 30 ilbiriqsi iyo mid waa la ogaan karaa? .. Nuxur ahaan, waa si sax ah process_control_timeoutiyo lifecycle Waxa kaliya oo loo istcimaalaa "kaabta" haddii ay dhacdo dib u dhac.

Guud ahaan Habdhaqanka la sharraxay iyo ka-hortagga u dhigma ma khuseeyaan oo keliya PHP-FPMXaalad la mid ah ayaa ku soo bixi karta hal ama si kale marka la isticmaalayo luqadaha barnaamijyada kale ama qaab-dhismeedka. Haddii hababka kale ay ku guuldareystaan ​​inay hagaajiyaan xidhitaanka quruxda badan - tusaale ahaan, dib u qorista koodka si uu codsigu si sax ah u qabto calaamadaha joojinta - waxaad isticmaali kartaa habka lagu sharraxay. Waxaa laga yaabaa inaysan ahayn tan ugu quruxda badan, laakiin way shaqeysaa.

Gacmo-is-qabsi: Ku shub tijaabinta si loo xaqiijiyo wax qabadkiisa

Tijaabada culaysku waa hal dariiqo oo lagu tijaabiyo sida weelku u shaqeeyo, maadaama ay ku soo dhawaynayso xaaladaha dhabta ah ee dunida marka isticmaalayaashu galaan goobta. Si aad u tijaabiso talooyinka kor ku xusan, waxaad isticmaali kartaa Yandex.Tank: waxa ay si fiican u dabooshaa dhammaan baahiyahayaga. Hoos waxaa ku yaal qaar ka mid ah talooyinka iyo talooyinka tijaabinta, oo leh tusaale muuqaal ah oo ka yimid khibradeena, Thanks to Grafana iyo Yandex.Tank charts.

Waxa ugu muhiimsan halkan waa hubi isbedelada marxaladahaKa dib markaad ku darto hagaajin cusub, samee imtixaan oo arag haddii natiijadu isbedeshay marka loo eego orodkii hore. Haddii kale, way adkaan doontaa in la aqoonsado xalalka aan waxtarka lahayn, mustaqbalka fog, waxay keeni kartaa dhaawac (tusaale ahaan, iyadoo la kordhinayo wakhtiga dirista).

Qodob kale oo muhiim ah: hubi diiwaannada weelka inta lagu jiro joojinta. Ma jiraan tafaasiil xidhidh oo qurxoon? Ma jiraan khaladaad ku jira diiwaanka marka la gelayo agabyada kale (tusaale, weelka PHP-FPM ee deriska ah)? Ma jiraan khaladaad codsi (sida kiiska NGINX ee kor lagu sharaxay)? Waxaan rajeynayaa in xogta asalka ah ee maqaalkani ay kaa caawin doonto 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, laga soo bilaabo macluumaadka dheeraadka ah, waa in la ogaadaa in celceliska wakhtiga geynta boodh kasta uu ahaa ku dhawaad ​​5-10 ilbiriqsi si buuxda diyaargarowga. Natiijadu waa sida soo socota:

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

Dashboard-ka Yandex.Tank wuxuu muujinayaa koror 502 khalad ah oo dhacay intii lagu jiray hawlgalinta oo socotay celcelis ahaan 5 ilbiriqsi. Tani waxay u badan tahay inay ka dhalatay codsiyadii hore u jiray oo 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 xidhiidhada sababtoo ah dhabarka (ka hortagga Ingress inuu ku xidho).

Aan aragno sida process_control_timeout Gudaha PHP-FPM, tani waxay naga caawin doontaa inaan sugno habka ilmuhu inuu dhammaystiro, tusaale ahaan, hagaajinta khaladaadka noocaas ah. Dib-u-dejin iyadoo la adeegsanayo dardaarankan:

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

Ma jiraan wax ka badan 500 khalad inta lagu jiro hawlgalinta! Hawlgelintu waa guul, shaqo-joojin qurux badan.

Si kastaba ha noqotee, waxaa habboon in la xasuusto arrinta ku jirta weelasha Ingress, halkaas oo aan ka heli karno boqolkiiba yar oo khaladaad ah sababtoo ah waqti gaaban. Si looga fogaado iyaga, waxaan u baahanahay inaan ku darno dhismo 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 loo hubiyo in hawshu si sax ah u dhammaatay, waxaanu ka filaynaa codsiga hab-dhaqankan soo socda:

  1. Sug dhowr ilbiriqsi, ka dib jooji aqbalka xiriirinta cusub.
  2. Sug dhammaan codsiyada si ay u dhammaystiraan oo ay u xidhaan dhammaan xidhiidhada nool ee aan buuxinayn codsiyada.
  3. Dhameystir habkaaga.

Si kastaba ha ahaatee, dhammaan codsiyada sidan uma shaqayn karaan. Hal xal oo dhibaatadan ka jirta boqortooyada Kubernetes waa:

  • ku darida jilba joogsi hore oo sugi doona dhowr ilbiriqsi;
  • baarista faylka qaabeynta dhabarka ee cabbiraadaha khuseeya.

Tusaalaha NGINX wuxuu naga caawinayaa inaan fahamno in xitaa codsiga marka hore si sax ah u maareynaya calaamadaha xiritaanka, sidaas darteed waxaa muhiim ah in la hubiyo khaladaadka 500 inta lagu jiro gudbinta codsiga. Tani waxay sidoo kale noo ogolaaneysaa inaan si ballaaran u aragno dhibaatada, oo aan diiradda saarin hal boodh ama weel, laakiin dhammaan kaabayaasha guud ahaan.

Yandex.Tank waxaa loo isticmaali karaa qalab tijaabo ah iyadoo lala kaashanayo nidaam kasta oo la socodka (xaaladkeena, waxaan isticmaalnay xogta Grafana oo leh dhabarka Prometheus). Arrimaha xidhitaannada wanaagsani waxay si cad uga dhex muuqdaan culaysyo culus, kaas oo bartilmaameedku dhalin karo, kormeerkuna waxa uu caawiyaa in si faahfaahsan loo falanqeeyo xaaladda inta lagu jiro ama ka dib imtixaanka.

Ka jawaab celinta faallooyinka maqaalkan, waxaa habboon in la ogaado in dhibaatooyinka iyo xalalka halkan lagu sharraxay ay khuseeyaan NGINX Ingress. Xaalado kale, waxaa jira xalal kale, kuwaas oo laga yaabo in aan kaga doodno maqaallada mustaqbalka ee taxanahan.

PS

Wax kale oo ka mid ah talooyinka iyo tabaha K8s:

Source: www.habr.com

U soo iibso martigelin lagu kalsoonaan karo oo loogu talagalay bogagga leh ilaalinta DDoS, VPS VDS servers 🔥 Iibso martigelin degel oo lagu kalsoonaan karo oo leh ilaalinta DDoS, VPS VDS servers | ProHoster