Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: nā hiʻohiʻona o ka pani ʻana i ka nani ma NGINX a me PHP-FPM

ʻO kahi kūlana maʻamau i ka wā e hoʻokō ai i ka CI/CD ma Kubernetes: ʻaʻole hiki i ka palapala noi ke ʻae i nā noi mea kūʻai aku hou ma mua o ka pau ʻana, a ʻo ka mea nui loa, e hoʻopau kūleʻa i nā mea i loaʻa.

Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: nā hiʻohiʻona o ka pani ʻana i ka nani ma NGINX a me PHP-FPM

ʻO ka hoʻokō ʻana i kēia kūlana e hiki ai iā ʻoe ke hoʻokō i ka zero downtime i ka wā hoʻolālā. Eia nō naʻe, ʻoiai ke hoʻohana ʻana i nā pūʻulu kaulana loa (e like me NGINX a me PHP-FPM), hiki iā ʻoe ke hālāwai me nā pilikia e alakaʻi i ka piʻi ʻana o nā hewa me kēlā me kēia kau ʻana...

Manao. Pehea ke ola o pod

Ua hoʻopuka mua mākou i nā kikoʻī e pili ana i ke kaʻina ola o kahi pod kēia ʻatikala. Ma ka pōʻaiapili o ke kumuhana e noʻonoʻo ʻia, makemake mākou i kēia: i ka manawa e komo ai ka pod i ka mokuʻāina Palena, pau nā noi hou i ka hoʻouna ʻia ʻana iā ia (pod hemo mai ka papa inoa o nā helu hope no ka lawelawe). No laila, e pale aku i ka downtime i ka wā o ka hoʻolaha ʻana, ua lawa ia iā mākou e hoʻoponopono i ka pilikia o ka hoʻōki pono ʻana i ka noi.

Pono ʻoe e hoʻomanaʻo ʻo ka manawa manawaleʻa paʻamau 30 kekona: Ma hope o kēia, e hoʻopau ʻia ka pod a pono e loaʻa ka manawa e hoʻoponopono ai i nā noi āpau ma mua o kēia manawa. i hoʻopuka: ʻoiai ua pilikia kekahi noi i ʻoi aku ma mua o 5-10 kekona, a ʻaʻole kōkua hou ka pani ʻana iā ia...

No ka hoʻomaopopo maikaʻi ʻana i ka hopena o ka pau ʻana o kahi pod, e nānā wale i kēia kiʻi:

Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: nā hiʻohiʻona o ka pani ʻana i ka nani ma NGINX a me PHP-FPM

A1, B1 - Loaʻa i nā loli e pili ana i ke kūlana o ka puʻu ahi
A2 - Haʻalele SIGTERM
B2 - Wehe i kahi pod mai nā wahi hopena
B3 - Loaʻa i nā loli (ua loli ka papa inoa o nā helu hope)
B4 - Hoʻohou i nā lula iptables

E ʻoluʻolu e hoʻomaopopo: ʻo ka holoi ʻana i ka pahu hopena a me ka hoʻouna ʻana iā SIGTERM ʻaʻole hiki ke hoʻokō ʻia, akā ma ka like. A ma muli o ka loaʻa ʻole ʻana o Ingress i ka papa inoa hou o Endpoints, e hoʻouna ʻia nā noi hou mai nā mea kūʻai aku i ka pod, kahi e hana ai i kahi hewa 500 i ka wā o ka pau ʻana o pod. (no nā mea kikoʻī hou aku e pili ana i kēia pilikia, mākou unuhi ʻia). Pono e hoʻoponopono ʻia kēia pilikia ma kēia mau ala:

  • E hoʻouna i ka pilina: kokoke i nā pane pane (inā pili kēia i kahi noi HTTP).
  • Inā ʻaʻole hiki ke hoʻololi i ke code, a laila wehewehe ka ʻatikala aʻe i kahi hopena e hiki ai iā ʻoe ke hana i nā noi a hiki i ka hopena o ka manawa lokomaikaʻi.

Manao. Pehea e hoʻopau ai ʻo NGINX a me PHP-FPM i kā lākou hana

NGINX

