Malebela le maqheka a Kubernetes: likarolo tsa ho koala ha bonolo ho NGINX le PHP-FPM

Boemo bo tloaelehileng ha u kenya ts'ebetsong CI / CD ho Kubernetes: kopo e tlameha ho khona ho se amohele likōpo tse ncha tsa bareki pele e emisa ka ho feletseng, 'me ho bohlokoa ka ho fetisisa, ho phethahatsa tse teng ka katleho.

Malebela le maqheka a Kubernetes: likarolo tsa ho koala ha bonolo ho NGINX le PHP-FPM

Ho lumellana le boemo bona ho u lumella hore u fihlele nako ea ho theoha ha zero nakong ea ho romelloa. Leha ho le joalo, leha u sebelisa mekotla e tsebahalang haholo (joalo ka NGINX le PHP-FPM), u ka kopana le mathata a tla lebisa ho ho ata ha liphoso ka thomello ka 'ngoe ...

Khopolo. Kamoo pod e phelang kateng

Re se re phatlalalitse ka botlalo mabapi le potoloho ea bophelo ba pod Sengoloa sena. Moelelong oa sehlooho se ntseng se nahanoa, re thahasella tse latelang: nakong eo pod e kenang mmuso Ho felisa, likopo tse ncha li khaotsa ho romeloa ho eona (pod tlosoa ho tsoa lenaneng la liphetho tsa ts'ebeletso). Kahoo, ho qoba nako ea ho theoha nakong ea ho romelloa, ho lekane hore re rarolle bothata ba ho emisa kopo ka nepo.

Hape u lokela ho hopola hore nako ea mohau ea kamehla ke metsotsoana e 30: ka mor'a sena, pod e tla felisoa 'me kopo e tlameha ho ba le nako ea ho sebetsana le likōpo tsohle pele ho nako ena. mantsoe: leha kopo efe kapa efe e nkang metsotsoana e fetang 5-10 e se e le bothata, 'me ho koala ka mosa ho ke ke ha hlola ho e thusa ...

Ho utloisisa hantle se etsahalang ha pod e fela, sheba feela setšoantšo se latelang:

Malebela le maqheka a Kubernetes: likarolo tsa ho koala ha bonolo ho NGINX le PHP-FPM

A1, B1 - Ho fumana liphetoho mabapi le boemo ba leifo
A2 - Ho tloha SIGTERM
B2 - Ho tlosa pod ho tloha qetellong
B3 - Ho amohela liphetoho (lenane la lintlha tsa ho qetela le fetohile)
B4 - Ntlafatsa melao ea iptables

Ka kopo hlokomela: ho hlakola "endpoint pod" le ho romela SIGTERM ha ho etsahale ka tatellano, empa ka ho tšoana. 'Me ka lebaka la hore Ingress ha e fumane hang-hang lenane le ntlafalitsoeng la Endpoints, likopo tse ncha tse tsoang ho bareki li tla romelloa pod, e tla baka phoso ea 500 nakong ea ho felisoa ha pod. (bakeng sa lintlha tse qaqileng mabapi le taba ena, re fetoletsoe). Bothata bona bo hloka ho rarolloa ka litsela tse latelang:

  • Romella Khokahano: koala lihlooho tsa karabo (haeba sena se ama ts'ebeliso ea HTTP).
  • Haeba ho ke ke ha khoneha ho etsa liphetoho khoutu, joale sehlooho se latelang se hlalosa tharollo e tla u lumella ho sebetsana le likōpo ho fihlela qetellong ea nako ea mohau.

Khopolo. Kamoo NGINX le PHP-FPM li felisang lits'ebetso tsa tsona

NGINX

Ha re qale ka NGINX, kaha ntho e 'ngoe le e' ngoe e hlakile ka eona. Ha re kenella khopolong, re ithuta hore NGINX e na le ts'ebetso e le 'ngoe e kholo le "basebetsi" ba' maloa - tsena ke mekhoa ea bana e sebetsanang le likōpo tsa bareki. Khetho e bonolo e fanoa: ho sebelisa taelo nginx -s <SIGNAL> emisa lits'ebetso ka ho koala kapele kapa ka mokhoa o motle oa ho koala. Ho hlakile hore ke khetho ea ho qetela e re khahlang.

Joale ntho e 'ngoe le e' ngoe e bonolo: o hloka ho eketsa ho preStop-hook taelo e tla romela lets'oao le monate la ho koala. Sena se ka etsoa ka Deployment, ka har'a block ea setshelo:

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

Joale, ha pod e koala, re tla bona tse latelang ho li-logs tsa 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

'Me sena se tla bolela seo re se hlokang: NGINX e emetse hore likopo li phethe, ebe e bolaea ts'ebetso. Leha ho le joalo, ka tlase re tla boela re nahane ka bothata bo tloaelehileng ka lebaka la hore, esita le ka taelo nginx -s quit ts'ebetso e fela ka phoso.

'Me sethaleng sena re se re qetile ka NGINX: bonyane ho tloha ho li-logs u ka utloisisa hore ntho e' ngoe le e 'ngoe e sebetsa kamoo e lokelang ho sebetsa kateng.

Ho na le bothata bofe ka PHP-FPM? E sebetsana joang le ho koala ha bonolo? Ha re e utloisise.

Php-FPM

Tabeng ea PHP-FPM, ho na le lintlha tse fokolang. Haeba u tsepamisa maikutlo ho bukana ya semmuso ho latela PHP-FPM, e tla re matšoao a latelang a POSIX a amoheloa:

  1. SIGINT, SIGTERM - ho koala kapele;
  2. SIGQUIT - ho koala ha mohau (seo re se hlokang).

Lipontšo tse setseng ha li hlokehe mosebetsing ona, kahoo re tla tlohela tlhahlobo ea bona. Ho emisa ts'ebetso ka nepo, o tla hloka ho ngola hook e latelang ea PreStop:

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

Ha u habanya feela, sena ke sona feela se hlokahalang ho koala sekheo se setle ka har'a lijana ka bobeli. Leha ho le joalo, mosebetsi o boima ho feta kamoo o bonahalang kateng. Ka tlaase mona ho na le linyeoe tse peli tseo ho tsona ho koala ka mohau ho sa kang ha sebetsa 'me ho bakile ho se fumanehe ha nako e khutšoanyane ha morero nakong ea ho romelloa.

Itloaetse. Mathata a ka bang teng ka ho koala ha bonolo

NGINX

Pele ho tsohle, ho bohlokoa ho hopola: ntle le ho phethahatsa taelo nginx -s quit Ho na le sethala se seng hape se lokelang ho ela hloko. Re kopane le bothata moo NGINX e neng e ntse e tla romela SIGTERM sebakeng sa lets'oao la SIGQUIT, e leng se etsang hore likopo li se ke tsa tlatsoa ka nepo. Linyeoe tse tšoanang li ka fumanoa, mohlala, mona. Ka bomalimabe, ha rea ​​ka ra khona ho fumana lebaka le tobileng la boitšoaro bona: ho ne ho e-na le lipelaelo ka phetolelo ea NGINX, empa ha ea ka ea tiisoa. Letšoao e ne e le hore melaetsa e ne e bonoa ka har'a li-logs tsa NGINX: "Bula sokete #10 e setseng mabapi le 5", ka mor'a moo pod e ile ea emisa.

Re ka bona bothata bo joalo, mohlala, ho tsoa likarabong tsa Ingress tseo re li hlokang:

Malebela le maqheka a Kubernetes: likarolo tsa ho koala ha bonolo ho NGINX le PHP-FPM
Lipontšo tsa mekhoa ea boemo nakong ea ho romelloa

Tabeng ena, re fumana khoutu ea phoso ea 503 feela e tsoang ho Ingress ka boeona: e ke ke ea fihlella setshelo sa NGINX, kaha ha e sa fumaneha. Haeba u sheba lits'oants'o tse nang le NGINX, li na le tse latelang:

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

Ka mor'a ho fetola letšoao la ho emisa, setshelo se qala ho emisa ka nepo: sena se tiisoa ke taba ea hore phoso ea 503 ha e sa hlokomeloa.

Haeba u kopana le bothata bo ts'oanang, hoa utloahala ho fumana hore na ho sebelisoa lets'oao lefe ka har'a setshelo le hore na hook ea preStop e shebahala joang. Ho ka etsahala hore ebe lebaka le teng hantle tabeng ena.

PHP-FPM... le tse ding

Bothata ba PHP-FPM bo hlalosoa ka mokhoa o sa reng letho: ha e emele ho phethoa ha mekhoa ea bana, e e felisa, ke ka lebaka leo liphoso tsa 502 li hlahang nakong ea ho tsamaisoa le ts'ebetso e meng. Ho na le litlaleho tse 'maloa tsa liphoso ho bugs.php.net ho tloha 2005 (mohlala mona и mona), e hlalosang bothata bona. Empa mohlomong u ke ke ua bona letho ka har'a li-log: PHP-FPM e tla phatlalatsa ho phetheloa ha ts'ebetso ea eona ntle le liphoso kapa litsebiso tsa mokha oa boraro.

Ke habohlokoa ho hlakisa hore bothata ka boeona bo ka itšetleha ka tekanyo e fokolang kapa e kholoanyane ho kopo ka boeona mme e ka 'na ea se ke ea iponahatsa, ka mohlala, ka ho beha leihlo. Haeba u kopana le eona, mokhoa o bonolo oa ho sebetsa o tla kelellong pele: eketsa hook ea preStop ka sleep(30). E tla u lumella ho tlatsa likopo tsohle tse neng li le teng pele ('me ha re amohele tse ncha, kaha pod se khona ho Ho felisa), 'me ka mor'a metsotsoana ea 30 pod ka boeona e tla fela ka pontšo SIGTERM.

E hlaha joalo lifecycle hobane sejana se tla shebahala tjena:

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

Leha ho le joalo, ka lebaka la metsotsoana e 30 sleep мы ka matla re tla eketsa nako ea ho romelloa, kaha pod e 'ngoe le e' ngoe e tla felisoa bonyane Metsotsoana e 30, e leng mpe. Ho ka etsoa eng ka see?

Ha re retelehele ho mokha o ikarabellang bakeng sa ts'ebetso e tobileng ea kopo. Tabeng ea rona ho joalo Php-FPM, e leng ka ho sa feleng ha e behe leihlo ts'ebetso ea lits'ebetso tsa eona tsa ngoana: Ts'ebetso e kholo e felisoa hang-hang. O ka fetola mokhoa ona o sebelisa taelo process_control_timeout, e hlalosang meeli ea nako ea mekhoa ea bana ho emela lipontšo tse tsoang ho monghali. Haeba u beha boleng ho metsotsoana e 20, sena se tla koahela boholo ba lipotso tse hlahang ka har'a setshelo mme se tla emisa ts'ebetso e kholo hang ha e phethiloe.

Ka tsebo ena, a re khutleleng bothateng ba rona ba ho qetela. Joalokaha ho boletsoe, Kubernetes hase sethala sa monolithic: puisano pakeng tsa likarolo tsa eona tse fapaneng e nka nako. Sena ke 'nete haholo ha re nahana ka ts'ebetso ea Ingresses le likarolo tse ling tse amanang le tsona, kaha ka lebaka la tieho e joalo nakong ea ho romelloa ho bonolo ho fumana ho eketseha ha liphoso tsa 500. Ka mohlala, ho ka 'na ha e-ba le phoso nakong ea ho romela kopo ho ea holimo, empa "nako ea nako" ea tšebelisano pakeng tsa likarolo e khutšoanyane haholo - ka tlase ho motsotsoana.

Ka hona, Ka kakaretso ka taelo e seng e boletsoe process_control_timeout u ka sebelisa kaho e latelang bakeng sa lifecycle:

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

Tabeng ena, re tla lefella tieho ka taelo sleep 'me ha re eketse nako ea ho romelloa haholo: ka mor'a moo, phapang pakeng tsa metsotsoana ea 30 le e le' ngoe e bonahala?.. Ha e le hantle, ke eona process_control_timeoutle lifecycle se sebedisoang joalo ka “letlooa la polokeho” ha ho ka ba le thapo.

Ka kakaretso boits'oaro bo hlalositsoeng le tšebetso e tsamaellanang ha e sebetse ho PHP-FPM feela. Boemo bo ts'oanang bo ka hlaha ka tsela e 'ngoe ha ho sebelisoa lipuo / meralo e meng. Haeba o sa khone ho lokisa ho koala ka mokhoa o mosa ka litsela tse ling - mohlala, ka ho ngola khoutu hape e le hore sesebelisoa se sebetse hantle matšoao a ho emisa - o ka sebelisa mokhoa o hlalositsoeng. E ka 'na ea se ke ea e-ba ntle ka ho fetisisa, empa ea sebetsa.

Itloaetse. Teko ea mojaro ho lekola ts'ebetso ea pod

Teko ea mojaro ke e 'ngoe ea litsela tsa ho lekola hore na setshelo se sebetsa joang, kaha ts'ebetso ena e e atametsa haufi le maemo a ntoa ea nnete ha basebelisi ba etela sebaka sena. Ho hlahloba litlhahiso tse ka holimo, u ka li sebelisa Yandex.Tankom: E akaretsa litlhoko tsohle tsa rona ka mokhoa o phethahetseng. Tse latelang ke malebela le likhothaletso tsa ho etsa liteko ka mohlala o hlakileng ho tsoa ho boiphihlelo ba rona ka lebaka la li-graph tsa Grafana le Yandex.Tank ka boeona.

Ntho ea bohlokoa ka ho fetisisa mona ke hlahloba liphetoho mohato ka mohato. Kamora ho kenya tokiso e ncha, etsa tlhahlobo 'me u bone hore na liphetho li fetohile ha li bapisoa le lebelo la ho qetela. Ho seng joalo, ho tla ba thata ho khetholla litharollo tse sa sebetseng, 'me ka nako e telele li ka baka kotsi feela (mohlala, ho eketsa nako ea ho tsamaisa).

Ntho e 'ngoe e fapaneng ke ho sheba likutu tsa setshelo nakong ea ho felisoa. Na ho na le litaba tse mabapi le ho koala ha bonolo moo? Na ho na le liphoso ho li-log ha u fihlella lisebelisoa tse ling (mohlala, ho setshelo sa boahelani sa PHP-FPM)? Liphoso ho kopo ka boeona (joalo ka tabeng ea NGINX e hlalositsoeng ka holimo)? Ke tšepa hore boitsebiso ba selelekela se hlahang sehloohong sena bo tla u thusa ho utloisisa hantle se etsahalang ka setshelo nakong ea ho felisoa.

Kahoo, teko ea pele ea teko e etsahetse ntle le lifecycle le ntle le litaelo tse eketsehileng bakeng sa seva sa kopo (process_control_timeout ho PHP-FPM). Sepheo sa teko ena e ne e le ho tseba palo e lekantsoeng ea liphoso (le hore na ho na le leha e le efe). Hape, ho tsoa tlhahisoleseling e eketsehileng, o lokela ho tseba hore nako e tloaelehileng ea ho tsamaisa pod e 'ngoe le e' ngoe e ne e ka ba metsotsoana e 5-10 ho fihlela e se e loketse ka botlalo. Liphetho ke:

Malebela le maqheka a Kubernetes: likarolo tsa ho koala ha bonolo ho NGINX le PHP-FPM

Phanele ea tlhahisoleseling ea Yandex.Tank e bonts'a liphoso tse ngata tse 502, tse etsahetseng nakong ea ho romelloa 'me li tšoarella ka karolelano ho isa ho metsotsoana e 5. Ho ka etsahala hore ebe ke hobane likopo tse neng li le teng ho pod ea khale li ne li ntse li felisoa ha e ntse e felisoa. Ka mor'a sena, liphoso tsa 503 li ile tsa hlaha, e leng phello ea setshelo sa NGINX se emisitsoeng, se ileng sa boela sa theola likhokahano ka lebaka la backend (e neng e thibela Ingress ho hokela ho eona).

A re boneng hore na joang process_control_timeout ho PHP-FPM e tla re thusa ho emela ho phethoa ha mekhoa ea bana, ke hore. lokisa liphoso tse joalo. Kenya hape u sebelisa taelo ena:

Malebela le maqheka a Kubernetes: likarolo tsa ho koala ha bonolo ho NGINX le PHP-FPM

Ha ho sa na liphoso nakong ea 500th deployment! Tšebeliso e atlehile, e sebetsa ka mokhoa o khabane.

Leha ho le joalo, ho bohlokoa ho hopola taba ea li-container tsa Ingress, liperesente tse nyane tsa liphoso tseo re ka li fumanang ka lebaka la ho lieha ha nako. Ho li qoba, ho setseng ke ho eketsa sebopeho ka sleep 'me u phete thomello. Leha ho le joalo, molemong oa rona, ha ho liphetoho tse neng li bonahala (hape, ha ho na liphoso).

fihlela qeto e

Ho emisa ts'ebetso ka bokhabane, re lebelletse boitšoaro bo latelang ho tsoa kopong:

  1. Ema metsotsoana e seng mekae ebe u emisa ho amohela likhokahano tse ncha.
  2. Emela hore likopo tsohle li phethe le ho koala likhokahano tsohle tse sa sebetseng.
  3. Qetella mokhoa oa hau.

Leha ho le joalo, ha se likopo tsohle tse ka sebetsang ka tsela ena. Tharollo e le 'ngoe ea bothata ho linnete tsa Kubernetes ke:

  • ho eketsa hook ea ho emisa pele e tla ema metsotsoana e seng mekae;
  • ho ithuta faele ea tlhophiso ea backend ea rona bakeng sa liparamente tse nepahetseng.

Mohlala o nang le NGINX o hlakisa hore esita le kopo e lokelang ho qala ho sebetsana le matšoao a ho felisa ka nepo e ka 'na ea se ke ea etsa joalo, kahoo ke habohlokoa ho hlahloba liphoso tsa 500 nakong ea kopo ea kopo. Sena se boetse se u lumella hore u shebe bothata ka ho pharaletseng 'me u se ke ua tsepamisa maikutlo holim'a pod kapa setshelo se le seng, empa u shebe lisebelisoa tsohle tsa motheo ka kakaretso.

Joaloka sesebelisoa sa ho hlahloba, u ka sebelisa Yandex.Tank hammoho le tsamaiso leha e le efe ea ho shebella (tabeng ea rona, data e nkiloe ho Grafana le Prometheus backend bakeng sa teko). Mathata a ho koala ka bokhabane a bonahala ka ho hlaka tlas'a meroalo e boima e ka hlahisoang ke benchmark, 'me ho beha leihlo ho thusa ho sekaseka boemo ka botlalo nakong ea tlhahlobo kapa kamora tlhahlobo.

Ho arabela maikutlo a mabapi le sehlooho sena: ho bohlokoa ho bolela hore mathata le tharollo li hlalositsoe mona mabapi le NGINX Ingress. Maemong a mang, ho na le litharollo tse ling, tseo re ka li nahanang ka lisebelisoa tse latelang tsa letoto.

PES

Tse ling ho tsoa letotong la malebela le maqheka a K8s:

Source: www.habr.com

Eketsa ka tlhaloso