Kubernetes apicibus & praestigiis: notae decoris shutdown in NGINX et PHP-FPM

Condicio typica cum CI/CD in Kubernetes exsequens: applicatio novas clientes petitiones accipere non poterit antequam penitus desinat, ac praesertim, feliciter completa existentia.

Kubernetes apicibus & praestigiis: notae decoris shutdown in NGINX et PHP-FPM

Obsequium cum hac conditione permittit ut nulla downtime instruere perveniat. Tamen, etiam cum admodum popularibus fasciculis utentibus (sicut NGINX et PHP-FPM), difficultatibus occurrere potes quae errorum impetus singulis instruere possunt...

Theoria. Quomodo pod vivit

Iam in specie de cyclo vitae folliculi in lucem editi sumus hoc articulum. In contextu argumenti quod attinet, hoc interest: tempore quo vasculum ingreditur termi-, novae petitiones ad eum mitti desinunt ( pod . ) delevit e numero terminorum pro servitio). Ita, ut tempus vitemus in instruere, satis est nobis solvere problema claudendi recte applicandi.

Etiam meminisse debes quod tempus gratiae default est XXX secondspost hoc vasculum finietur et applicatio ad omnes petitiones ante hoc tempus accedendi tempus erit. illud: quamquam quaevis petitio quae plusquam 5-10 seconds accipit, iam problematica est, et shutdown decorus auxilio iam non erit.

Ut melius intelligatur quid acciderit cum vasculum terminatur, mox sequenti schemate inspice;

Kubernetes apicibus & praestigiis: notae decoris shutdown in NGINX et PHP-FPM

A1, B1
A2 - Departure SIGTERM
B2 - vasculum removere ab terminos
B3 - Receptae mutationes (album terminos mutata)
B4 - Update praecepta iptables

Quaeso nota: delendo vasculum punctum et SIGTERM mittens non successiue fit, sed parallele. Et ex eo quod Ingress non statim recipiat indicem limitum renovatorum, novae petitiones clientium ad legumen mittentur, quae 500 errorem in legumen terminationem facient. (Pro ampliore materia de hac re, nos translata). Haec quaestio solvenda est his modis:

  • Connection mittere: claude in responsione capitis (si hoc ad applicationem HTTP).
  • Si mutationes in codice facere non potest, tunc sequens articulus solutionem describit, quae tibi permittit processum postulationum usque ad finem temporis decens.

Theoria. Quomodo NGINX et PHP-FPM suos processus terminant

nginx

Incipiamus ab NGINX, quia omnia magis vel minus perspicua sunt. Diving in theoriam discimus NGINX unum processum dominum habere et plures "opifices" - hi sunt pueri processus qui petitiones clientis processus. Opportunus optio datur: utens imperium nginx -s <SIGNAL> processibus terminatis vel shutdown vel in ieiunium venustus shutdown modus. Videlicet hic optio commodi nobis.

Tunc omnia simplicia sunt: ​​debes addere preStop-hamum quod signum decoris shutdown mittet mandatum. Id fieri potest in instruere, in continente scandalum;

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

Nunc, cum vasculum claudit, sequentia videbimus in NGINX receptaculo.

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

Hoc autem significabit quod opus est: NGINX preces ad perficiendum exspectat, et processum necat. Sed infra etiam problema commune considerabimus, ex quo, etiam cum mandato nginx -s quit processus male terminatur.

Atque hac in re cum NGINX agimus: saltem ex lignis comprehendere potes omnia prout decet operari.

Quid paciscor cum PHP-FPM? Quomodo shutdown tractat venustum? Sit instar est.

PHP FPM

In PHP-FPM, paulo minus est notitia. Si focus in officialis manual secundum PHP-FPM, dicetur sequentia signa POSIX accepta esse;

  1. SIGINT, SIGTERM - ieiunium shutdown;
  2. SIGQUIT β€” decorus shutdown (quod opus est).

Reliqua signa in hoc munere non requiruntur, ut eorum analysim omittamus. Processum recte terminandum, necesse est ut sequenti preStop hamo scribas;

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

Primo aspectu, haec omnia in utroque vase eleganti shutdown praestare debent. Sed negotium difficilius quam videtur. Infra sunt duo casus in quibus iucunda shutdown opera non fecit et breve tempus necessariae rei in instruere fecit.

Usu. Potest problems cum venuste shutdown

nginx

