Kubernetes 팁과 μš”λ Ή: NGINX 및 PHP-FPM의 μš°μ•„ν•œ μ’…λ£Œ κΈ°λŠ₯

Kubernetesμ—μ„œ CI/CDλ₯Ό κ΅¬ν˜„ν•  λ•Œ 일반적인 쑰건은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ™„μ „νžˆ μ€‘μ§€λ˜κΈ° μ „κΉŒμ§€λŠ” μƒˆλ‘œμš΄ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ μˆ˜λ½ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©°, κ°€μž₯ μ€‘μš”ν•œ 것은 κΈ°μ‘΄ μš”μ²­μ„ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

Kubernetes 팁과 μš”λ Ή: NGINX 및 PHP-FPM의 μš°μ•„ν•œ μ’…λ£Œ κΈ°λŠ₯

이 쑰건을 μ€€μˆ˜ν•˜λ©΄ 배포 쀑 λ‹€μš΄νƒ€μž„μ„ μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ NGINXλ‚˜ PHP-FPMκ³Ό 같이 널리 μ‚¬μš©λ˜λŠ” λ²ˆλ“€μ„ μ‚¬μš©ν•˜λ”λΌλ„ 배포할 λ•Œλ§ˆλ‹€ 였λ₯˜κ°€ κΈ‰μ¦ν•˜λŠ” λ¬Έμ œμ— 직면할 수 μžˆμŠ΅λ‹ˆλ‹€.

이둠. ν¬λ“œμ˜ μƒν™œ 방식

