Awọn imọran Kubernetes & ẹtan: awọn ẹya ti pipade oore-ọfẹ ni NGINX ati PHP-FPM

Ipo aṣoju nigba imuse CI / CD ni Kubernetes: ohun elo naa gbọdọ ni anfani lati ko gba awọn ibeere alabara tuntun ṣaaju ki o to da duro patapata, ati ni pataki julọ, ni ifijišẹ pari awọn ti o wa tẹlẹ.

Awọn imọran Kubernetes & ẹtan: awọn ẹya ti pipade oore-ọfẹ ni NGINX ati PHP-FPM

Ibamu pẹlu ipo yii gba ọ laaye lati ṣaṣeyọri akoko idinku odo lakoko imuṣiṣẹ. Bibẹẹkọ, paapaa nigba lilo awọn edidi olokiki pupọ (bii NGINX ati PHP-FPM), o le ba pade awọn iṣoro ti yoo ja si ọpọlọpọ awọn aṣiṣe pẹlu imuṣiṣẹ kọọkan…

Ilana. Bawo ni podu n gbe

A ti ṣe atẹjade tẹlẹ ni awọn alaye nipa ọna igbesi aye ti podu kan Arokọ yi. Ni aaye ti koko-ọrọ ti o wa labẹ ero, a nifẹ si atẹle yii: ni akoko ti adarọ ese ba wọ inu ipinlẹ naa Ipilẹ, awọn ibeere tuntun dẹkun fifiranṣẹ si rẹ (pod yọ kuro lati atokọ ti awọn aaye ipari fun iṣẹ naa). Nitorinaa, lati yago fun akoko idinku lakoko imuṣiṣẹ, o to fun wa lati yanju iṣoro ti idaduro ohun elo naa ni deede.

O yẹ ki o tun ranti pe akoko oore-ọfẹ aiyipada jẹ 30 aaya: lẹhin eyi, podu naa yoo fopin si ati pe ohun elo gbọdọ ni akoko lati ṣe ilana gbogbo awọn ibeere ṣaaju akoko yii. DaakọBotilẹjẹpe eyikeyi ibeere ti o gba diẹ sii ju awọn aaya 5-10 ti jẹ iṣoro tẹlẹ, ati titiipa oore-ọfẹ kii yoo ṣe iranlọwọ mọ…

Lati ni oye daradara ohun ti o ṣẹlẹ nigbati adarọ ese ba pari, kan wo aworan atọka wọnyi:

Awọn imọran Kubernetes & ẹtan: awọn ẹya ti pipade oore-ọfẹ ni NGINX ati PHP-FPM

A1, B1 - Gbigba awọn ayipada nipa ipo ti hearth
A2 - Ilọkuro SIGTERM
B2 - Yiyọ a podu lati endpoints
B3 - Gbigba awọn ayipada (akojọ awọn aaye ipari ti yipada)
B4 - Ṣe imudojuiwọn awọn ofin iptables

Jọwọ ṣakiyesi: piparẹ awọn adarọ-ese ipari ati fifiranṣẹ SIGTERM ko ṣẹlẹ leralera, ṣugbọn ni afiwe. Ati nitori otitọ pe Ingress ko gba atokọ imudojuiwọn lẹsẹkẹsẹ ti Awọn ipari ipari, awọn ibeere tuntun lati ọdọ awọn alabara yoo firanṣẹ si adarọ ese, eyiti yoo fa aṣiṣe 500 lakoko ifopinsi podu. (fun ohun elo alaye diẹ sii lori ọran yii, a túmọ). Isoro yii nilo lati yanju ni awọn ọna wọnyi:

  • Firanṣẹ Asopọ: sunmọ ni awọn akọle idahun (ti eyi ba kan ohun elo HTTP kan).
  • Ti ko ba ṣee ṣe lati ṣe awọn ayipada si koodu naa, lẹhinna nkan atẹle n ṣe apejuwe ojutu kan ti yoo gba ọ laaye lati ṣe ilana awọn ibeere titi di opin akoko oore-ọfẹ.

Ilana. Bawo ni NGINX ati PHP-FPM ṣe fopin si awọn ilana wọn

NGINX