Imprimis utile est meminisse, praeter mandatum nginx -s quit Unum scaena magis est quae attentione dignum est. Causam invenimus ubi NGINX adhuc SIGTERM loco signi SIGQUIT mitteret, petitiones causando non recte completas. Similia reperiri possunt, e.g. hic. Infeliciter, rationem peculiarem huius agendi modi determinare non potuimus: suspicio erat de versione NGINX, sed non confirmata est. Indicium erat epistulae quae in NGINX continente acta observabantur; "Aperta tabernaculi # X relicto in nexu V", послС Ρ‡Π΅Π³ΠΎ pod останавливался.

Talem problema notare possumus, exempli gratia, ex responsionibus in Ingressu quae nobis necessaria est:

Kubernetes apicibus & praestigiis: notae decoris shutdown in NGINX et PHP-FPM
Indicatores status codes tempore instruere

Hoc in casu, tantum 503 errorum codicem ab ipsa Ingress accipimus: accedere non potest NGINX continens, cum iam non sit adeunda. Si continens Tigna cum NGINX spectes, haec continent:

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

Postquam signo mutato sistit, continens recte sistere incipit: hoc confirmatur eo quod 503 error non amplius observatur.

Si similem problema occurrant, sensum facit ut instare quid sistit signum in continente adhibitum, et quidnam uncus preStop simile viderit. Fieri potest ut ratio praecise in hoc posita sit.

PHP-FPM... et plus

Problema cum PHP-FPM describitur triviali modo: non expectat complementum processus infantis, eos terminat, unde 502 errores incidunt in instruere et aliis operationibus. Plures sunt cimex nuntia in bugs.php.net cum 2005 (eg hic ΠΈ hic) qui hanc quaestionem describit. Sed tu verisimillimum, nihil visurus es in lignis: PHP-FPM exitum sui processus sine ullis erroribus vel notificationibus tertiae partis annuntiabis.

Operae pretium est declarare ut res ipsa minus vel maius ab ipsa applicatione pendeat nec se, exempli gratia, vigilantia manifestare possit. Si occurras, simplex cui labor in mentem venit primum: adde hamum preStop cum sleep(30). Permittet te omnes petitiones quas antea comples (nec novas accipimus, quia pod .) iam capax termi-) , et post 30 seconds vasculum ipsum signo terminabitur SIGTERM.

Evenit ut lifecycle continens enim sic erit:

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

Sed ex XXX-secundo sleep nobis vehementer tempus instruere augebimus, quandoquidem vasculum unumquodque terminabitur minimum 30 secunda, quae mala est. Quid de hoc fieri potest?

Ad partem convertamus responsalem applicationis directam exsecutionem. In nobis est PHP FPMquod per defaltam non monitor exsecutionem processus sui pueri: dominus processus statim terminatur. Mores hanc mutare potes utens directivum process_control_timeout, quod determinat terminos pro processu infantis expectandi signa a magistro. Si valorem in 20 secundis decreveris, hoc maxime ex quaestionibus in continente currentibus operiet et processus domini semel completus erit.

Hac scientia, ad ultimam quaestionem revertamur. Ut monui, Kubernetes suggestum monolithicum non est: communicatio inter varias partes aliquandiu sumit. Hoc maxime verum est, cum operationem ingressuum aliorumque partium affinium consideramus, cum ob talem moram in tempore instruere facile sit impetus 500 errorum. Exempli gratia, error occurrit in scaena mittendi petendi adverso flumine, sed "tempus pigri" commercii inter partes satis breve est - minus quam alterum.

igitur, In summa cum iam dicta directiva process_control_timeout uti potes hoc constructione for lifecycle:

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

In hoc casu compensare dilationem cum mandato sleep et tempus instruere non signanter augemus: tamen differentia inter 30 secundos et unum est notabile?.. Re vera est process_control_timeoutquod lifecycle tantum ut "salutem rete" in casu TARDO.

Magis in universum, mores descriptos et correspondentes habemus adhibere non solum ad PHP-FPM. Similis condicio potest uno vel alio modo oriri cum utens aliis linguis/tabulationibus. Si lepide shutdown figere non potes aliis modis, exempli gratia, scribendo codicem ut applicatio recte processuum terminationum significationum β€” methodo descripta uti possis. Non sit pulcherrima, sed facit.

Usu. Operationem autem vasculum onus tentat ut reprehendo