μš°λ¦¬λŠ” 이미 ν¬λ“œ 수λͺ…주기에 λŒ€ν•œ μžμ„Έν•œ 기사λ₯Ό κ²Œμ‹œν–ˆμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ„œ. κ³ λ € 쀑인 주제의 λ§₯λ½μ—μ„œ μš°λ¦¬λŠ” λ‹€μŒ 사항에 관심이 μžˆμŠ΅λ‹ˆλ‹€. ν¬λ“œκ°€ μƒνƒœμ— μ§„μž…ν•˜λŠ” μˆœκ°„ μ’…λ£Œ 쀑, μƒˆλ‘œμš΄ μš”μ²­μ΄ 더 이상 μ „μ†‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(pod μ‚­μ œλ¨ (μ„œλΉ„μŠ€μ˜ μ—”λ“œν¬μΈνŠΈ λͺ©λ‘μ—μ„œ) λ”°λΌμ„œ 배포 쀑 가동 쀑지 μ‹œκ°„μ„ λ°©μ§€ν•˜λ €λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ˜¬λ°”λ₯΄κ²Œ μ€‘μ§€ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•©λ‹ˆλ‹€.

λ˜ν•œ κΈ°λ³Έ 유예 기간은 λ‹€μŒκ³Ό κ°™λ‹€λŠ” 점도 κΈ°μ–΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. 30초: μ΄ν›„μ—λŠ” ν¬λ“œκ°€ μ’…λ£Œλ˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 이 κΈ°κ°„ 전에 λͺ¨λ“  μš”μ²­μ„ μ²˜λ¦¬ν•  μ‹œκ°„μ΄ ν•„μš”ν•©λ‹ˆλ‹€. 주의: μ‹€ν–‰ν•˜λŠ” 데 5~10초 이상 κ±Έλ¦¬λŠ” μΏΌλ¦¬λŠ” 이미 λ¬Έμ œκ°€ μžˆλŠ” 것이고, 정상적인 μ’…λ£Œλ‘œλŠ” ν•΄κ²°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν¬λ“œκ°€ μ’…λ£Œλ  λ•Œ μ–΄λ–€ 일이 μΌμ–΄λ‚˜λŠ”μ§€ 더 잘 μ΄ν•΄ν•˜λ €λ©΄ λ‹€μŒ λ‹€μ΄μ–΄κ·Έλž¨μ„ μ‚΄νŽ΄λ³΄μ„Έμš”.

Kubernetes 팁과 μš”λ Ή: NGINX 및 PHP-FPM의 μš°μ•„ν•œ μ’…λ£Œ κΈ°λŠ₯

A1, B1 - ν¬λ“œ μƒνƒœ λ³€κ²½ μˆ˜μ‹ 
A2 - SIGTERM 전솑
B2 - μ—”λ“œν¬μΈνŠΈμ—μ„œ ν¬λ“œ 제거
B3 - λ³€κ²½ 사항 μˆ˜μ‹ (μ—”λ“œν¬μΈνŠΈ λͺ©λ‘μ΄ 변경됨)
B4 - iptables κ·œμΉ™ μ—…λ°μ΄νŠΈ

μ°Έκ³ : νŒŒλ“œ μ—”λ“œν¬μΈνŠΈ μ‚­μ œ 및 SIGTERM 전솑은 순차적으둜 이루어지지 μ•Šκ³  λ³‘λ ¬λ‘œ μ§„ν–‰λ©λ‹ˆλ‹€. λ˜ν•œ Ingressκ°€ μ—…λ°μ΄νŠΈλœ μ—”λ“œν¬μΈνŠΈ λͺ©λ‘μ„ μ¦‰μ‹œ μˆ˜μ‹ ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒˆλ‘œμš΄ μš”μ²­μ΄ νŒŒλ“œλ‘œ μ „μ†‘λ˜μ–΄ νŒŒλ“œ μ’…λ£Œ μ‹œ 500 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. (μš°λ¦¬λŠ” 이 λ¬Έμ œμ— λŒ€ν•΄ 더 μžμ„Έν•œ 자료λ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. λ²ˆμ—­λ¨)이 λ¬Έμ œλŠ” λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ ν•΄κ²°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • μ—°κ²° 보내기: 응닡 ν—€λ”μ—μ„œ λ‹«μŠ΅λ‹ˆλ‹€(HTTP μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ μš©λ˜λŠ” 경우).
  • μ½”λ“œλ₯Ό λ³€κ²½ν•  수 μ—†λŠ” 경우, 이 λ¬Έμ„œμ—μ„œλŠ” 유예 기간이 끝날 λ•ŒκΉŒμ§€ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” μ†”λ£¨μ…˜μ„ μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.

이둠: NGINX와 PHP-FPM이 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•˜λŠ” 방법

NGINX

NGINXλΆ€ν„° μ‹œμž‘ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. NGINXμ—μ„œλŠ” λͺ¨λ“  것이 μ–΄λŠ 정도 λͺ…ν™•ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이둠을 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ©΄ NGINXμ—λŠ” ν•˜λ‚˜μ˜ λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€μ™€ μ—¬λŸ¬ 개의 "μ›Œμ»€"κ°€ μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μ›Œμ»€λŠ” ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. νŽΈλ¦¬ν•œ μ˜΅μ…˜μ€ λ‹€μŒ λͺ…령을 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 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은 μ–΄λ–€ κΈ°λŠ₯을 ν• κΉŒμš”? 정상적인 μ’…λ£Œ(graceful shutdown)λŠ” μ–΄λ–»κ²Œ μ²˜λ¦¬ν• κΉŒμš”? ν•¨κ»˜ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

PHP-FPM

PHP-FPM의 경우 정보가 쑰금 λΆ€μ‘±ν•©λ‹ˆλ‹€. 곡식 맀뉴얼 PHP-FPMμ—μ„œλŠ” λ‹€μŒ POSIX μ‹ ν˜Έκ°€ ν—ˆμš©λœλ‹€λŠ” λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

  1. SIGINT, SIGTERM β€” λΉ λ₯Έ μ’…λ£Œ
  2. SIGQUIT β€” μš°μ•„ν•œ μ’…λ£Œ(μš°λ¦¬μ—κ²Œ ν•„μš”ν•œ 것).

λ‚˜λ¨Έμ§€ μ‹ ν˜ΈλŠ” 이 μž‘μ—…μ— ν•„μš”ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 뢄석은 κ±΄λ„ˆλ›°κ² μŠ΅λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ™„λ£Œν•˜λ €λ©΄ λ‹€μŒκ³Ό 같은 preStop 후크λ₯Ό μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

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

μ–Έλœ» λ³΄κΈ°μ—λŠ” 두 μ»¨ν…Œμ΄λ„ˆ λͺ¨λ‘μ—μ„œ 정상 μ’…λ£Œλ₯Ό μˆ˜ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ‹€μ œ μž‘μ—…μ€ 보기보닀 훨씬 λ³΅μž‘ν•©λ‹ˆλ‹€. μ•„λž˜λŠ” 정상 μ’…λ£Œκ°€ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ•„ 배포 쀑에 ν”„λ‘œμ νŠΈλ₯Ό μΌμ‹œμ μœΌλ‘œ μ‚¬μš©ν•  수 μ—†κ²Œ 된 두 κ°€μ§€ μ‚¬λ‘€μž…λ‹ˆλ‹€.

μ—°μŠ΅. 정상적인 μ’…λ£Œ μ‹œ λ°œμƒν•  수 μžˆλŠ” 문제

NGINX

μš°μ„ , λͺ…령을 μ‹€ν–‰ν•˜λŠ” 것 외에도 λ‹€μŒ 사항을 κΈ°μ–΅ν•˜λŠ” 것이 μœ μš©ν•©λ‹ˆλ‹€. nginx -s quit μ£Όμ˜ν•΄μ•Ό ν•  단계가 ν•˜λ‚˜ 더 μžˆμŠ΅λ‹ˆλ‹€. NGINXκ°€ SIGQUIT μ‹ ν˜Έλ₯Ό λ³΄λ‚΄λŠ” λŒ€μ‹  SIGTERM μ‹ ν˜Έλ₯Ό 보내 μš”μ²­μ΄ μ œλŒ€λ‘œ μ™„λ£Œλ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό 같은 μœ μ‚¬ν•œ 사둀가 μžˆμŠ΅λ‹ˆλ‹€. 여기에. μ•ˆνƒ€κΉκ²Œλ„ 이 λ™μž‘μ˜ ꡬ체적인 원인을 νŒŒμ•…ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. NGINX 버전 κ΄€λ ¨ μ˜μ‹¬μ€ μžˆμ—ˆμ§€λ§Œ, ν™•μΈλ˜μ§€λŠ” μ•Šμ•˜μŠ΅λ‹ˆλ‹€. NGINX μ»¨ν…Œμ΄λ„ˆ λ‘œκ·Έμ—μ„œ λ‹€μŒκ³Ό 같은 λ©”μ‹œμ§€κ°€ κ΄€μ°°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. "μ—°κ²° 10에 μ—΄λ¦° μ†ŒμΌ“ #5이 남아 μžˆμŠ΅λ‹ˆλ‹€", κ·Έ ν›„ ν¬λ“œκ°€ λ©ˆμ·„μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, Ingress에 λŒ€ν•œ μ‘λ‹΅μ—μ„œ μ΄λŸ¬ν•œ 문제λ₯Ό κ΄€μ°°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Kubernetes 팁과 μš”λ Ή: NGINX 및 PHP-FPM의 μš°μ•„ν•œ μ’…λ£Œ κΈ°λŠ₯
배포 μ‹œμ μ˜ μƒνƒœ μ½”λ“œ ν‘œμ‹œκΈ°

이 경우 Ingress μžμ²΄μ—μ„œ 503 였λ₯˜ μ½”λ“œκ°€ λ°œμƒν•©λ‹ˆλ‹€. 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의 λ¬Έμ œμ μ€ κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³  μ’…λ£Œμ‹œμΌœ 배포 및 기타 μž‘μ—… 쀑에 502 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. bugs.php.netμ—λŠ” 2005λ…„λΆ€ν„° μ—¬λŸ¬ 버그 λ¦¬ν¬νŠΈκ°€ κ²Œμ‹œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€(예: 여기에 ΠΈ 여기에), 문제λ₯Ό μ„€λͺ…ν•˜λŠ” λ‚΄μš©μ΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ‘œκ·Έμ—λŠ” 아무것도 ν‘œμ‹œλ˜μ§€ μ•Šμ„ κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€. PHP-FPM은 였λ₯˜λ‚˜ 타사 μ•Œλ¦Ό 없이 ν”„λ‘œμ„ΈμŠ€ μ™„λ£Œλ₯Ό μ•Œλ¦½λ‹ˆλ‹€.

문제 μžμ²΄λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μžμ²΄μ— 따라 λ‹€μ†Œ λ‹¬λΌμ§ˆ 수 있으며, 예λ₯Ό λ“€μ–΄ λͺ¨λ‹ˆν„°λ§μ—μ„œ λ‚˜νƒ€λ‚˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€λŠ” 점을 λͺ…ν™•νžˆ ν•΄λ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ λ¨Όμ € κ°„λ‹¨ν•œ ν•΄κ²° 방법이 λ– μ˜€λ¦…λ‹ˆλ‹€. preStop 후크λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. sleep(30). 이λ₯Ό 톡해 이전에 μˆ˜ν–‰λœ λͺ¨λ“  μš”μ²­μ„ μ™„λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€(그리고 podκ°€ μƒˆλ‘œμš΄ μš”μ²­μ„ μˆ˜λ½ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ). 이미 ν•  수 μžˆλŠ” μ’…λ£Œ 쀑), 그리고 30초 후에 ν¬λ“œ μžμ²΄κ°€ μ‹ ν˜Έμ™€ ν•¨κ»˜ μ’…λ£Œλ©λ‹ˆλ‹€. SIGTERM.

