Toro-hevitra sy fika Kubernetes: endri-javatra fanakatonana tsara amin'ny NGINX sy PHP-FPM

Fepetra mahazatra amin'ny fampiharana CI/CD ao amin'ny Kubernetes: ny fampiharana dia tsy maintsy afaka tsy manaiky ny fangatahana mpanjifa vaovao alohan'ny hijanonana tanteraka, ary ny tena zava-dehibe, dia mamita tsara ny efa misy.

Toro-hevitra sy fika Kubernetes: endri-javatra fanakatonana tsara amin'ny NGINX sy PHP-FPM

Ny fanarahana an'io fepetra io dia ahafahanao manatratra ny fotoana tsy miato mandritra ny fametrahana. Na izany aza, na dia mampiasa fehezam-boninkazo malaza (toa an'i NGINX sy PHP-FPM) aza ianao, dia mety ho tojo fahasahiranana izay hitarika amin'ny firongatry ny lesoka isaky ny fametrahana...

Theory. Ahoana ny fiainan'ny pod

Efa namoaka an-tsipiriany momba ny tsingerin'ny fiainan'ny pod iray izahay ity lahatsoratra ity. Ao anatin'ny tontolon'ny lohahevitra dinihina dia mahaliana antsika ireto manaraka ireto: amin'ny fotoana hidiran'ny pod ao amin'ny fanjakana fampijanonana, tsy alefa intsony ny fangatahana vaovao (pod nofafana avy amin'ny lisitry ny teboka farany ho an'ny serivisy). Noho izany, mba hisorohana ny tsy fahampian'ny fotoana mandritra ny fametrahana, dia ampy ho antsika ny mamaha ny olana amin'ny fampiatoana ny fampiharana araka ny tokony ho izy.

Tokony ho tsaroanao ihany koa fa ny fe-potoana fialan-tsasatra dia 30 segondra: aorian'izay dia hofoanana ny pod ary tsy maintsy manana fotoana handaminana ny fangatahana rehetra alohan'io fe-potoana io ny fampiharana. fanamarihana: na dia efa manahirana aza ny fangatahana maharitra 5-10 segondra, ary tsy hanampy azy intsony ny fanakatonana tsara...

Mba hahatakarana bebe kokoa ny zava-mitranga rehefa tapitra ny pod iray, jereo fotsiny ity kisary manaraka ity:

Toro-hevitra sy fika Kubernetes: endri-javatra fanakatonana tsara amin'ny NGINX sy PHP-FPM

A1, B1 - Mandray fiovana momba ny toetry ny afo
A2 - Fialana SIGTERM
B2 - Esory ny pod amin'ny teboka farany
B3 - Mandray fiovana (niova ny lisitry ny teboka farany)
B4 - Fanavaozana ny fitsipika iptables

Azafady, azafady: tsy mandeha misesy ny famafana ny pod endpoint sy ny fandefasana SIGTERM, fa mifanandrify. Ary noho ny tsy nahazoan'i Ingress avy hatrany ny lisitry ny Endpoints nohavaozina, dia halefa any amin'ny pod ny fangatahana vaovao avy amin'ny mpanjifa, izay hiteraka hadisoana 500 mandritra ny famaranana pod. (ho an'ny antsipiriany bebe kokoa momba ity olana ity, izahay nandika). Ity olana ity dia tokony hovahana amin'ny fomba manaraka:

  • Alefaso ny Fifandraisana: akaiky ny lohatenin'ny valiny (raha mikasika ny fampiharana HTTP izany).
  • Raha tsy azo atao ny manova ny kaody, ny lahatsoratra manaraka dia manoritsoritra vahaolana izay ahafahanao mandrindra ny fangatahana hatramin'ny faran'ny vanim-potoana mahafinaritra.

Theory. Ahoana ny fomba namaranan'ny NGINX sy PHP-FPM ny fizotrany

NGINX