E hoʻomaka kākou me NGINX, no ka mea, ʻoi aku ka liʻiliʻi o nā mea āpau me ia. I ka luʻu ʻana i ka manaʻo, ʻike mākou he hoʻokahi kaʻina hana a NGINX a me kekahi mau "limahana" - ʻo ia nā kaʻina hana keiki e hoʻokō i nā noi a nā mea kūʻai aku. Hāʻawi ʻia kahi koho kūpono: me ka hoʻohana ʻana i ke kauoha nginx -s <SIGNAL> e hoʻopau i nā kaʻina hana ma ka pani wikiwiki a i ʻole ke ʻano hoʻopaʻa nani. ʻOiaʻiʻo, ʻo ia ke koho hope e hoihoi iā mākou.

A laila maʻalahi nā mea a pau: pono ʻoe e hoʻohui preStop-hook he kauoha e hoʻouna i ka hōʻailona pani. Hiki ke hana i kēia ma Deployment, ma ka pahu pahu:

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

I kēia manawa, i ka wā e pani ai ka pod, e ʻike mākou i kēia ma nā pahu pahu 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

A ʻo kēia ka mea e pono ai mākou: kali ʻo NGINX i nā noi e hoʻopau, a laila pepehi i ke kaʻina hana. Eia naʻe, ma lalo mākou e noʻonoʻo ai i kahi pilikia maʻamau ma muli o ia, ʻoiai me ke kauoha nginx -s quit hoʻopau hewa ke kaʻina hana.

A i kēia manawa ua hana mākou me NGINX: ma ka liʻiliʻi mai nā lāʻau hiki iā ʻoe ke hoʻomaopopo e hana ana nā mea āpau e like me ka mea e pono ai.

He aha ka pili me PHP-FPM? Pehea e hana ai i ka hoʻopaʻa ʻana maikaʻi? E noʻonoʻo kākou.

PHP-FPM

I ka hihia o PHP-FPM, aia ka liʻiliʻi o ka ʻike. Inā ʻoe e kālele ana manual oihana e like me PHP-FPM, e ʻōlelo ʻia ua ʻae ʻia nā hōʻailona POSIX aʻe:

  1. SIGINT, SIGTERM - pani wikiwiki;
  2. SIGQUIT - hoʻopau maikaʻi (ka mea e pono ai mākou).

ʻAʻole koi ʻia nā hōʻailona i koe i kēia hana, no laila e haʻalele mākou i kā lākou loiloi. No ka hoʻopau pololei ʻana i ke kaʻina hana, pono ʻoe e kākau i ka makau preStop penei:

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

I ka nānā mua ʻana, ʻo kēia wale nō ka mea e pono ai e hana i kahi pani nani i loko o nā pahu ʻelua. Eia naʻe, ʻoi aku ka paʻakikī o ka hana ma mua o ka mea i manaʻo ʻia. Aia ma lalo iho nā hihia ʻelua i hana ʻole ʻia ka hoʻopaʻa maikaʻi ʻana a ua loaʻa ʻole ka manawa pōkole o ka papahana i ka wā o ka waiho ʻana.

E hoʻomaʻamaʻa. ʻO nā pilikia me ka hoʻopaʻa ʻana maikaʻi

NGINX

ʻO ka mea mua, pono e hoʻomanaʻo: ma kahi o ka hoʻokō ʻana i ke kauoha nginx -s quit Aia kekahi pae ʻē aʻe e pono ke nānā aku. Ua loaʻa iā mākou kahi pilikia kahi e hoʻouna ai ʻo NGINX iā SIGTERM ma kahi o ka hōʻailona SIGQUIT, no laila ʻaʻole hoʻokō pono nā noi. Hiki ke loaʻa nā hihia like, no ka laʻana, maanei. ʻO ka mea pōʻino, ʻaʻole hiki iā mākou ke hoʻoholo i ke kumu kikoʻī o kēia ʻano: aia kahi kānalua e pili ana i ka mana NGINX, akā ʻaʻole i hōʻoia ʻia. ʻO ka hōʻailona, ​​​​ua ʻike ʻia nā memo ma nā pahu pahu NGINX: "Hamama ka puka #10 i koe ma ka pili 5", ma hope iho ua kū ka pod.

Hiki iā mākou ke nānā i kēlā pilikia, no ka laʻana, mai nā pane ma ka Ingress e pono ai mākou:

Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: nā hiʻohiʻona o ka pani ʻana i ka nani ma NGINX a me PHP-FPM
Nā hōʻailona o nā code kūlana i ka manawa o ka hoʻolaha ʻana

I kēia hihia, loaʻa iā mākou kahi code hewa 503 mai Ingress ponoʻī: ʻaʻole hiki iā ia ke komo i ka pahu NGINX, no ka mea ʻaʻole hiki ke loaʻa. Inā ʻoe e nānā i nā pahu pahu me NGINX, aia kēia mau mea:

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

