TL; DR
- ΠΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π΅ Π²ΠΈΡΠΎΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΠΈ ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈΡΠ΅, ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΠΏΡΡΠ²ΠΈΡΠ½ΠΈΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π΅ ΡΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ.
- ΠΠ° ΠΏΠΎ-Π±ΡΡΠ·ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ ΠΈ ΠΏΠΎΠ²ΠΈΡΠ΅Π½Π° ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ (HOP).
- ΠΠ° Π½ΠΈΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, NOP ΠΈΠ·ΠΈΡΠΊΠ²Π°: ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅, Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅, ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π·Π° ΡΠ°Π·ΡΠΌΠ½ΠΎΡΡ ΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ/ΠΏΡΠ΅Ρ ΠΎΠ΄.
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΊΠ°ΡΠΎ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π° NOR Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΡΠΎΠ±Π° ΠΈ livenessProbe Kubernetes.
ΠΠ°ΠΊΠ²ΠΎ Π΅ ΡΠ°Π±Π»ΠΎΠ½ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ?
ΠΠΎΠ³Π°ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°ΡΠ΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π·Π° ΠΌΠΈΡΠΈΡΡΠ° ΠΈ Π²ΠΈΡΠΎΠΊΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΡΠ΅ Π·Π° ΡΠ°ΠΊΡΠ² Π°ΡΠΏΠ΅ΠΊΡ ΠΊΠ°ΡΠΎ ΡΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΎΡΡ ΠΊΡΠΌ Π³ΡΠ΅ΡΠΊΠΈ. ΠΠ΄Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ, Π°ΠΊΠΎ ΡΠ΅ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° Π±ΡΡΠ·ΠΎ ΡΠ»Π΅Π΄ ΠΏΠΎΠ²ΡΠ΅Π΄Π°. Π’ΠΈΠΏΠΈΡΠ½ΠΎ ΠΎΠ±Π»Π°ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° ΠΌΠΈΠΊΡΠΎΡΡΠ»ΡΠ³ΠΈ - ΠΊΡΠ΄Π΅ΡΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Ρ Π² ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. Π Π·Π° Π΄Π° ΡΡΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° k8s Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°ΡΠ΅ ΠΊΠ»ΡΡΡΠ΅Ρ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ»Π΅Π΄Π²Π°ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π‘ΡΠ΅Π΄ ΡΡΡ Π΅ ΡΠ°Π±Π»ΠΎΠ½ΡΡ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ. Π’ΠΎΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΊΠ°ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΠΎΠ±ΡΠ°Π²Π° Π½Π° k8s, ΡΠ΅ Π΅ Π·Π΄ΡΠ°Π²ΠΎ. Π’ΠΎΠ²Π° Π½Π΅ Π΅ ΡΠ°ΠΌΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠΎΠ²Π° Π΄Π°Π»ΠΈ ΠΏΠΎΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠΈ, Π½ΠΎ ΠΈ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΈ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ. ΠΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Kubernetes Π·Π½Π°Π΅ Π·Π° Π·Π΄ΡΠ°Π²Π΅ΡΠΎ Π½Π° Π³ΡΡΠΏΠ°ΡΠ°, ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²Π·Π΅ΠΌΠ° ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ΡΠΎ. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΏΡΠΈΠ½ΡΠΈΠΏΡΡ Π½Π° Π²ΠΈΡΠΎΠΊΠ° Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ ΡΠ²ΠΎΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΡΠΈΠ½ΡΠΈΠΏ Π½Π° Π²ΠΈΡΠΎΠΊΠ° Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡ (HOP)
ΠΡΠΈΠ½ΡΠΈΠΏΡΡ Π½Π° Π²ΠΈΡΠΎΠΊΠ° Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡ Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ
ΠΠ΄Π½ΠΎ Π΄ΠΎΠ±ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½ΠΎ ΠΎΠ±Π»Π°ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΠΈ ΡΡΠ±ΠΈΡΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ I/O ΠΏΠΎΡΠΎΡΠΈ STDERR ΠΈ STDOUT. Π‘Π»Π΅Π΄Π²Π° ΡΠΏΠΎΠΌΠ°Π³Π°ΡΠ΅Π»Π½Π° ΡΡΠ»ΡΠ³Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ filebeat, logstash ΠΈΠ»ΠΈ fluentd, Π΄ΠΎΡΡΠ°Π²ΡΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π΄ΠΎ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Prometheus) ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ (ΡΠΎΡΡΡΠ΅ΡΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ ELK). ΠΠΈΠ°Π³ΡΠ°ΠΌΠ°ΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Π΅Π΄Π½ΠΎ ΠΎΠ±Π»Π°ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΏΠΎΡΠ΅Π΄ ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π΄ΡΠ°Π²Π΅ΡΠΎ ΠΈ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ.
ΠΠ°ΠΊ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π·Π΄ΡΠ°Π²Π΅ΡΠΎ Π² Kubernetes?
ΠΠ·Π²ΡΠ½ ΠΊΡΡΠΈΡΡΠ°, k8s ΡΠ»Π΅Π΄ΠΈ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠΈΡΠ΅ (
Π Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ k8s Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ°. ΠΡΠΈ ΡΠΎΠ·ΠΈ ΡΠΈΠΏ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° kubelet Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ°Π·Π±Π΅ΡΠ΅, ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π΅ ΡΠΏΡΡΠ», ΡΠΎΠΉ ΡΠ΅ Π³ΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°. ΠΠΊΠΎ Π³ΡΠ΅ΡΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π° ΡΡΠ΅Π· ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π° ΠΏΡΠΈ Π²ΡΡΠΊΠ° Π³ΡΠ΅ΡΠΊΠ°, ΡΠΎΠ³Π°Π²Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ°Π²Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π΅ Π²ΡΠΈΡΠΊΠΎ, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΡΠ΅, Π·Π° Π΄Π° ΡΠ»Π΅Π΄Π²Π°ΡΠ΅ NOP ΠΈ ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π΄ΡΠ°Π²Π΅ΡΠΎ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΠΆΠ°Π»ΠΊΠΎ Π΅, ΡΠ΅ Π½Π΅ Π²ΡΠΈΡΠΊΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΠ΅ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ°Ρ ΡΡΠ΅Π· ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ k8s ΠΏΡΠ΅Π΄Π»Π°Π³Π° 2 ΠΏΠΎ-Π·Π°Π΄ΡΠ»Π±ΠΎΡΠ΅Π½ΠΈ Π½Π°ΡΠΈΠ½Π° Π·Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΊΠ°ΠΏΡΡΠ»Π°ΡΠ°:
LivenessProbe
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° livenessProbe kubelet ΠΈΠ·Π²ΡΡΡΠ²Π° 3 Π²ΠΈΠ΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ: Π½Π΅ ΡΠ°ΠΌΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π΄Π°Π»ΠΈ pod ΡΠ°Π±ΠΎΡΠΈ, Π½ΠΎ ΠΈ Π΄Π°Π»ΠΈ Π΅ Π³ΠΎΡΠΎΠ² Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΈ Π΄Π° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π°Π΄Π΅ΠΊΠ²Π°ΡΠ½ΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ:
- ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ HTTP Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ Π³ΡΡΠΏΠ°ΡΠ°. ΠΡΠ³ΠΎΠ²ΠΎΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ΄ΡΡΠΆΠ° HTTP ΠΊΠΎΠ΄ Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ 200 Π΄ΠΎ 399. Π’Π°ΠΊΠ° ΠΊΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ 5xx ΠΈ 4xx ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Ρ, ΡΠ΅ ΠΏΠΎΠ΄ΡΡ ΠΈΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ°Π±ΠΎΡΠΈ.
- ΠΠ° Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ pods Ρ Π½Π΅-HTTP ΡΡΠ»ΡΠ³ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΡΠ΅Π½ΡΠΊΠΈΡ ΡΡΡΠ²ΡΡ Postfix), ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ TCP Π²ΡΡΠ·ΠΊΠ°.
- ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΠΏΠΎΠ΄ (Π²ΡΡΡΠ΅ΡΠ½ΠΎ). ΠΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΡΡΠΏΠ΅ΡΠ½Π°, Π°ΠΊΠΎ ΠΊΠΎΠ΄ΡΡ Π·Π° Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π΅ 0.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎΠ²Π°. Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ Π½Π° pod ΡΡΠ΄ΡΡΠΆΠ° NodeJS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Ρ Π²ΡΡΠ»Ρ Π³ΡΠ΅ΡΠΊΠ° 500 ΠΏΡΠΈ HTTP Π·Π°ΡΠ²ΠΊΠΈ.ΠΠ° Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠ°ΠΊΠ°Π²Π° Π³ΡΠ΅ΡΠΊΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° livenessProbe:
apiVersion: v1
kind: Pod
metadata:
name: node500
spec:
containers:
- image: magalix/node500
name: node500
ports:
- containerPort: 3000
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
Π’ΠΎΠ²Π° Π½Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΎΡ Π²ΡΡΠΊΠ° Π΄ΡΡΠ³Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ Π½Π° pod, Π½ΠΎ Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡ .spec.containers.livenessProbe
... ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ httpGet
ΠΏΡΠΈΠ΅ΠΌΠ° ΠΏΡΡΡ, ΠΊΡΠΌ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° HTTP GET Π·Π°ΡΠ²ΠΊΠ°ΡΠ° (Π² Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ²Π° Π΅ /
, Π½ΠΎ Π² Π±ΠΎΠΉΠ½ΠΈΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π½Π΅ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ /api/v1/status
). ΠΡΡΠ³ livenessProbe ΠΏΡΠΈΠ΅ΠΌΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ initialDelaySeconds
, ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π° ΠΈΠ·ΡΠ°ΠΊΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π±ΡΠΎΠΉ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. ΠΠ°Π±Π°Π²ΡΠ½Π΅ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π°ΡΠΎΡΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΡΠΈ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ° Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ ΡΠ°Π·ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΊΡΠΌ ΠΊΠ»ΡΡΡΠ΅Ρ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅:
kubectl apply -f pod.yaml
Π‘Π»Π΅Π΄ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
kubectl describe pods node500
Π ΠΊΡΠ°Ρ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π° Π½Π°ΠΌΠ΅ΡΠ΅ΡΠ΅
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, livenessProbe ΠΈΠ½ΠΈΡΠΈΠΈΡΠ° HTTP GET Π·Π°ΡΠ²ΠΊΠ°, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π³ΡΠ΅ΡΠΊΠ° 500 (ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ) ΠΈ kubelet Π³ΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°.
ΠΠΊΠΎ ΡΠ΅ ΡΡΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊ Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ NideJS, Π΅ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡΠ΅ app.js ΠΈ Dockerfile:
app.js
var http = require('http');
var server = http.createServer(function(req, res) {
res.writeHead(500, { "Content-type": "text/plain" });
res.end("We have run into an errorn");
});
server.listen(3000, function() {
console.log('Server is running at 3000')
})
ΠΠΎΠΊΠ΅Ρ ΡΠ°ΠΉΠ»
FROM node
COPY app.js /
EXPOSE 3000
ENTRYPOINT [ "node","/app.js" ]
ΠΠ°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ ΡΠΎΠ²Π°: livenessProbe ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ Π½Π΅ ΡΡΠΏΠ΅Π΅. ΠΠΊΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅ΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ, kubelet Π½ΡΠΌΠ° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ΅ΠΌΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π·Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΡΠΎΠ±Π°
readinessProbe ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° livenessProbes (GET Π·Π°ΡΠ²ΠΊΠΈ, TCP ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ), Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΡΠ° Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΈΠ·ΠΏΡΠ°Π²Π½ΠΎΡΡΠΈ. ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ, Π² ΠΊΠΎΠΉΡΠΎ Π΅ ΠΎΡΠΊΡΠΈΡΠ° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°, Π½Π΅ ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°, Π½ΠΎ ΡΠ΅ ΠΈΠ·ΠΎΠ»ΠΈΡΠ° ΠΎΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡΠ°ΡΠΈΠΊ. ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅ ΡΠΈ, ΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π΅ ΠΏΠΎΠ΄ Π³ΠΎΠ»ΡΠΌΠΎ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΠ΅Π°ΠΊΡΠΈΡ. Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° livenessProbe, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΡΠ° Π·Π° Π½Π°Π»ΠΈΡΠ½ΠΎΡΡ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ° ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° (ΡΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° timeoutSeconds), ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ kubelet ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π·Π°Π΄Π°ΡΠΈ, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΈ ΡΠ΅ΡΡΡΡΠΈ, ΠΈ ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΠΎΡΠ½ΠΎΠ²ΠΎ. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°ΡΡ ΠΎΡ ΡΠΊΠΎΡΠΎΡΡ Π½Π° ΡΠ΅Π°ΠΊΡΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ»Π°, Π΄ΠΎΠΊΠ°ΡΠΎ Π΅ Π½Π° ΠΏΡΡΡ, ΡΠ°ΠΊΠ° ΠΎΡΠ³ΠΎΠ²ΠΎΡ ΠΎΡ ΡΡΡΠ²ΡΡΠ°, ΠΎΡΠ³ΠΎΠ²ΠΎΡΡΡ ΡΠ΅ Π·Π°Π±Π°Π²Ρ - ΠΈ ΠΊΠΎΠ»Π°ΡΠ° ΠΏΠΎΠΏΠ°Π΄Π° Π² ΠΊΠ°ΡΠ°ΡΡΡΠΎΡΠ°.
ΠΠ΅ΠΊΠ° Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΡ Π½Π° redinessProbe, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° GET Π·Π°ΡΠ²ΠΊΠ° Π½Π° Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΄Π²Π΅ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ, Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π° GET Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΡΠ»Π΅Π΄ 5 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. Π€Π°ΠΉΠ»ΡΡ pod.yaml ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
apiVersion: v1
kind: Pod
metadata:
name: nodedelayed
spec:
containers:
- image: afakharany/node_delayed
name: nodedelayed
ports:
- containerPort: 3000
protocol: TCP
readinessProbe:
httpGet:
path: /
port: 3000
timeoutSeconds: 2
ΠΠ΅ΠΊΠ° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ ΠΏΠΎΠ΄ Ρ kubectl:
kubectl apply -f pod.yaml
ΠΠ΅ΠΊΠ° ΠΈΠ·ΡΠ°ΠΊΠ°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄ΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ readinessProbe:
kubectl describe pods nodedelayed
Π ΠΊΡΠ°Ρ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠ΅ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΡΠ±ΠΈΡΠΈΡΡΠ° ΡΠ° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, kubectl Π½Π΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΠΌΠΎΠ΄ΡΠ»Π°, ΠΊΠΎΠ³Π°ΡΠΎ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π΄Ρ Π²ΡΡΠ»ΠΈ 2 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ²Π° ΡΠΎΠΉ ΠΎΡΠΌΠ΅Π½ΠΈ ΠΈΡΠΊΠ°Π½Π΅ΡΠΎ. ΠΡ ΠΎΠ΄ΡΡΠΈΡΠ΅ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Ρ ΠΊΡΠΌ Π΄ΡΡΠ³ΠΈ ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ.
ΠΠΌΠ°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΡΠ΅Π³Π°, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ΄ΡΡ Π΅ ΡΠ°Π·ΡΠΎΠ²Π°ΡΠ΅Π½, kubectl ΠΎΡΠ½ΠΎΠ²ΠΎ Π½Π°ΡΠΎΡΠ²Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΠΊΡΠΌ Π½Π΅Π³ΠΎ: ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π½Π° GET Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π²Π΅ΡΠ΅ Π½Π΅ ΡΠ΅ Π·Π°Π±Π°Π²ΡΡ.
ΠΠ° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈΡΡ ΡΠ°ΠΉΠ» app.js:
var http = require('http');
var server = http.createServer(function(req, res) {
const sleep = (milliseconds) => {
return new Promise(resolve => setTimeout(resolve, milliseconds))
}
sleep(5000).then(() => {
res.writeHead(200, { "Content-type": "text/plain" });
res.end("Hellon");
})
});
server.listen(3000, function() {
console.log('Server is running at 3000')
})
TL; DR
ΠΡΠ΅Π΄ΠΈ ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° ΠΎΠ±Π»Π°ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π±ΡΡ
Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΠΈΠ·ΠΏΡΠ°Π²Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. ΠΡΠΌΠ°ΡΠ΅ ΠΎΠ±Π°ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ΅ΠΌΠ°Ρ ΠΊΠ°ΠΊΠ²ΠΈΡΠΎ ΠΈ Π΄Π° Π±ΠΈΠ»ΠΎ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΠ° Π²ΡΠ΅ ΠΎΡΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π΄Π½Π΅Ρ; ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΡΡΠ±ΡΠ°Π½ΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ΅Π½ΠΈ Π΄ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·Π²ΡΠ½ΡΠ΅Π΄Π½ΠΈ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΈ Π²Π·Π΅ΠΌΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΡ. [ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π±Π΅Π· ΠΎΠ±Π»Π°ΡΠ½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ monit, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΠΎ Ρ k8s ΡΡΠ°Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ :) β Π±Π΅Π»Π΅ΠΆΠΊΠ° Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°. ]
ΠΠ½Π΅Ρ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΏΠΎΡΡΠΈ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π²Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ΅ΡΠ½ΠΈ ΠΊΡΡΠΈΠΈ. ΠΠ΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π΄Π° ΠΏΡΠ°Π²ΡΡ Π·Π°ΡΠ²ΠΊΠΈ ΠΈ Π΄Π° ΡΡΠ±ΠΈΡΠ°Ρ ΡΠ΅Π½Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅Π°Π³ΠΈΡΠ°Ρ Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. Π’ΠΎΠ²Π° ΡΠ΅ Π½Π°ΡΠΈΡΠ° ΠΌΠΎΠ΄Π΅Π» Π½Π° Π΄ΠΈΠ·Π°ΠΉΠ½ Π½Π° ΡΠ΅ΡΡΠ° Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ»Π΅Π΄Π²Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° Π½Π° Π²ΠΈΡΠΎΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ (HOP).
Kubernetes ΠΏΡΠ΅Π΄Π»Π°Π³Π° 2 Π²ΠΈΠ΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π·Π΄ΡΠ°Π²Π΅ΡΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅: readinessProbe ΠΈ livenessProbe. Π Π΄Π²Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π΄Π½ΠΈ ΠΈ ΡΡΡΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ (HTTP GET Π·Π°ΡΠ²ΠΊΠΈ, TCP ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ). Π’Π΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π°Ρ ΠΏΠΎ ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²Π·Π΅ΠΌΠ°Ρ Π² ΠΎΡΠ³ΠΎΠ²ΠΎΡ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π² ΠΏΠΎΠ΄Ρ. livenessProbe ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ Π½Π°Π΄Π΅ΠΆΠ΄Π°ΡΠ°, ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°ΡΠ° Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠΈ, Π° readinessProbe ΠΈΠ·ΠΎΠ»ΠΈΡΠ° Π³ΡΡΠΏΠ°ΡΠ° ΠΎΡ Π²Ρ ΠΎΠ΄ΡΡ ΡΡΠ°ΡΠΈΠΊ, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π°.
ΠΡΠ°Π²ΠΈΠ»Π½ΠΈΡΡ Π΄ΠΈΠ·Π°ΠΉΠ½ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΊΠ»ΡΡΠ²Π° ΠΈ Π΄Π²Π°ΡΠ° ΡΠΈΠΏΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈ Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΡΠ΅ ΡΡΠ±ΠΈΡΠ°Ρ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π°Π½Π½ΠΈ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΊΠΎΠ³Π°ΡΠΎ Π΅ Ρ Π²ΡΡΠ»Π΅Π½ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. Π’ΠΎΠΉ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΊΠ°Π·Π²Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΡΠ°ΠΉΠ½ΠΈ ΡΠΎΡΠΊΠΈ Π½Π° API, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ (Prometheus) Π²Π°ΠΆΠ½ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π·Π° Π·Π΄ΡΠ°Π²Π΅ΡΠΎ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com