그것은 λ°ν˜€ κ·Έ lifecycle μ»¨ν…Œμ΄λ„ˆμ˜ 경우 λ‹€μŒκ³Ό 같이 λ³΄μž…λ‹ˆλ‹€.

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

ν•˜μ§€λ§Œ 30초 ν‘œμ‹œλ‘œ 인해 sleep 우리 κ°•ν•˜κ²Œ 각 ν¬λ“œκ°€ μ’…λ£Œλ˜λ―€λ‘œ 배포 μ‹œκ°„μ΄ λŠ˜μ–΄λ‚©λ‹ˆλ‹€. μ΅œμ†Œν•œμ˜ 30초면 λ„ˆλ¬΄ μ§§λ„€μš”. μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”?

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 직접 μ‹€ν–‰ν•˜λŠ” λ‹Ήμ‚¬μžμ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 이 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. PHP-FPMμ–΄λŠ 기본적으둜 μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ 싀행을 λͺ¨λ‹ˆν„°λ§ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.: λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€κ°€ μ¦‰μ‹œ μ’…λ£Œλ©λ‹ˆλ‹€. 이 λ™μž‘μ€ λ‹€μŒ μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. process_control_timeoutλŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€μ˜ μ‹ ν˜Έλ₯Ό κΈ°λ‹€λ¦¬λŠ” μ‹œκ°„ μ œν•œμ„ μ§€μ •ν•©λ‹ˆλ‹€. 값을 20초둜 μ„€μ •ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰ 쀑인 λŒ€λΆ€λΆ„μ˜ μš”μ²­μ΄ 처리되고, μš”μ²­μ΄ μ™„λ£Œλ˜λ©΄ λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€κ°€ μ€‘μ§€λ©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 지식을 λ°”νƒ•μœΌλ‘œ λ§ˆμ§€λ§‰ 문제둜 λŒμ•„κ°€ λ³΄κ² μŠ΅λ‹ˆλ‹€. μ•žμ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ μΏ λ²„λ„€ν‹°μŠ€λŠ” λͺ¨λ†€λ¦¬μ‹ ν”Œλž«νΌμ΄ μ•„λ‹™λ‹ˆλ‹€. μ—¬λŸ¬ ꡬ성 μš”μ†Œ κ°„μ˜ μƒν˜Έ μž‘μš©μ—λŠ” μ‹œκ°„μ΄ κ±Έλ¦½λ‹ˆλ‹€. 특히 Ingress와 λ‹€λ₯Έ 인접 ꡬ성 μš”μ†Œμ˜ μž‘μ—…μ„ κ³ λ €ν•  λ•Œ λ”μš± κ·Έλ ‡μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 지연은 배포 μ‹œμ μ— 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μ—λ§Œ κ΅­ν•œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.λ‹€λ₯Έ PL/ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•  λ•Œλ„ λΉ„μŠ·ν•œ 상황이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ λ°©λ²•μœΌλ‘œλ„ 정상적인 μ’…λ£Œ 문제λ₯Ό ν•΄κ²°ν•  수 μ—†λ‹€λ©΄ (예: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œ μ‹ ν˜Έλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜λ„λ‘ μ½”λ“œλ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜λŠ” 경우) μ„€λͺ…λœ 방법을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ 쒋은 방법은 μ•„λ‹ˆμ§€λ§Œ μž‘λ™ν•©λ‹ˆλ‹€.