Ma hope o ka hoʻololi ʻana i ka hōʻailona hoʻomaha, hoʻomaka ka pahu e kū pololei: ua hōʻoia ʻia kēia e ka ʻoiaʻiʻo ʻaʻole ʻike hou ʻia ka hewa 503.

Inā loaʻa iā ʻoe kekahi pilikia like, pono e noʻonoʻo i ke ʻano o ka hōʻailona hoʻomaha i hoʻohana ʻia i loko o ka ipu a me ke ʻano o ka makau preStop. Hiki paha ke waiho pololei ke kumu ma keia.

PHP-FPM... a oi

Hōʻike ʻia ka pilikia me PHP-FPM ma kahi ala liʻiliʻi: ʻaʻole ia e kali i ka hoʻopau ʻana o nā kaʻina keiki, hoʻopau iā lākou, ʻo ia ke kumu i loaʻa ai nā hewa 502 i ka wā o ka waiho ʻana a me nā hana ʻē aʻe. Nui nā hōʻike ʻino ma bugs.php.net mai ka makahiki 2005 (e laʻa maanei и maanei), e wehewehe ana i kēia pilikia. Akā ʻaʻole paha ʻoe e ʻike i kekahi mea i loko o nā lāʻau: E hoʻolaha ʻo PHP-FPM i ka pau ʻana o kāna kaʻina hana me ka ʻole o nā hewa a i ʻole nā ​​​​hōʻike ʻaoʻao ʻekolu.

He mea pono e ho'ākāka 'ia ka pilikia pono'ī e hilinaʻi i ka liʻiliʻi a i ʻole ka nui o ka noi ponoʻī a ʻaʻole paha e hōʻike iā ia iho, no ka laʻana, i ka nānā ʻana. Inā ʻoe e hālāwai me ia, hiki i ka noʻonoʻo mua kahi hana maʻalahi: hoʻohui i kahi makau preStop me sleep(30). E ʻae iā ʻoe e hoʻopau i nā noi āpau ma mua (a ʻaʻole mākou e ʻae i nā mea hou, ʻoiai ʻo pod ua hiki ke Palena), a ma hope o 30 kekona e pau ka pod me kahi hōʻailona SIGTERM.

Ke hoʻololi nei ia lifecycle no ka mea, e like me keia ke ano o ka ipu:

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

Eia naʻe, ma muli o ka 30-kekona sleep ʻO mākou nui e hoʻonui mākou i ka manawa hoʻolaha, no ka mea e hoʻopau ʻia kēlā me kēia pod palena iki 30 kekona, he hewa. He aha ka hana e pili ana i kēia?

E huli kakou i ka aoao kuleana no ka hooko pololei ana i ka palapala noi. I kā mākou hihia PHP-FPM, a ma ka paʻamau, ʻaʻole ia e nānā i ka hoʻokō ʻana i kāna kaʻina hana keiki: Hoʻopau koke ʻia ke kaʻina hana haku. Hiki iā ʻoe ke hoʻololi i kēia ʻano me ka hoʻohana ʻana i ke kuhikuhi process_control_timeout, e kuhikuhi ana i nā palena manawa no nā kaʻina hana keiki e kali i nā hōʻailona mai ka haku. Inā hoʻonoho ʻoe i ka waiwai i 20 kekona, e uhi kēia i ka hapa nui o nā nīnau e holo ana i loko o ka ipu a hoʻopau i ke kaʻina hana haku ke pau.

Me kēia ʻike, e hoʻi kākou i ko kākou pilikia hope. E like me ka mea i ʻōlelo ʻia, ʻaʻole ʻo Kubernetes kahi kahua monolithic: ʻo ke kamaʻilio ʻana ma waena o kāna mau ʻāpana like ʻole e lōʻihi ka manawa. He ʻoiaʻiʻo loa kēia i ka wā e noʻonoʻo ai mākou i ka hana o Ingresses a me nā ʻāpana ʻē aʻe e pili ana, no ka mea ma muli o ka lohi ʻana i ka manawa o ka waiho ʻana he maʻalahi ke kiʻi i ka piʻi ʻana o nā hewa 500. No ka laʻana, hiki mai ka hewa ma ke kahua o ka hoʻouna ʻana i kahi noi i luna, akā pōkole ka "manawa lag" o ka launa ʻana ma waena o nā ʻāpana - ʻoi aku ka liʻiliʻi ma mua o kekona.