Jẹ ki a bẹrẹ pẹlu NGINX, nitori ohun gbogbo jẹ diẹ sii tabi kere si kedere pẹlu rẹ. Lilọ sinu ilana yii, a kọ pe NGINX ni ilana titunto si kan ati ọpọlọpọ “awọn oṣiṣẹ” - iwọnyi jẹ awọn ilana ọmọde ti o ṣe ilana awọn ibeere alabara. Aṣayan irọrun ti pese: lilo aṣẹ nginx -s <SIGNAL> fopin si awọn ilana boya ni sare tiipa tabi ore-ọfẹ tiipa mode. O han ni, o jẹ aṣayan ikẹhin ti o nifẹ si wa.

Lẹhinna ohun gbogbo rọrun: o nilo lati ṣafikun si preStop-kio aṣẹ ti yoo firanṣẹ ifihan agbara titiipa oore-ọfẹ. Eyi le ṣee ṣe ni Ifilọlẹ, ninu idina eiyan:

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

Ni bayi, nigbati adarọ-ese ba ti pa, a yoo rii atẹle naa ninu awọn apoti apoti 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

Ati pe eyi yoo tumọ si ohun ti a nilo: NGINX nduro fun awọn ibeere lati pari, ati lẹhinna pa ilana naa. Sibẹsibẹ, ni isalẹ a yoo tun ṣe akiyesi iṣoro ti o wọpọ nitori eyiti, paapaa pẹlu aṣẹ naa nginx -s quit ilana fopin si ti ko tọ.

Ati ni ipele yii a ṣe pẹlu NGINX: o kere ju lati awọn akọọlẹ o le loye pe ohun gbogbo n ṣiṣẹ bi o ti yẹ.

Kini adehun pẹlu PHP-FPM? Bawo ni o ṣe mu tiipa oore-ọfẹ? Jẹ ká ro ero o jade.

PHP-FPM

Ninu ọran ti PHP-FPM, alaye diẹ kere si wa. Ti o ba fojusi lori osise Afowoyi ni ibamu si PHP-FPM, yoo sọ pe awọn ami POSIX wọnyi ti gba:

  1. SIGINT, SIGTERM - sare tiipa;
  2. SIGQUIT - graceful tiipa (ohun ti a nilo).

Awọn ifihan agbara ti o ku ko nilo ni iṣẹ yii, nitorinaa a yoo fi itupalẹ wọn silẹ. Lati fopin si ilana naa ni deede, iwọ yoo nilo lati kọ kio preStop atẹle wọnyi:

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

Ni iwo akọkọ, eyi ni gbogbo ohun ti o nilo lati ṣe titiipa oore-ọfẹ ninu awọn apoti mejeeji. Sibẹsibẹ, iṣẹ-ṣiṣe naa nira sii ju bi o ti dabi lọ. Ni isalẹ wa awọn ọran meji ninu eyiti tiipa oore-ọfẹ ko ṣiṣẹ ati fa aini igba kukuru ti iṣẹ akanṣe lakoko imuṣiṣẹ.

Iwaṣe. Awọn iṣoro ti o ṣeeṣe pẹlu tiipa oore-ọfẹ

NGINX

Ni akọkọ, o wulo lati ranti: ni afikun si ṣiṣe pipaṣẹ naa nginx -s quit Ipele kan wa ti o tọ lati san ifojusi si. A pade ọrọ kan nibiti NGINX yoo tun firanṣẹ SIGTERM dipo ami ifihan SIGQUIT, nfa awọn ibeere lati ko pari ni deede. Iru awọn ọran le ṣee rii, fun apẹẹrẹ, nibi. Laanu, a ko le pinnu idi pataki fun ihuwasi yii: ifura kan wa nipa ẹya NGINX, ṣugbọn ko jẹrisi. Awọn aami aisan naa ni pe a ṣe akiyesi awọn ifiranṣẹ ni awọn iwe ipamọ NGINX: " iho ṣiṣi #10 osi ni asopọ 5", lẹhin eyi ti awọn podu duro.

A le ṣe akiyesi iru iṣoro bẹ, fun apẹẹrẹ, lati awọn idahun lori Ingress ti a nilo:

Awọn imọran Kubernetes & ẹtan: awọn ẹya ti pipade oore-ọfẹ ni NGINX ati PHP-FPM
Awọn afihan ti awọn koodu ipo ni akoko imuṣiṣẹ