μ—°μŠ΅: ν¬λ“œ μž‘λ™μ„ ν™•μΈν•˜κΈ° μœ„ν•œ λΆ€ν•˜ ν…ŒμŠ€νŠΈ

λΆ€ν•˜ ν…ŒμŠ€νŠΈλŠ” μ»¨ν…Œμ΄λ„ˆ μž‘λ™ 방식을 ν™•μΈν•˜λŠ” ν•œ κ°€μ§€ λ°©λ²•μœΌλ‘œ, μ‚¬μš©μžκ°€ μ‚¬μ΄νŠΈλ₯Ό λ°©λ¬Έν•  λ•Œ μ‹€μ œ μ „νˆ¬ 상황에 더 κ°€κΉκ²Œ λ‹€κ°€κ°ˆ 수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€. μœ„μ˜ ꢌμž₯ 사항을 ν…ŒμŠ€νŠΈν•˜λ €λ©΄ λ‹€μŒμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Yandex.Tank: λͺ¨λ“  μš”κ΅¬ 사항을 μ™„λ²½ν•˜κ²Œ μΆ©μ‘±ν•©λ‹ˆλ‹€. Grafana와 Yandex.Tank 차트λ₯Ό ν™œμš©ν•œ 저희 κ²½ν—˜μ˜ μ‹œκ°μ  μ˜ˆμ‹œλ₯Ό 톡해 ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” λͺ‡ κ°€μ§€ 팁과 μš”λ Ήμ„ μ†Œκ°œν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ κ°€μž₯ μ€‘μš”ν•œ 것은 λ‹¨κ³„λ³„λ‘œ λ³€κ²½ 사항 ν™•μΈμƒˆλ‘œμš΄ μˆ˜μ • 사항을 μΆ”κ°€ν•œ ν›„ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜μ—¬ 이전 μ‹€ν–‰ 결과와 차이가 μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λΉ„νš¨μœ¨μ μΈ 해결책을 νŒŒμ•…ν•˜κΈ° μ–΄λ ΅κ³ , μž₯κΈ°μ μœΌλ‘œλŠ” 였히렀 ν•΄λ₯Ό 끼칠 수 μžˆμŠ΅λ‹ˆλ‹€(예: 배포 μ‹œκ°„ 증가).