No laila, I ka huinanui me ke kuhikuhi i olelo mua ia process_control_timeout hiki iā ʻoe ke hoʻohana i kēia kūkulu ʻana no lifecycle:

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

I kēia hihia, e uku mākou no ka lohi me ke kauoha sleep a mai hoʻonui nui i ka manawa hoʻolālā: aia kahi ʻokoʻa ma waena o 30 kekona a me hoʻokahi?.. ʻO ka ʻoiaʻiʻo, ʻo ia ka process_control_timeouta me ka lifecycle hoʻohana wale ʻia ma ke ʻano he "upena palekana" inā he lag.

Ma keʻano maʻamau ʻAʻole pili ka hana i wehewehe ʻia a me ka hoʻoponopono ʻana i ka PHP-FPM wale nō. Hiki ke ʻano like ʻole i kekahi ala a i ʻole ke hoʻohana ʻana i nā ʻōlelo ʻē aʻe. Inā ʻaʻole hiki iā ʻoe ke hoʻoponopono i ka pani ʻana ma nā ʻano ʻē aʻe - no ka laʻana, ma ke kākau hou ʻana i ke code i mea e hoʻokō pono ai ka noi i nā hōʻailona hoʻopau - hiki iā ʻoe ke hoʻohana i ke ʻano i wehewehe ʻia. ʻAʻole paha ʻo ia ka nani loa, akā hana.

E hoʻomaʻamaʻa. E hoʻouka i ka hoʻāʻo e nānā i ka hana o ka pod

ʻO ka hoʻāʻo hoʻouka kekahi o nā ala e nānā ai i ka hana ʻana o ka ipu, no ka mea, hoʻokokoke kēia kaʻina hana i nā kūlana hakakā maoli ke kipa nā mea hoʻohana i ka pūnaewele. No ka hoʻāʻo ʻana i nā ʻōlelo aʻoaʻo i luna, hiki iā ʻoe ke hoʻohana Yandex.Tankom: Ua uhi pono ia i ko kakou mau pono a pau. Eia nā ʻōlelo aʻoaʻo a me nā ʻōlelo aʻoaʻo no ka hoʻokō ʻana i ka hoʻāʻo ʻana me kahi hiʻohiʻona maopopo mai kā mākou ʻike e hoʻomaikaʻi i nā kiʻi o Grafana a me Yandex.Tank ponoʻī.

ʻO ka mea nui ma ʻaneʻi e nānā i nā loli i kēlā me kēia pae. Ma hope o ka hoʻohui ʻana i kahi hoʻoponopono hou, e holo i ka hoʻāʻo a ʻike inā ua loli nā hopena i hoʻohālikelike ʻia i ka holo hope. Inā ʻaʻole, paʻakikī ke ʻike i nā hopena kūpono ʻole, a i ka wā lōʻihi hiki ke hana ʻino wale nō (e laʻana, hoʻonui i ka manawa hoʻolaha).

ʻO kekahi nuance e nānā i nā pahu pahu i ka wā e pau ai. Ua hoʻopaʻa ʻia ka ʻike e pili ana i ka pani ʻana ma laila? Aia kekahi mau hewa i ka wā e komo ai i nā kumuwaiwai ʻē aʻe (no ka laʻana, i kahi pahu PHP-FPM kokoke)? Nā hewa i ka noi ponoʻī (e like me ka NGINX i hōʻike ʻia ma luna)? Manaʻo wau e kōkua ka ʻike hoʻolauna mai kēia ʻatikala iā ʻoe e hoʻomaopopo maikaʻi i ka mea e hiki mai ana i ka pahu i ka wā e pau ai.

No laila, ua holo ka ho'āʻo mua me ka ʻole lifecycle a me ka ʻole o nā kuhikuhi hou aʻe no ke kikowaena noi (process_control_timeout ma PHP-FPM). ʻO ke kumu o kēia hoʻāʻo ʻana ʻo ia ka ʻike ʻana i ka helu kokoke o nā hewa (a inā aia kekahi). Eia kekahi, mai nā ʻike hou aʻe, pono ʻoe e ʻike ʻo ka awelika o ka manawa hoʻolaha no kēlā me kēia pod ma kahi o 5-10 kekona a hiki i ka mākaukau piha. ʻO nā hopena:

Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: nā hiʻohiʻona o ka pani ʻana i ka nani ma NGINX a me PHP-FPM