Ni idi eyi, a gba koodu aṣiṣe 503 nikan lati Ingress funrararẹ: ko le wọle si eiyan NGINX, nitori ko si wiwọle mọ. Ti o ba wo awọn akọọlẹ apoti pẹlu NGINX, wọn ni nkan wọnyi:

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

Lẹhin iyipada ifihan iduro, eiyan naa bẹrẹ lati da duro ni deede: eyi ni idaniloju nipasẹ otitọ pe aṣiṣe 503 ko ṣe akiyesi.

Ti o ba ba pade iru iṣoro kan, o jẹ oye lati ro ero kini ifihan iduro ti a lo ninu apo eiyan ati kini gangan kio preStop dabi. O ti wa ni oyimbo ṣee ṣe wipe idi wa da gbọgán ni yi.

PHP-FPM... ati siwaju sii

Iṣoro pẹlu PHP-FPM ni a ṣe apejuwe ni ọna ti o kere julọ: ko duro fun ipari awọn ilana ọmọ, o fopin si wọn, eyiti o jẹ idi ti awọn aṣiṣe 502 waye lakoko imuṣiṣẹ ati awọn iṣẹ miiran. Awọn ijabọ kokoro pupọ lo wa lori bugs.php.net lati ọdun 2005 (fun apẹẹrẹ nibi и nibi), eyiti o ṣe apejuwe iṣoro yii. Ṣugbọn o ṣeese julọ kii yoo rii ohunkohun ninu awọn akọọlẹ: PHP-FPM yoo kede ipari ilana rẹ laisi awọn aṣiṣe eyikeyi tabi awọn iwifunni ẹnikẹta.

O tọ lati ṣalaye pe iṣoro naa funrararẹ le dale si iwọn kekere tabi tobi julọ lori ohun elo funrararẹ ati pe o le ma farahan funrararẹ, fun apẹẹrẹ, ni ibojuwo. Ti o ba ba pade rẹ, adaṣe ti o rọrun kan wa si ọkan ni akọkọ: ṣafikun kio preStop pẹlu sleep(30). Yoo gba ọ laaye lati pari gbogbo awọn ibeere ti o wa tẹlẹ (ati pe a ko gba awọn tuntun, niwon pod tẹlẹ agbara ti Ipilẹ), ati lẹhin ọgbọn-aaya 30 podu funrararẹ yoo pari pẹlu ifihan agbara kan SIGTERM.

O wa jade pe lifecycle nitori apoti naa yoo dabi eyi:

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

Sibẹsibẹ, nitori 30-aaya sleep a wa lagbara a yoo pọ si akoko imuṣiṣẹ, niwon kọọkan podu yoo wa ni fopin o kere ju 30 aaya, eyi ti o jẹ buburu. Kini o le ṣee ṣe nipa eyi?

Jẹ ki a yipada si ẹgbẹ ti o ni iduro fun ipaniyan taara ti ohun elo naa. Ninu ọran tiwa o jẹ PHP-FPM, eyi ti awọn nipa aiyipada ko ni bojuto awọn ipaniyan ti awọn oniwe-ọmọ lakọkọ: Ilana titunto si ti pari lẹsẹkẹsẹ. O le yi ihuwasi yii pada nipa lilo itọsọna naa process_control_timeout, eyi ti o ṣe apejuwe awọn akoko akoko fun awọn ilana ọmọde lati duro fun awọn ifihan agbara lati ọdọ oluwa. Ti o ba ṣeto iye si awọn aaya 20, eyi yoo bo pupọ julọ awọn ibeere ti n ṣiṣẹ ninu apo ati pe yoo da ilana titunto si ni kete ti wọn ba ti pari.

Pẹlu imọ yii, jẹ ki a pada si iṣoro wa kẹhin. Gẹgẹbi a ti sọ, Kubernetes kii ṣe pẹpẹ monolithic: ibaraẹnisọrọ laarin awọn ẹya oriṣiriṣi rẹ gba akoko diẹ. Eyi jẹ otitọ paapaa nigba ti a ba ṣe akiyesi iṣiṣẹ ti Ingresses ati awọn paati miiran ti o jọmọ, nitori nitori iru idaduro ni akoko imuṣiṣẹ o rọrun lati gba igbasoke ti awọn aṣiṣe 500. Fun apẹẹrẹ, aṣiṣe le waye ni ipele ti fifiranṣẹ ibeere kan si oke, ṣugbọn “aisun akoko” ti ibaraenisepo laarin awọn paati jẹ kukuru - o kere ju iṣẹju kan.