또 λ‹€λ₯Έ μ€‘μš”ν•œ 점은 μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ μ‹œ 둜그λ₯Ό μ‚΄νŽ΄λ³΄λŠ” κ²ƒμž…λ‹ˆλ‹€. 정상 μ’…λ£Œ(graceful shutdown) κ΄€λ ¨ 정보가 κΈ°λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ? λ‹€λ₯Έ λ¦¬μ†ŒμŠ€(예: μΈμ ‘ν•œ PHP-FPM μ»¨ν…Œμ΄λ„ˆ)에 μ ‘κ·Όν•  λ•Œ λ‘œκ·Έμ— 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆκΉŒ? μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 자체의 였λ₯˜(μœ„μ—μ„œ μ„€λͺ…ν•œ NGINX의 경우처럼)λŠ” μžˆμŠ΅λ‹ˆκΉŒ? 이 κΈ€μ˜ μ†Œκ°œ 정보가 μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ μ‹œ λ°œμƒν•˜λŠ” 상황을 더 잘 μ΄ν•΄ν•˜λŠ” 데 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.

κ·Έλž˜μ„œ 첫 번째 ν…ŒμŠ€νŠΈ 싀행은 λ‹€μŒκ³Ό 같이 μ§„ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€. lifecycle 그리고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ— λŒ€ν•œ μΆ”κ°€ μ§€μΉ¨ 없이 (process_control_timeout PHP-FPMμ—μ„œ). 이 ν…ŒμŠ€νŠΈμ˜ λͺ©μ μ€ λŒ€λž΅μ μΈ 였λ₯˜ 수(그리고 였λ₯˜κ°€ μžˆλŠ”μ§€ μ—¬λΆ€)λ₯Ό νŒŒμ•…ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μΆ”κ°€ 정보λ₯Ό 톡해 각 ν¬λ“œμ˜ 평균 배포 μ‹œκ°„μ΄ μ™„μ „νžˆ 쀀비될 λ•ŒκΉŒμ§€ μ•½ 5~10μ΄ˆμ˜€λ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