Testis onus una est viae ad reprimendam quomodo opera continens, cum haec ratio propius ad condiciones pugnae reales reducat cum utentes situm visit. Ut supra suasiones probare, uti potes Yandex.Tankom: omnes necessitates nostras perfecte tegit. Hae sunt apicibus ac commendationibus ad probandum claro exemplo ab experientia nostra per graphas Grafanae et Yandex.Tank ipsa.

Maxime hic est reprehendo mutationes gradatim. His additis novam fix, experire curre et vide si eventus comparati ad ultimum currendum mutaverunt. Alioquin difficile erit solutiones inefficaces cognoscere, et in longo spatio solum nocere (exempli gratia, instruere tempus augere).

Aliud nuance est intueri tigna continens in terminatione istius. Estne informationes de decoro shutdown ibi memorantur? Suntne aliqui errores in lignis cum accessu aliarum facultatum (exempli gratia, ad PHP-FPM finitimum continens)? Errores in ipsa applicatione (sicut in casu cum NGINX de quo supra)? Spero fore ut informationes introductoriae ex hoc articulo melius intelligant te adiuvabit quae continenti in terminatione eius accidit.

Primum ergo examen sine curriculo fiebat lifecycle et sine praescriptionibus additis ad applicationem servo (process_control_timeout Π² PHP-FPM). ЦСлью этого тСста Π±Ρ‹Π»ΠΎ выявлСниС ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ количСства ошибок (ΠΈ Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΎΠ½ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅). Π’Π°ΠΊΠΆΠ΅ ΠΈΠ· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ слСдуСт Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ срСднСС врСмя дСплоя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π° составляло ΠΎΠΊΠΎΠ»ΠΎ 5-10 сСкунд Π΄ΠΎ состояния ΠΏΠΎΠ»Π½ΠΎΠΉ готовности. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΎΠ²Ρ‹:

Kubernetes apicibus & praestigiis: notae decoris shutdown in NGINX et PHP-FPM

Yandex.Tank informationes tabella ostendit spicam 502 errorum, qui in tempore instituti sunt et in mediocris usque ad 5 secundis duraverunt. Videlicet hoc erat, quia petitiones antiquae erant, quando terminabatur. Post haec, 503 errores prodierunt, qui effectus fuit vasis NGINX, quod etiam nexus omiserunt ob backend (qui impedivit Ingress a connexione cum eo).

Videamus quomodo process_control_timeout in PHP-FPM adiuvabit nos exspectationem puerili processuum completionem, i.e. tales errores corrigere. Re- explicandam hac praescriptione utens:

Kubernetes apicibus & praestigiis: notae decoris shutdown in NGINX et PHP-FPM

Non sunt plures errores in 500th instruere! Prospera est instruere opera shutdown decoro.

Sed memorabile est eventum cum Ingress vasis, parva recipis errorum in quibus ex tempore pigri recipiamus. Eos evitandos, quidquid reliquum est, compagem addere sleep ac repetere instruere. Sed in casu particulari nullae mutationes apparentes (iterum nullae errores).

conclusio,

Ad processum eleganter terminandum, sequentes mores ex applicatione exspectamus;

  1. Exspecta brevi tempore ac deinde desinas accipere novas necessitudines.
  2. Exspecta omnes petitiones ut compleas et claudas omnes nexus servativos qui petitiones non exsequuntur.
  3. Processum finire.

Sed non omnes applicationes hoc modo operari possunt. Una solutio quaestionis in Kubernetes realibus posita est;

  • addito pre- siste hamo, qui te brevi tempore exspectabit;
  • studeo limam configurationis nostri backend pro parametris opportunis.

Exemplo cum NGINX patefacit etiam applicationem quae initio processus terminationis signa recte facere non possunt, criticum est ob 500 errores in applicatione instruere. Hoc etiam tibi permittit ut latius quaestionem inspicias et non in uno vasculo vel vase versaris, sed totam infrastructuram in toto intuearis.

Ut instrumentum probationis, uti potes Yandex.Tank in conjunctione cum quavis ratione vigilantia (in nostro casu, notitia e Grafana cum Prometheo retrahenda pro experimento sumta est). Problemata eleganti shutdown perspicua sunt sub oneribus gravibus quas Probatio generare potest, et vigilantia adiuvat ad statum accuratius per vel post perceptum resolvere.

Ad feedback in articulum: memorabile est difficultates et solutiones hic in relatione ad NGINX Ingress descriptae. In aliis casibus aliae sunt solutiones, quae in sequentibus materiae seriei considerare possumus.

PS

Aliae ex K8s apicibus & strophis series:

Source: www.habr.com