Iyẹn ni idi, Lapapọ pẹlu itọsọna ti a ti sọ tẹlẹ process_control_timeout o le lo awọn wọnyi ikole fun lifecycle:

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

Ni idi eyi, a yoo san isanpada fun idaduro pẹlu aṣẹ naa sleep ati pe maṣe mu akoko imuṣiṣẹ pọ pupọ: ṣe iyatọ ti o ṣe akiyesi laarin awọn aaya 30 ati ọkan?… Ni otitọ, o jẹ process_control_timeout, ati lifecycle lo nikan bi "ailewu net" ni irú ti aisun.

Ni gbogbogbo sọrọ, ihuwasi ti a ṣapejuwe ati iṣẹ ṣiṣe ti o baamu kii ṣe si PHP-FPM nikan. Ipo ti o jọra le ni ọna kan tabi omiran dide nigba lilo awọn ede miiran / awọn ilana. Ti o ko ba le ṣatunṣe tiipa oore-ọfẹ ni awọn ọna miiran - fun apẹẹrẹ, nipa atunkọ koodu naa ki ohun elo naa ṣe ilana awọn ami ifopinsi ni deede - o le lo ọna ti a ṣalaye. O le ma jẹ lẹwa julọ, ṣugbọn o ṣiṣẹ.

Iwaṣe. Fifuye igbeyewo lati ṣayẹwo awọn isẹ ti awọn podu

Idanwo fifuye jẹ ọkan ninu awọn ọna lati ṣayẹwo bii eiyan naa ṣe n ṣiṣẹ, nitori ilana yii mu ki o sunmọ awọn ipo ija gidi nigbati awọn olumulo ṣabẹwo si aaye naa. Lati ṣe idanwo awọn iṣeduro loke, o le lo Yandex.Tankom: O bo gbogbo aini wa ni pipe. Awọn atẹle jẹ awọn imọran ati awọn iṣeduro fun ṣiṣe idanwo pẹlu apẹẹrẹ ti o han gbangba lati iriri wa ọpẹ si awọn aworan ti Grafana ati Yandex.Tank funrararẹ.

Ohun pataki julọ nibi ni ṣayẹwo awọn ayipada igbese nipa igbese. Lẹhin fifi atunṣe tuntun kun, ṣiṣe idanwo naa ki o rii boya awọn abajade ti yipada ni akawe si ṣiṣe to kẹhin. Bibẹẹkọ, yoo nira lati ṣe idanimọ awọn solusan ti ko munadoko, ati ni ṣiṣe pipẹ o le ṣe ipalara nikan (fun apẹẹrẹ, pọ si akoko imuṣiṣẹ).

Iyatọ miiran ni lati wo awọn akọọlẹ eiyan lakoko ipari rẹ. Njẹ alaye nipa tiipa oore-ọfẹ ti gbasilẹ nibẹ? Ṣe awọn aṣiṣe eyikeyi wa ninu awọn akọọlẹ nigbati o n wọle si awọn orisun miiran (fun apẹẹrẹ, si apo eiyan PHP-FPM adugbo)? Awọn aṣiṣe ninu ohun elo funrararẹ (bii ninu ọran pẹlu NGINX ti a ṣalaye loke)? Mo nireti pe alaye iforowero lati inu nkan yii yoo ṣe iranlọwọ fun ọ lati ni oye daradara ohun ti o ṣẹlẹ si eiyan lakoko ifopinsi rẹ.

Nitorinaa, ṣiṣe idanwo akọkọ waye laisi lifecycle ati laisi awọn itọsọna afikun fun olupin ohun elo (process_control_timeout ninu PHP-FPM). Idi ti idanwo yii ni lati ṣe idanimọ nọmba isunmọ ti awọn aṣiṣe (ati boya eyikeyi wa). Pẹlupẹlu, lati alaye afikun, o yẹ ki o mọ pe apapọ akoko imuṣiṣẹ fun podu kọọkan jẹ nipa awọn aaya 5-10 titi ti o fi ṣetan ni kikun. Abajade ni:

Awọn imọran Kubernetes & ẹtan: awọn ẹya ti pipade oore-ọfẹ ni NGINX ati PHP-FPM