Kubernetes 팁과 μš”λ Ή: NGINX 및 PHP-FPM의 μš°μ•„ν•œ μ’…λ£Œ κΈ°λŠ₯

Yandex.Tank λŒ€μ‹œλ³΄λ“œλŠ” 배포 쀑 λ°œμƒν•œ 502 였λ₯˜κ°€ 평균 5초 λ™μ•ˆ κΈ‰μ¦ν–ˆμŒμ„ λ³΄μ—¬μ€λ‹ˆλ‹€. μ΄λŠ” κΈ°μ‘΄ Pod에 λŒ€ν•œ κΈ°μ‘΄ μš”μ²­μ΄ μ’…λ£Œλ˜μ—ˆκΈ° λ•Œλ¬ΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ ν›„ 503 였λ₯˜κ°€ λ°œμƒν–ˆλŠ”λ°, μ΄λŠ” NGINX μ»¨ν…Œμ΄λ„ˆκ°€ μ€‘μ§€λ˜μ—ˆκ³  λ°±μ—”λ“œ(Ingressκ°€ μ—°κ²°ν•  수 μ—†μŒ)둜 인해 연결이 λŠμ–΄μ‘ŒκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

μ–΄λ–»κ²Œ λ˜λŠ”μ§€ 보자 process_control_timeout PHP-FPMμ—μ„œλŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 기닀리도둝 ν•˜μ—¬ μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό μˆ˜μ •ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. λ‹€μŒ μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μž¬λ°°ν¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Kubernetes 팁과 μš”λ Ή: NGINX 및 PHP-FPM의 μš°μ•„ν•œ μ’…λ£Œ κΈ°λŠ₯

배포 쀑 500 였λ₯˜κ°€ 더 이상 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€! 배포가 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œλ˜μ—ˆμœΌλ©°, 정상적인 μ’…λ£Œκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ Ingress μ»¨ν…Œμ΄λ„ˆμ˜ 경우, μ‹œκ°„ μ§€μ—°μœΌλ‘œ 인해 λ°œμƒν•  수 μžˆλŠ” μ†Œμˆ˜μ˜ 였λ₯˜κ°€ μžˆλ‹€λŠ” 점을 κΈ°μ–΅ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같은 ꡬ문을 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. sleep 배포λ₯Ό λ‹€μ‹œ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ €ν¬μ˜ κ²½μš°μ—λŠ” μ•„λ¬΄λŸ° 변화도 보이지 μ•Šμ•˜κ³  였λ₯˜λ„ λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

κ²°λ‘ 

ν”„λ‘œμ„ΈμŠ€λ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ™„λ£Œν•˜λ €λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€μŒκ³Ό 같은 λ™μž‘μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

  1. λͺ‡ μ΄ˆκ°„ κΈ°λ‹€λ¦° ν›„ μƒˆλ‘œμš΄ 연결을 μˆ˜λ½ν•˜μ§€ λ§ˆμ„Έμš”.
  2. λͺ¨λ“  μš”μ²­μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 기닀리고, μš”μ²­μ„ μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  Keepalive 연결을 λ‹«μŠ΅λ‹ˆλ‹€.
  3. ν”„λ‘œμ„ΈμŠ€λ₯Ό μ™„λ£Œν•˜μ„Έμš”.