Ndeha atomboka amin'ny NGINX, satria ny zava-drehetra dia mazava kokoa na tsy dia mazava loatra miaraka aminy. Rehefa miditra amin'ny teoria isika, dia fantatsika fa ny NGINX dia manana dingana lehibe iray ary "mpiasa" maromaro - ireo dia dingana ataon'ny ankizy izay mikarakara ny fangatahan'ny mpanjifa. Misy safidy mety omena: mampiasa ny baiko nginx -s <SIGNAL> atsaharo ny dingana na amin'ny fanakatonana haingana na fomba fanakatonana mahafinaritra. Mazava ho azy fa io safidy farany io no mahaliana antsika.

Dia tsotra ny zava-drehetra: mila ampiana ianao preStop-hook baiko izay handefa famantarana fanakatonana tsara tarehy. Izany dia azo atao ao amin'ny Deployment, ao amin'ny bloc container:

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

Ankehitriny, rehefa mihidy ny pod dia ho hitantsika ao amin'ny logs container NGINX ireto manaraka ireto:

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

Ary izany dia midika izay ilaintsika: NGINX miandry ny fangatahana ho vita, ary avy eo dia mamono ny dingana. Na izany aza, eto ambany isika dia handinika olana mahazatra noho izany, na dia amin'ny baiko aza nginx -s quit mitsahatra diso ny dingana.

Ary amin'ity dingana ity dia vita amin'ny NGINX isika: farafaharatsiny avy amin'ny logs dia azonao atao ny mahatakatra fa ny zava-drehetra dia miasa araka ny tokony ho izy.

Inona no atao hoe PHP-FPM? Ahoana no iatrehany ny fanakatonana mahafinaritra? Andeha hojerentsika izany.

PHP-FPM

Raha ny PHP-FPM dia misy fampahalalana kely kokoa. Raha mifantoka amin'ny boky torolalana ofisialy araka ny PHP-FPM, dia holazaina fa ireto famantarana POSIX manaraka ireto dia ekena:

  1. SIGINT, SIGTERM - fanakatonana haingana;
  2. SIGQUIT - fanakatonana mahafinaritra (izay ilaintsika).

Ny famantarana sisa tavela dia tsy ilaina amin'ity asa ity, noho izany dia hanaisotra ny famakafakana azy ireo izahay. Mba hampitsaharana tsara ny dingana dia mila manoratra ity fihokoana preStop manaraka ity ianao:

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

Raha vao jerena dia izany ihany no ilaina mba hanaovana fanakatonana tsara ao anaty kaontenera roa. Sarotra kokoa noho ny hita anefa ilay asa. Ireto ambany ireto ny tranga roa izay tsy nahomby ny fanakatonana tsara ary nahatonga ny tsy fisian'ny tetikasa mandritra ny fotoana fohy.

Fanao. Ny olana mety hitranga amin'ny fanakatonana tsara

NGINX

Voalohany indrindra, ilaina ny mitadidy: ankoatra ny fanatanterahana ny baiko nginx -s quit Misy dingana iray hafa tokony hojerena. Nisedra olana izahay izay mbola handefasan'ny NGINX SIGTERM fa tsy ny famantarana SIGQUIT, ka nahatonga ny fangatahana tsy ho vita tsara. Misy tranga mitovy amin'izany, ohatra, eto. Indrisy anefa fa tsy afaka namaritra ny antony manokana momba ity fihetsika ity izahay: nisy ny ahiahy momba ny dikan-teny NGINX, saingy tsy voamarina izany. Ny soritr'aretina dia nisy hafatra voamarika tao amin'ny diarin'ny container NGINX: "Socket misokatra #10 sisa amin'ny fifandraisana 5", dia nijanona ilay pod.

Azontsika jerena ny olana toy izany, ohatra, avy amin'ny valinteny momba ny Ingress ilaintsika:

Toro-hevitra sy fika Kubernetes: endri-javatra fanakatonana tsara amin'ny NGINX sy PHP-FPM
Famantarana ny fehezan-dalàna amin'ny fotoana fametrahana