Hōʻike ka papa ʻike Yandex.Tank i kahi spike o 502 hewa, i loaʻa i ka manawa o ka hoʻolaha ʻana a lōʻihi ma ka awelika a hiki i 5 kekona. Ma muli paha o ka hoʻopau ʻia ʻana o nā noi i ka pod kahiko i ka wā e hoʻopau ʻia ai. Ma hope o kēia, ua ʻike ʻia nā hewa 503, ʻo ia ka hopena o kahi pahu NGINX i hoʻōki ʻia, a ua hāʻule hoʻi nā pilina ma muli o ke kua hope (ka mea i pale iā Ingress mai ka hoʻopili ʻana iā ia).

E nana kakou pehea process_control_timeout ma PHP-FPM e kōkua iā mākou e kali no ka pau ʻana o nā kaʻina hana keiki, ʻo ia hoʻi. hooponopono ia mau hewa. E hoʻohana hou i kēia kuhikuhi:

Nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni Kubernetes: nā hiʻohiʻona o ka pani ʻana i ka nani ma NGINX a me PHP-FPM

ʻAʻohe hewa hou i ka wā o ka 500th deployment! Ua holomua ka hoʻolaha ʻana, hana maikaʻi ka pani ʻana.

Eia nō naʻe, pono e hoʻomanaʻo i ka pilikia me nā ipu Ingress, kahi hapa liʻiliʻi o nā hewa i loaʻa iā mākou ma muli o kahi lag manawa. I mea e pale aku ai iā lākou, ʻo ka hoʻohui ʻana i kahi hale me sleep a hana hou i ka hoʻolaha. Eia naʻe, i kā mākou hihia, ʻaʻohe loli i ʻike ʻia (hou, ʻaʻohe hewa).

hopena

No ka hoʻopau maikaʻi ʻana i ke kaʻina hana, manaʻo mākou i kēia ʻano hana mai ka noi:

  1. E kali i kekahi mau kekona a laila ho'ōki i ka ʻae ʻana i nā pilina hou.
  2. E kali no nā noi a pau e hoʻopau a pani i nā pili keepalive a pau e hoʻokō ʻole nei i nā noi.
  3. Hoʻopau i kāu hana.

Eia naʻe, ʻaʻole hiki i nā noi āpau ke hana i kēia ala. ʻO kahi hoʻonā i ka pilikia ma nā mea maoli ʻo Kubernetes:

  • e hoʻohui i kahi makau hoʻomaha e kali i kekahi mau kekona;
  • ke aʻo ʻana i ka faila hoʻonohonoho o kā mākou backend no nā ʻāpana kūpono.

Hōʻike ka laʻana me NGINX ʻaʻole hiki i kahi noi e hoʻoponopono mua i nā hōʻailona hoʻopau pololei, no laila he mea koʻikoʻi ke nānā i nā hewa 500 i ka wā o ka hoʻouna ʻana i ka noi. ʻAe kēia iā ʻoe e nānā ākea i ka pilikia a ʻaʻole e nānā i ka pod a i ʻole ka pahu hoʻokahi, akā e nānā i ka ʻōnaehana holoʻokoʻa holoʻokoʻa.

Ma ke ʻano he mea hana hoʻāʻo, hiki iā ʻoe ke hoʻohana iā Yandex.Tank i hui pū me kekahi ʻōnaehana nānā (i kā mākou hihia, lawe ʻia ka ʻikepili mai Grafana me kahi backend Prometheus no ka hoʻāʻo). ʻIke maopopo ʻia nā pilikia me ka hoʻopaʻa maikaʻi ʻana ma lalo o nā haʻahaʻa koʻikoʻi e hiki ai i ka benchmark ke hoʻopuka, a kōkua ka nānā ʻana i ka nānā ʻana i ke kūlana i nā kikoʻī i ka wā a i ʻole ma hope o ka hoʻāʻo.

I ka pane ʻana i nā manaʻo ma ka ʻatikala: pono e haʻi ʻia nā pilikia a me nā hoʻonā i wehewehe ʻia ma aneʻi e pili ana i NGINX Ingress. No nā hihia ʻē aʻe, aia nā hopena ʻē aʻe, a mākou e noʻonoʻo ai i nā mea aʻe o ka moʻo.

PS

Nā mea ʻē aʻe mai nā ʻōlelo aʻoaʻo a me nā hoʻopunipuni K8s:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka