Kubernetes 㧠CI/CD ãå®è£ ããå Žåã®äžè¬çãªæ¡ä»¶: ã¢ããªã±ãŒã·ã§ã³ã¯å®å šã«åæ¢ããåã«ããããŠæãéèŠãªããšã«ãæ¢åã®ãªã¯ãšã¹ããæ£åžžã«å®äºãããŸã§ãæ°ããã¯ã©ã€ã¢ã³ã ãªã¯ãšã¹ããåãå ¥ããããªãããã«ããå¿ èŠããããŸãã
ãã®æ¡ä»¶ã«æºæ ãããšãå±éäžã«ããŠã³ã¿ã€ã ããŒãã«ã§ããŸãã ãã ããéåžžã«äººæ°ã®ãããã³ãã« (NGINX ã PHP-FPM ãªã©) ã䜿çšããŠããå Žåã§ãããããã€ã¡ã³ãããšã«ãšã©ãŒãæ¥å¢ãããšããåé¡ã«ééããå¯èœæ§ããããŸãã
çè«ã ãããã®çãæ¹
ãããã®ã©ã€ããµã€ã¯ã«ã«ã€ããŠã¯ãã§ã«è©³ããå
¬éããŠããŸã
ããã©ã«ãã®ç¶äºæéã¯æ¬¡ã®ãšããã§ããããšã«ã泚æããŠãã ããã
ããããçµäºãããšäœãèµ·ããããããããç解ããã«ã¯ã次ã®å³ãèŠãŠãã ããã
A1ãB1 - å²çè£ã®ç¶æ
ã«é¢ããå€æŽã®åä¿¡
A2 - åºçºã·ã°ã¿ãŒã
B2 - ãšã³ããã€ã³ãããããããåé€ãã
B3 - å€æŽã®åä¿¡ (ãšã³ããã€ã³ãã®ãªã¹ããå€æŽãããŸãã)
B4 - iptables ã«ãŒã«ã®æŽæ°
泚æ: ãšã³ããã€ã³ã ãããã®åé€ãš SIGTERM ã®éä¿¡ã¯é£ç¶çã«è¡ãããã®ã§ã¯ãªãã䞊è¡ããŠè¡ãããŸãã ãŸããIngress ããšã³ããã€ã³ãã®æŽæ°ããããªã¹ããããã«åä¿¡ããªããããã¯ã©ã€ã¢ã³ãããã®æ°ãããªã¯ãšã¹ãããããã«éä¿¡ããããããã®çµäºæã« 500 ãšã©ãŒãçºçããŸãã (ãã®åé¡ã«é¢ãã詳现ãªè³æã«ã€ããŠã¯ã
- æ¥ç¶ã®éä¿¡: å¿çããããŒã§éããŸã (HTTP ã¢ããªã±ãŒã·ã§ã³ã«é¢ããå Žå)ã
- ã³ãŒããå€æŽã§ããªãå Žåã¯ã次ã®èšäºã§ãç¶äºæéãçµäºãããŸã§ãªã¯ãšã¹ããåŠçã§ãã解決çã«ã€ããŠèª¬æããŸãã
çè«ã NGINX ãš PHP-FPM ãããã»ã¹ãçµäºããæ¹æ³
nginxã®
NGINX ã䜿ãã°ãã¹ãŠãå€ããå°ãªããæããã«ãªããããNGINX ããå§ããŸãããã çè«ã詳ããèŠãŠã¿ããšãNGINX ã«ã¯ XNUMX ã€ã®ãã¹ã¿ãŒ ããã»ã¹ãšè€æ°ã®ãã¯ãŒã«ãŒããããããããã¯ã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ããåŠçããåããã»ã¹ã§ããããšãããããŸãã 䟿å©ãªãªãã·ã§ã³ãæäŸãããŠããŸã: ã³ãã³ãã䜿çšãã nginx -s <SIGNAL>
é«éã·ã£ããããŠã³ ã¢ãŒããŸãã¯æ£åžžãªã·ã£ããããŠã³ ã¢ãŒãã§ããã»ã¹ãçµäºããŸãã æããã«ãç§ãã¡ãèå³ãæã£ãŠããã®ã¯åŸè
ã®ãªãã·ã§ã³ã§ãã
ããããã°ããã¹ãŠãç°¡åã«ãªããŸãã次ã®ããšãè¿œå ããå¿
èŠããããŸãã
lifecycle:
preStop:
exec:
command:
- /usr/sbin/nginx
- -s
- quit
ããããã·ã£ããããŠã³ãããšã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
ããã¯ãå¿
èŠãªããšãæå³ããŸããNGINX ã¯ãªã¯ãšã¹ããå®äºããã®ãåŸ
ã£ãŠãããããã»ã¹ã匷å¶çµäºããŸãã ãã ãã以äžã§ã¯ãã³ãã³ãã䜿çšããå Žåã§ãããããåå ã§çºçããäžè¬çãªåé¡ã«ã€ããŠãèæ
®ããŸãã nginx -s quit
ããã»ã¹ã誀ã£ãŠçµäºããŸãã
ãã®æ®µé㧠NGINX ã®äœ¿çšã¯å®äºã§ããå°ãªããšããã°ããã¯ããã¹ãŠãæ£åžžã«åäœããŠããããšãããããŸãã
PHP-FPM ã¯ã©ããªãã®ã§ãããã? æ£åžžãªã·ã£ããããŠã³ã¯ã©ã®ããã«åŠçãããŸãã? ãããç解ããŸãããã
PHP-FPM
PHP-FPM ã®å Žåãæ
å ±ãå°ãå°ãªããªããŸãã éäžããã°
-
SIGINT
,SIGTERM
â é«éã·ã£ããããŠã³ã -
SIGQUIT
â æ£åžžãªã·ã£ããããŠã³ (å¿ èŠãªãã®)ã
æ®ãã®ä¿¡å·ã¯ãã®ã¿ã¹ã¯ã§ã¯å¿ èŠãªããããåæã¯çç¥ããŸãã ããã»ã¹ãæ£ããçµäºããã«ã¯ã次㮠preStop ããã¯ãèšè¿°ããå¿ èŠããããŸãã
lifecycle:
preStop:
exec:
command:
- /bin/kill
- -SIGQUIT
- "1"
äžèŠãããšãäž¡æ¹ã®ã³ã³ãããŒã§æ£åžžãªã·ã£ããããŠã³ãå®è¡ããããã«å¿ èŠãªã®ã¯ããã ãã§ãã ãããããã®ä»äºã¯æã£ãŠãããããé£ããã§ãã 以äžã«ãæ£åžžãªã·ã£ããããŠã³ãæ©èœãããå±éäžã«ãããžã§ã¯ããçæéå©çšã§ããªããªã XNUMX ã€ã®ã±ãŒã¹ã瀺ããŸãã
ç·Žç¿ããã æ£åžžãªã·ã£ããããŠã³ã§èããããåé¡
nginxã®
ãŸãã次ã®ããšãèŠããŠãããšäŸ¿å©ã§ãã ã³ãã³ãã®å®è¡ã«å ããŠã nginx -s quit
ããäžã€æ³šç®ãã¹ãã¹ããŒãžããããŸãã NGINX ã SIGQUIT ã·ã°ãã«ã®ä»£ããã« SIGTERM ãéä¿¡ãããªã¯ãšã¹ããæ£ããå®äºããªããšããåé¡ãçºçããŸããã åæ§ã®äºäŸã¯ãäŸãã°ã次ã®ãããªå Žåã«èŠã€ãããŸãã
ãã®ãããªåé¡ã¯ãããšãã°ãå¿ èŠãª Ingress ã®å¿çãã芳å¯ã§ããŸãã
å°å
¥æã®ã¹ããŒã¿ã¹ã³ãŒãã®ã€ã³ãžã±ãŒã¿ãŒ
ãã®å ŽåãIngress èªäœãã 503 ãšã©ãŒ ã³ãŒãã®ã¿ãåãåããŸããNGINX ã³ã³ããã«ã¯ã¢ã¯ã»ã¹ã§ããªããªã£ããããNGINX ã³ã³ããã«ã¢ã¯ã»ã¹ã§ããŸããã NGINX ã§ã³ã³ãã ãã°ãèŠããšã次ã®ãã®ãå«ãŸããŠããŸãã
[alert] 13939#0: *154 open socket #3 left in connection 16
[alert] 13939#0: *168 open socket #6 left in connection 13
åæ¢ä¿¡å·ãå€æŽããåŸãã³ã³ããã¯æ£ããåæ¢ãå§ããŸããããã¯ã503 ãšã©ãŒã芳å¯ãããªããªã£ããšããäºå®ã«ãã£ãŠç¢ºèªãããŸãã
åæ§ã®åé¡ãçºçããå Žåã¯ãã³ã³ããå ã§ã©ã®ãããªåæ¢ä¿¡å·ã䜿çšãããŠããããããã³ preStop ããã¯ãæ£ç¢ºã«ã©ã®ãããªãã®ã§ããããç解ããããšãéèŠã§ãã çç±ã¯ãŸãã«ããã«ããå¯èœæ§ãååã«ãããŸãã
PHP-FPM...ãªã©
PHP-FPM ã®åé¡ã¯ç°¡åã«èª¬æãããŠããŸããPHP-FPM ã¯åããã»ã¹ã®å®äºãåŸ
ããã«åããã»ã¹ãçµäºããŸãããã®ããããããã€ã¡ã³ãããã®ä»ã®æäœäžã« 502 ãšã©ãŒãçºçããŸãã 2005 幎以éãbugs.php.net ã«ã¯ããã€ãã®ãã° ã¬ããŒãããããŸã (äŸ:
åé¡èªäœã¯å€ããå°ãªããã¢ããªã±ãŒã·ã§ã³èªäœã«äŸåããå¯èœæ§ããããç£èŠãªã©ã§ã¯ããèªäœãçŸããªãå¯èœæ§ãããããšãæ確ã«ãã䟡å€ããããŸãã ãã®åé¡ã«ééããå Žåã¯ããŸãç°¡åãªåé¿çãæãæµ®ãã³ãŸããããã¯ã次ã®ãã㪠preStop ããã¯ãè¿œå ããããšã§ãã sleep(30)
ã ããã«ããã以åã®ãã¹ãŠã®ãªã¯ãšã¹ããå®äºã§ããããã«ãªããŸã (ãããããããããæ°ãããªã¯ãšã¹ãã¯åãå
¥ããããŸãã) ãã§ã« ã§ãã çµäº)ã30 ç§åŸã«ãããèªäœãã·ã°ãã«ã§çµäºããŸãã SIGTERM
.
ããã¯ãããšãå€æ lifecycle
ã³ã³ããã¯æ¬¡ã®ããã«ãªããŸãã
lifecycle:
preStop:
exec:
command:
- /bin/sleep
- "30"
ãã ãã30ç§ãªã®ã§ã sleep
æã
匷ã åããããçµäºãããããããããã€æéãé·ããªããŸãã æå° 30ç§ãããã¯ã²ã©ãã§ãã ããã«ã€ããŠäœãã§ããã§ãããã?
ã¢ããªã±ãŒã·ã§ã³ã®çŽæ¥å®è¡ãæ
åœããåœäºè
ã«ç®ãåããŸãããã ç§ãã¡ã®å Žåã¯ããã§ã PHP-FPMã©ã¡ã ããã©ã«ãã§ã¯ãåããã»ã¹ã®å®è¡ãç£èŠããŸããã: ãã¹ã¿ãŒããã»ã¹ã¯å³æã«çµäºããŸãã ãã£ã¬ã¯ãã£ãã䜿çšããŠãã®åäœãå€æŽã§ããŸã process_control_timeout
ãåããã»ã¹ããã¹ã¿ãŒããã®ã·ã°ãã«ãåŸ
ã€æéå¶éãæå®ããŸãã å€ã 20 ç§ã«èšå®ãããšãã³ã³ãããŒå
ã§å®è¡ãããŠããã»ãšãã©ã®ã¯ãšãªãã«ããŒãããã¯ãšãªãå®äºãããšãã¹ã¿ãŒ ããã»ã¹ãåæ¢ããŸãã
ãã®ç¥èãèžãŸããŠãæåŸã®åé¡ã«æ»ããŸãããã åè¿°ããããã«ãKubernetes ã¯ã¢ããªã·ã㯠ãã©ãããã©ãŒã ã§ã¯ãããŸãããããŸããŸãªã³ã³ããŒãã³ãéã®éä¿¡ã«ã¯æéãããããŸãã ããã¯ãIngresses ããã®ä»ã®é¢é£ã³ã³ããŒãã³ãã®æäœãèæ ®ããå Žåã«ç¹ã«åœãŠã¯ãŸããŸãããããã€ã¡ã³ãæã®é 延ã«ããã500 件ã®ãšã©ãŒãæ¥å¢ããå¯èœæ§ãããããã§ãã ããšãã°ãäžæµã«ãªã¯ãšã¹ããéä¿¡ãã段éã§ãšã©ãŒãçºçããå¯èœæ§ããããŸãããã³ã³ããŒãã³ãéã®ããåãã®ãã¿ã€ã ã©ã°ãã¯éåžžã«çããXNUMX ç§æªæºã§ãã
ãã®ããã«ã åèšã§ ãã§ã«è¿°ã¹ããã£ã¬ã¯ãã£ãã䜿çšã㊠process_control_timeout
次ã®æ§é ã䜿çšã§ããŸã lifecycle
:
lifecycle:
preStop:
exec:
command: ["/bin/bash","-c","/bin/sleep 1; kill -QUIT 1"]
ãã®å Žåãã³ãã³ãã§é
延ãè£æ£ããŸãã sleep
ãããã€ã¡ã³ãæéã¯å€§å¹
ã«å¢å ããŸããã30 ç§ãš XNUMX ç§ã®éã«ç®ç«ã£ãéãã¯ãããŸãã?...å®éããã㯠process_control_timeout
ãš lifecycle
é
延ãçºçããå Žåã®ãã»ãŒããã£ãããããšããŠã®ã¿äœ¿çšãããŸãã
äžè¬çã«èšã㰠説æãããŠããåäœãšå¯Ÿå¿ããåé¿çã¯ãPHP-FPM ã ãã«é©çšããããã®ã§ã¯ãããŸãããã ä»ã®èšèª/ãã¬ãŒã ã¯ãŒã¯ã䜿çšããå Žåã«ããäœããã®åœ¢ã§åæ§ã®ç¶æ³ãçºçããå¯èœæ§ããããŸãã ä»ã®æ¹æ³ã§æ£åžžãªã·ã£ããããŠã³ãä¿®æ£ã§ããªãå Žå (ããšãã°ãã¢ããªã±ãŒã·ã§ã³ãçµäºä¿¡å·ãæ£ããåŠçããããã«ã³ãŒããæžãçŽããªã©)ã説æãããŠããæ¹æ³ã䜿çšã§ããŸãã æãçŸããã¯ãªããããããŸããããæ©èœããŸãã
ç·Žç¿ããã ãããã®åäœã確èªããããã®è² è·ãã¹ã
è² è·ãã¹ãã¯ããŠãŒã¶ãŒããµã€ãã«ã¢ã¯ã»ã¹ãããšãã«ã³ã³ãããŒãå®éã®æŠéç¶æ
ã«è¿ã¥ããããã³ã³ãããŒãã©ã®ããã«æ©èœãããã確èªããæ¹æ³ã® XNUMX ã€ã§ãã äžèšã®æšå¥šäºé
ããã¹ãããã«ã¯ã次ã䜿çšã§ããŸã
ããã§æãéèŠãªããšã¯ã å€æŽã段éçã«ç¢ºèªããã æ°ããä¿®æ£ãè¿œå ããåŸããã¹ããå®è¡ããŠãååã®å®è¡ãšæ¯èŒããŠçµæãå€åãããã©ããã確èªããŸãã ããããªããšãå¹æã®ãªããœãªã¥ãŒã·ã§ã³ãç¹å®ããããšãé£ãããªããé·æçã«ã¯å®³ãåãŒãã ãã«ãªããŸã (ããšãã°ãå°å ¥æéã®å¢å )ã
ãã XNUMX ã€ã®ãã¥ã¢ã³ã¹ã¯ãçµäºæã«ã³ã³ãããŒã®ãã°ã確èªããããšã§ãã æ£åžžãªã·ã£ããããŠã³ã«é¢ããæ å ±ã¯ããã«èšé²ãããŠããŸãã? ä»ã®ãªãœãŒã¹ (ããšãã°ãé£æ¥ãã PHP-FPM ã³ã³ãããŒ) ã«ã¢ã¯ã»ã¹ãããšãã«ããã°ã«ãšã©ãŒã¯ãããŸãã? ã¢ããªã±ãŒã·ã§ã³èªäœã«ãšã©ãŒããããŸãã (äžèšã® NGINX ã®å Žåãšåæ§)? ãã®èšäºã®çŽ¹ä»æ å ±ããçµäºæã«ã³ã³ãããŒã«äœãèµ·ããããããæ·±ãç解ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ãããã£ãŠãæåã®ãã¹ãå®è¡ã¯ã lifecycle
ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã«å¯Ÿããè¿œå ã®ãã£ã¬ã¯ãã£ãã¯ãããŸãã(process_control_timeout
PHP-FPM ã§)ã ãã®ãã¹ãã®ç®çã¯ããšã©ãŒã®ããããã®æ° (ããã³ãšã©ãŒããããã©ãã) ãç¹å®ããããšã§ããã ãŸããè¿œå æ
å ±ãããå®å
šã«æºåãæŽããŸã§ã®åãããã®å¹³åãããã€æéã¯çŽ 5 ïœ 10 ç§ã§ãã£ãããšãããããŸãã çµæã¯æ¬¡ã®ãšããã§ãã
Yandex.Tank æ
å ±ããã«ã«ã¯ã502 ãšã©ãŒã®æ¥å¢ã衚瀺ãããŸããããã¯å±éæã«çºçããå¹³åã§æ倧 5 ç§ç¶ããŸããã ããããããã¯ãå€ããããã®çµäºæã«ãå€ãããããžã®æ¢åã®ãªã¯ãšã¹ããçµäºããŠãããããšèããããŸãã ãã®åŸã503 ãšã©ãŒãçºçããŸãããããã¯ãNGINX ã³ã³ãããŒãåæ¢ããããšã«ãããã®ã§ãããã¯ãšã³ã (Ingress ãæ¥ç¶ã§ããªããªã£ã) ãåå ã§æ¥ç¶ããããããããŸããã
æ¹æ³ãèŠãŠã¿ãŸããã process_control_timeout
PHP-FPM ã§ã¯ãåããã»ã¹ã®å®äºãåŸ
ã€ã®ã«åœ¹ç«ã¡ãŸãã ãã®ãããªãšã©ãŒãä¿®æ£ããŸãã ãã®ãã£ã¬ã¯ãã£ãã䜿çšããŠåãããã€ããŸãã
500 åç®ã®ãããã€äžã«ãšã©ãŒã¯ããçºçããŸããã å°å
¥ã¯æåããæ£åžžãªã·ã£ããããŠã³ãæ©èœããŸãã
ãã ããIngress ã³ã³ããã®åé¡ãã€ãŸãã¿ã€ã ã©ã°ã«ããââããäžéšã®ãšã©ãŒãçºçããå¯èœæ§ãããããšãèŠããŠãã䟡å€ããããŸãã ããããåé¿ããã«ã¯ã次ã®ãããªæ§é ãè¿œå ããã ãã§ãã sleep
ãããŠå±éãç¹°ãè¿ããŸãã ãã ããç§ãã¡ã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãå€åã¯èŠãããŸããã§ãã (ããã§ããšã©ãŒã¯ãããŸãã)ã
ãŸãšã
ããã»ã¹ãæ£åžžã«çµäºããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãã次ã®åäœãæåŸ ãããŸãã
- æ°ç§åŸ ã£ãŠãããæ°ããæ¥ç¶ã®åãå ¥ããåæ¢ããŸãã
- ãã¹ãŠã®ãªã¯ãšã¹ããå®äºãããŸã§åŸ ã¡ããªã¯ãšã¹ããå®è¡ããŠããªããã¹ãŠã®ããŒãã¢ã©ã€ãæ¥ç¶ãéããŸãã
- ããã»ã¹ãçµäºããŸãã
ãã ãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããã®ããã«åäœã§ããããã§ã¯ãããŸããã Kubernetes ã®çŸå®ã®åé¡ã«å¯Ÿãã XNUMX ã€ã®è§£æ±ºçã¯æ¬¡ã®ãšããã§ãã
- æ°ç§åŸ æ©ããåæ¢åããã¯ãè¿œå ããŸãã
- ããã¯ãšã³ãã®èšå®ãã¡ã€ã«ã§é©åãªãã©ã¡ãŒã¿ã調ã¹ãŠããŸãã
NGINX ã®äŸã§ã¯ãæåã¯çµäºä¿¡å·ãæ£ããåŠçããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ã§ããæ£ããåŠçã§ããªãå¯èœæ§ãããããšãæããã§ãããã®ãããã¢ããªã±ãŒã·ã§ã³ã®ãããã€äžã« 500 ãšã©ãŒããã§ãã¯ããããšãéèŠã§ãã ããã«ãããåé¡ãããåºãèŠãããšãã§ããåäžã®ããããã³ã³ãããŒã«çŠç¹ãåœãŠãã®ã§ã¯ãªããã€ã³ãã©ã¹ãã©ã¯ãã£å šäœãå šäœãšããŠèŠãããšãã§ããŸãã
ãã¹ã ããŒã«ãšããŠãYandex.Tank ãä»»æã®ç£èŠã·ã¹ãã ãšçµã¿åãããŠäœ¿çšââã§ããŸã (ãã®äŸã§ã¯ããã¹ãçšã« Prometheus ããã¯ãšã³ããåãã Grafana ããããŒã¿ãååŸãããŸãã)ã æ£åžžãªã·ã£ããããŠã³ã®åé¡ã¯ããã³ãããŒã¯ãçæããå¯èœæ§ã®ããé«è² è·ã®äžã§æ確ã«ç¢ºèªã§ããã¢ãã¿ãªã³ã°ã¯ãã¹ãäžãŸãã¯ãã¹ãåŸã«ç¶æ³ããã詳现ã«åæããã®ã«åœ¹ç«ã¡ãŸãã
èšäºã«å¯Ÿãããã£ãŒãããã¯ãžã®åç: ããã§ã¯ãåé¡ãšè§£æ±ºçã NGINX Ingress ã«é¢é£ããŠèª¬æãããŠããããšãèšåãã䟡å€ããããŸãã ä»ã®ã±ãŒã¹ã«ã€ããŠã¯ãä»ã®è§£æ±ºçããããã·ãªãŒãºã®æ¬¡ã®è³æã§æ€èšããå¯èœæ§ããããŸãã
PS
K8s ã®ãã³ããšãã¯ãã㯠ã·ãªãŒãºã®ãã®ä»:
- «
NGINX Ingress ã®ã«ã¹ã¿ã ãšã©ãŒ ããŒãž "; - «
Web ã¢ããªã±ãŒã·ã§ã³ã®ããŒãå²ãåœãŠãšè² è·ã«ã€ã㊠"; - «
éçºãµã€ããžã®ã¢ã¯ã»ã¹ "; - «
倧èŠæš¡ããŒã¿ããŒã¹ã®ããŒãã¹ãã©ãããé«éåãã 'ã
åºæïŒ habr.com