Amin'ity tranga ity dia mahazo fehezan-dalàna 503 fotsiny izahay avy amin'ny Ingress: tsy afaka miditra amin'ny kaontenera NGINX izy, satria tsy azo idirana intsony. Raha mijery ny diarin'ny container miaraka amin'ny NGINX ianao dia misy ireto manaraka ireto:

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

Rehefa avy nanova ny mari-pamantarana fijanonana dia manomboka mijanona tsara ny kaontenera: manamarina izany fa tsy voamarika intsony ny fahadisoana 503.

Raha sendra olana mitovitovy amin'izany ianao, dia misy dikany ny mamantatra hoe inona no famantarana fiatoana ampiasaina ao amin'ny fitoeran-javatra ary inona marina ny endriky ny hook preStop. Tena azo inoana fa ao anatin'izany no tena anton'izany.

PHP-FPM... sy ny maro hafa

Ny olana amin'ny PHP-FPM dia nofaritana amin'ny fomba tsy dia misy dikany: tsy miandry ny fahavitan'ny fizotran'ny zaza, manafoana azy ireo, izany no mahatonga ny fahadisoana 502 mandritra ny fametrahana sy ny asa hafa. Betsaka ny tatitra momba ny bugs ao amin'ny bugs.php.net hatramin'ny taona 2005 (oh eto и eto), izay mamaritra ity olana ity. Saingy azo inoana fa tsy hahita na inona na inona ao amin'ny diary ianao: Ny PHP-FPM dia hanambara ny fahavitan'ny fizotrany tsy misy hadisoana na fampandrenesana avy amin'ny antoko fahatelo.

Tsara ny manazava fa ny olana dia mety miankina amin'ny kely kokoa na lehibe kokoa amin'ny fampiharana azy ary mety tsy hiseho, ohatra, amin'ny fanaraha-maso. Raha sendra an'io ianao dia misy vahaolana tsotra tonga ao an-tsaina aloha: ampio hook preStop miaraka amin'ny sleep(30). Izany dia ahafahanao mamita ny fangatahana rehetra teo aloha (ary tsy manaiky vaovao izahay, satria pod efa mahavita fampijanonana), ary rehefa afaka 30 segondra dia hifarana amin'ny famantarana ny pod mihitsy SIGTERM.

Mipoitra izany lifecycle fa ny container dia ho toy izao:

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

Na izany aza, noho ny 30 segondra sleep isika mafy hampitomboina ny fotoana fandefasana, satria ho tapaka ny pod tsirairay farafaharatsiny 30 segondra, izay ratsy. Inona no azo atao amin'izany?

Andeha isika hitodika any amin'ny antoko tompon'andraikitra amin'ny fanatanterahana mivantana ny fangatahana. Raha ny antsika dia izany PHP-FPMfa amin'ny alàlan'ny default dia tsy manara-maso ny fanatanterahana ny fizotran'ny zanany: Tapaka avy hatrany ny fizotran'ny master. Azonao atao ny manova ity fihetsika ity amin'ny alàlan'ny torolàlana process_control_timeout, izay mamaritra ny fe-potoana ho an'ny fizotry ny ankizy hiandry famantarana avy amin'ny tompony. Raha apetrakao amin'ny 20 segondra ny sanda, dia handrakotra ny ankamaroan'ny fanontaniana mandeha ao anaty fitoeran-javatra izany ary hampiato ny fizotran'ny master rehefa vita.

Miaraka amin'izany fahalalana izany, andeha isika hiverina amin'ny olana farany. Araka ny voalaza, tsy sehatra monolitika i Kubernetes: mila fotoana kely ny fifandraisana eo amin'ireo singa samihafa ao aminy. Marina indrindra izany rehefa mandinika ny fiasan'ny Ingresses sy ny singa hafa mifandraika amin'izany isika, satria noho ny fahatarana toy izany amin'ny fotoana fametrahana dia mora ny mahazo fisondrotry ny fahadisoana 500. Ohatra, misy hadisoana mety hitranga eo amin'ny dingan'ny fandefasana fangatahana any amin'ny ambaratonga ambony, fa ny "fahatarany" amin'ny fifandraisana eo amin'ny singa dia fohy - latsaky ny iray segondra.