ν•˜μ§€λ§Œ λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 이런 λ°©μ‹μœΌλ‘œ μž‘λ™ν•  수 μžˆλŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. μΏ λ²„λ„€ν‹°μŠ€ ν˜„μ‹€μ—μ„œ 이 λ¬Έμ œμ— λŒ€ν•œ ν•œ κ°€μ§€ 해결책은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λͺ‡ μ΄ˆκ°„ κΈ°λ‹€λ¦¬λŠ” 사전 μ •μ§€ 후크λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
  • κ΄€λ ¨ λ§€κ°œλ³€μˆ˜μ— λŒ€ν•œ λ°±μ—”λ“œ ꡬ성 νŒŒμΌμ„ κ²€μ‚¬ν•©λ‹ˆλ‹€.

NGINX μ˜ˆμ‹œλŠ” μ΄ˆκΈ°μ—λŠ” μ’…λ£Œ μ‹ ν˜Έλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ‘°μ°¨λ„ μ œλŒ€λ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•  수 μžˆλ‹€λŠ” 점을 μ΄ν•΄ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포 쀑에 500 였λ₯˜λ₯Ό ν™•μΈν•˜λŠ” 것이 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. λ˜ν•œ 이λ₯Ό 톡해 문제λ₯Ό 더 κ΄‘λ²”μœ„ν•˜κ²Œ μ‚΄νŽ΄λ³΄κ³  단일 ν¬λ“œλ‚˜ μ»¨ν…Œμ΄λ„ˆμ— μ§‘μ€‘ν•˜μ§€ μ•Šκ³  전체 인프라λ₯Ό μ „μ²΄μ μœΌλ‘œ μ‚΄νŽ΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

Yandex.TankλŠ” λͺ¨λ“  λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œκ³Ό ν•¨κ»˜ ν…ŒμŠ€νŠΈ λ„κ΅¬λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€(이 경우, Prometheus ν˜•νƒœμ˜ λ°±μ—”λ“œλ₯Ό μ‚¬μš©ν•˜λŠ” Grafanaμ—μ„œ 데이터λ₯Ό 가져와 ν…ŒμŠ€νŠΈν–ˆμŠ΅λ‹ˆλ‹€). λ²€μΉ˜λ§ˆν¬μ—μ„œ λ°œμƒν•  수 μžˆλŠ” κ³ΌλΆ€ν•˜ μƒν™©μ—μ„œλŠ” 정상 μ’…λ£Œ λ¬Έμ œκ°€ λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚©λ‹ˆλ‹€. λͺ¨λ‹ˆν„°λ§μ„ 톡해 ν…ŒμŠ€νŠΈ μ€‘μ΄λ‚˜ ν…ŒμŠ€νŠΈ 후에 상황을 λ”μš± μžμ„Ένžˆ 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€.

이 기사에 λŒ€ν•œ ν”Όλ“œλ°±μ— λŒ€ν•œ λ‹΅λ³€μž…λ‹ˆλ‹€. 여기에 μ„€λͺ…λœ λ¬Έμ œμ™€ 해결책은 NGINX Ingress에도 적용 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ‹€λ₯Έ κ²½μš°μ—λŠ” 이 μ‹œλ¦¬μ¦ˆμ˜ λ‹€μŒ μžλ£Œμ—μ„œ μ‚΄νŽ΄λ³Ό 수 μžˆλŠ” λ‹€λ₯Έ 해결책듀이 μžˆμŠ΅λ‹ˆλ‹€.

PS

기타 K8s 팁 및 μš”λ Ή μ‹œλ¦¬μ¦ˆ:

좜처 : habr.com

DDoS 보호, VPS VDS μ„œλ²„κ°€ μžˆλŠ” μ‚¬μ΄νŠΈλ₯Ό μœ„ν•œ μ•ˆμ •μ μΈ ν˜ΈμŠ€νŒ… κ΅¬μž… πŸ”₯ DDoS 곡격 λ°©μ§€ κΈ°λŠ₯이 νƒ‘μž¬λœ μ•ˆμ •μ μΈ μ›Ήμ‚¬μ΄νŠΈ ν˜ΈμŠ€νŒ…, VPS 및 VDS μ„œλ²„λ₯Ό κ΅¬λ§€ν•˜μ„Έμš” | ProHoster