Igbimọ alaye Yandex.Tank ṣe afihan iwasoke ti awọn aṣiṣe 502, eyiti o waye ni akoko imuṣiṣẹ ati ṣiṣe ni apapọ titi di awọn aaya 5. Aigbekele eyi jẹ nitori awọn ibeere ti o wa tẹlẹ si podu atijọ ti n fopin si nigbati o ti pari. Lẹhin eyi, awọn aṣiṣe 503 han, eyiti o jẹ abajade ti apo NGINX ti o da duro, eyiti o tun sọ awọn asopọ silẹ nitori ẹhin (eyiti o ṣe idiwọ Ingress lati sopọ si rẹ).

Jẹ ká wo bi process_control_timeout ni PHP-FPM yoo ran wa lọwọ lati duro fun awọn Ipari ti ọmọ lakọkọ, i.e. ṣatunṣe iru awọn aṣiṣe. Tun-firanṣẹ ni lilo itọsọna yii:

Awọn imọran Kubernetes & ẹtan: awọn ẹya ti pipade oore-ọfẹ ni NGINX ati PHP-FPM

Ko si awọn aṣiṣe diẹ sii lakoko imuṣiṣẹ 500th! Ifiranṣẹ naa ṣaṣeyọri, awọn iṣẹ tiipa oore-ọfẹ.

Sibẹsibẹ, o tọ lati ranti ọrọ naa pẹlu awọn apoti Ingress, ipin kekere ti awọn aṣiṣe ninu eyiti a le gba nitori aisun akoko kan. Lati yago fun wọn, gbogbo awọn ti o ku ni lati fi kan be pẹlu sleep ki o si tun imuṣiṣẹ. Sibẹsibẹ, ninu ọran wa pato, ko si awọn ayipada ti o han (lẹẹkansi, ko si awọn aṣiṣe).

ipari

Lati fopin si ilana naa ni oore-ọfẹ, a nireti ihuwasi atẹle lati inu ohun elo naa:

  1. Duro iṣẹju diẹ lẹhinna da gbigba awọn asopọ tuntun duro.
  2. Duro fun gbogbo awọn ibeere lati pari ati tii gbogbo awọn asopọ ti o wa laaye ti kii ṣe awọn ibeere ṣiṣe.
  3. Pari ilana rẹ.

Sibẹsibẹ, kii ṣe gbogbo awọn ohun elo le ṣiṣẹ ni ọna yii. Ojutu kan si iṣoro naa ni awọn otitọ Kubernetes ni:

  • fifi kio kan-iṣaaju ti yoo duro fun iṣẹju-aaya diẹ;
  • kika faili iṣeto ni ti ẹhin wa fun awọn aye ti o yẹ.

Apẹẹrẹ pẹlu NGINX jẹ ki o han gbangba pe paapaa ohun elo ti o yẹ ki o ṣe ilana awọn ami ifopinsi ni deede le ma ṣe bẹ, nitorinaa o ṣe pataki lati ṣayẹwo fun awọn aṣiṣe 500 lakoko imuṣiṣẹ ohun elo. Eyi tun gba ọ laaye lati wo iṣoro naa ni fifẹ ati ki o maṣe dojukọ lori adarọ-ese kan tabi apoti, ṣugbọn wo gbogbo awọn amayederun lapapọ.

Gẹgẹbi ohun elo idanwo, o le lo Yandex.Tank ni apapo pẹlu eyikeyi eto ibojuwo (ninu ọran wa, a gba data lati Grafana pẹlu ẹhin Prometheus fun idanwo naa). Awọn iṣoro pẹlu tiipa oore-ọfẹ han gbangba labẹ awọn ẹru wuwo ti ala le ṣe ipilẹṣẹ, ati ibojuwo ṣe iranlọwọ lati ṣe itupalẹ ipo naa ni awọn alaye diẹ sii lakoko tabi lẹhin idanwo naa.

Ni idahun si awọn esi lori nkan naa: o tọ lati darukọ pe awọn iṣoro ati awọn solusan ti wa ni apejuwe nibi ni ibatan si NGINX Ingress. Fun awọn igba miiran, awọn solusan miiran wa, eyiti a le ronu ninu awọn ohun elo atẹle ti jara.

PS

Miiran lati awọn imọran ati ẹtan K8s jara:

orisun: www.habr.com

Fi ọrọìwòye kun