Noho izany, Amin'ny fitambarany miaraka amin'ny toromarika efa voalaza process_control_timeout azonao ampiasaina ity fanorenana manaraka ity ho an'ny lifecycle:

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

Amin'ity tranga ity dia hanonitra ny fahatarana amin'ny baiko izahay sleep ary aza ampitomboina be ny fotoana fandefasana: misy fahasamihafana miharihary eo amin'ny 30 segondra sy iray?.. Raha ny marina, dia ny process_control_timeoutary lifecycle ampiasaina ho "harato fiarovana" fotsiny raha misy fahatarana.

Amin'ny ankapobeny, ny fihetsika voalaza sy ny vahaolana mifanaraka amin'izany dia mihatra tsy amin'ny PHP-FPM ihany. Ny toe-javatra mitovy amin'izany dia mety hitranga amin'ny fomba iray na hafa rehefa mampiasa fiteny/rafitra hafa. Raha tsy azonao atao ny manamboatra ny fanakatonana tsara amin'ny fomba hafa - ohatra, amin'ny alàlan'ny fanoratana indray ny kaody mba ahafahan'ny fampiharana manara-maso tsara ny famantarana fampitsaharana - azonao atao ny mampiasa ny fomba voalaza. Mety tsy ho ny tsara indrindra, fa miasa.

Fanao. Fitsapana entana mba hijerena ny fiasan'ny pod

Ny fitiliana entana dia iray amin'ireo fomba hijerena ny fomba fiasan'ny kaontenera, satria io fomba fiasa io dia mampanakaiky azy amin'ny tena ady rehefa mitsidika ny tranokala ny mpampiasa. Mba hitsapana ireo tolo-kevitra etsy ambony dia azonao ampiasaina Yandex.Tankom: Mahafeno tanteraka ny filantsika rehetra izany. Ireto manaraka ireto dia toro-hevitra sy tolo-kevitra amin'ny fanaovana fitiliana miaraka amin'ny ohatra mazava avy amin'ny traikefantsika noho ny sarin'ny Grafana sy Yandex.Tank mihitsy.

Ny zava-dehibe indrindra eto dia jereo ny fanovana tsikelikely. Aorian'ny famenoana fanamboarana vaovao, tanteraho ny fitsapana ary jereo raha niova ny valiny raha oharina tamin'ny hazakazaka farany. Raha tsy izany dia ho sarotra ny hamantatra ny vahaolana tsy mahomby, ary amin'ny farany dia mety hanimba ihany (ohatra, hampitombo ny fotoana fametrahana).

Ny nuance iray hafa dia ny mijery ny logs container mandritra ny famaranana azy. Voarakitra ao ve ny fampahalalana momba ny fanakatonana tsara? Misy lesoka ve ao amin'ny diary rehefa miditra loharano hafa (ohatra, amin'ny kaontenera PHP-FPM mifanakaiky)? Ny hadisoana amin'ny fampiharana mihitsy (toy ny amin'ny NGINX voalaza etsy ambony)? Manantena aho fa ny fampahalalana fampidirana avy amin'ity lahatsoratra ity dia hanampy anao hahatakatra bebe kokoa ny zava-mitranga amin'ny kaontenera mandritra ny famaranana azy.

Noho izany, ny fitsapana voalohany natao tsy misy lifecycle ary tsy misy torolàlana fanampiny ho an'ny mpizara fampiharana (process_control_timeout amin'ny PHP-FPM). Ny tanjon'ity fitsapana ity dia ny hamantatra ny isan'ny fahadisoana (ary raha misy). Ary koa, avy amin'ny fampahalalana fanampiny, tokony ho fantatrao fa ny salan'isan'ny fotoana fandefasana isaky ny pod dia eo amin'ny 5-10 segondra mandra-pahavitany tanteraka. Ny vokatra dia:

Toro-hevitra sy fika Kubernetes: endri-javatra fanakatonana tsara amin'ny NGINX sy PHP-FPM

Ny tontonana fampahalalam-baovao Yandex.Tank dia mampiseho hadisoana 502, izay nitranga tamin'ny fotoana fametrahana ary naharitra hatramin'ny 5 segondra eo ho eo. Azo inoana fa izany dia satria ny fangatahana efa misy amin'ny pod taloha dia natsahatra rehefa tapitra izany. Taorian'izany dia nisy hadisoana 503 niseho, izay vokatry ny kaontenera NGINX nijanona, izay nanakana ny fifandraisana noho ny backend (izay nanakana an'i Ingress tsy hifandray aminy).

Andeha hojerentsika hoe ahoana process_control_timeout amin'ny PHP-FPM dia hanampy antsika hiandry ny fahavitan'ny fizotry ny zaza, izany hoe. manitsy ny fahadisoana toy izany. Avereno ampiasaina ity torolàlana ity:

Toro-hevitra sy fika Kubernetes: endri-javatra fanakatonana tsara amin'ny NGINX sy PHP-FPM

Tsy misy hadisoana intsony mandritra ny fametrahana faha-500! Mahomby ny fametrahana, miasa tsara ny fanakatonana.

Na izany aza, ilaina ny mitadidy ny olana amin'ny kaontenera Ingress, ampahany kely amin'ny fahadisoana mety ho azontsika noho ny fahatarana. Mba hisorohana azy ireo, ny hany sisa tavela dia ny manampy rafitra miaraka sleep ary avereno ny fametrahana. Na izany aza, tamin'ny tranga manokana, tsy nisy fiovana hita (indray, tsy misy hadisoana).

famaranana

Mba hampitsaharana ny dingana am-pahamendrehana dia andrasantsika ireto fihetsika manaraka ireto avy amin'ny fampiharana:

  1. Andraso segondra vitsy ary atsaharo ny fanekena fifandraisana vaovao.
  2. Andraso ny fangatahana rehetra hamita sy hanakatona ny fifandraisana keepalive rehetra izay tsy manatanteraka fangatahana.
  3. Farano ny dingana ataonao.

Na izany aza, tsy ny fampiharana rehetra no afaka miasa toy izany. Vahaolana iray amin'ny olana amin'ny zava-misy Kubernetes dia:

  • manampy vy mialoha fijanonana izay hiandry segondra vitsy;
  • mandalina ny fichier de configuration an'ny backend-nay mba hahitana ny masontsivana mety.

Ny ohatra miaraka amin'ny NGINX dia manazava fa na ny fampiharana iray izay tokony hikarakara tsara ny famantarana fampitsaharana amin'ny voalohany dia mety tsy hanao izany, noho izany dia ilaina ny manamarina ny lesoka 500 mandritra ny fametrahana ny fampiharana. Izany koa dia ahafahanao mijery ny olana amin'ny ankapobeny ary tsy mifantoka amin'ny pod na kaontenera tokana, fa mijery ny fotodrafitrasa manontolo amin'ny ankapobeny.

Amin'ny maha-fitaovana fitiliana anao dia azonao atao ny mampiasa Yandex.Tank miaraka amin'ny rafitra fanaraha-maso rehetra (raha ny anay, ny angon-drakitra dia nalaina tao amin'ny Grafana miaraka amin'ny backend Prometheus ho an'ny fitsapana). Ny olana amin'ny fanakatonana tsara dia hita mazava eo ambanin'ny enta-mavesatra izay azon'ny benchmark, ary ny fanaraha-maso dia manampy amin'ny famakafakana ny toe-javatra amin'ny antsipiriany bebe kokoa mandritra na aorian'ny fitsapana.

Ho valin'ny fanehoan-kevitra momba ny lahatsoratra: Tsara ny manamarika fa ny olana sy ny vahaolana dia voalaza eto mifandraika amin'ny NGINX Ingress. Ho an'ny tranga hafa, misy vahaolana hafa, izay mety hodinihintsika amin'ireto fitaovana manaraka ireto.

Sal

Hafa avy amin'ny andiany toro-hevitra sy fika K8s:

Source: www.habr.com

Add a comment