Β«Kubernetes ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ» Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² 10 Ρ€Π°Π·Β»: ΠΊΡ‚ΠΎ ΠΆΠ΅ Π² этом Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚?

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ, написанная Galo Navarro, Ρ‡Ρ‚ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΎΠ»ΠΆΠ½ΠΎΡΡ‚ΡŒ Principal Software Engineer Π² СвропСйской ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Adevinta, β€” ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈ ΠΏΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ «расслСдованиС» Π² области эксплуатации инфраструктуры. Π•Ρ‘ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Π°Π²Ρ‚ΠΎΡ€ Π² самом Π½Π°Ρ‡Π°Π»Π΅.

«Kubernetes ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ» Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² 10 Ρ€Π°Π·»: ΠΊΡ‚ΠΎ ΠΆΠ΅ Π² этом Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚?

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π°: ΠŸΠΎΡ…ΠΎΠΆΠ΅, эта публикация ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ»Π° Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС внимания, Ρ‡Π΅ΠΌ оТидалось. Π― Π΄ΠΎ сих ΠΏΠΎΡ€ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ Π³Π½Π΅Π²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΎΠΏΠ΅Ρ‡Π°Π»Π΅Π½Ρ‹. Π― понимаю ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ происходящСго, поэтому, нСсмотря Π½Π° риск ΡΠΎΡ€Π²Π°Ρ‚ΡŒ всю ΠΈΠ½Ρ‚Ρ€ΠΈΠ³Ρƒ, Ρ…ΠΎΡ‡Ρƒ сразу Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΎ Ρ‡Π΅ΠΌ эта ΡΡ‚Π°Ρ‚ΡŒΡ. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π° Kubernetes я наблюдаю Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ‰ΡŒ: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, рост Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ послС ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ), ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΎΠ±Π²ΠΈΠ½ΡΡŽΡ‚ Kubernetes, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ оказываСтся, Ρ‡Ρ‚ΠΎ оркСстратор, Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ, Π½Π΅ Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ повСствуСт ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… случаСв. Π•Π΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ повторяСт восклицаниС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°ΡˆΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² (ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Kubernetes Ρ‚ΡƒΡ‚ вовсС Π½ΠΈ ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ). Π’ Π½Π΅ΠΉ Π²Ρ‹ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€ΠΎΠ²Π΅Π½ΠΈΠΉ ΠΎ Kubernetes, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΏΠ°Ρ€Ρƒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΡƒΡ€ΠΎΠΊΠΎΠ² ΠΎ слоТных систСмах.

ΠŸΠ°Ρ€Ρƒ нСдСль Π½Π°Π·Π°Π΄ моя ΠΊΠΎΠΌΠ°Π½Π΄Π° занималась ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ микросСрвиса Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΡƒΡŽ CI/CD, Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ срСду Π½Π° основС Kubernetes, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ полСзности. ΠŸΠ΅Ρ€Π΅Π΅Π·Π΄ носил ΠΏΡ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€: ΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π²Π·ΡΡ‚ΡŒ Π΅Π³ΠΎ Π·Π° основу ΠΈ пСрСнСсти Π΅Ρ‰Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 150 сСрвисов Π² блиТайшиС мСсяцы. ВсС ΠΎΠ½ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· ΠΊΡ€ΡƒΠΏΠ½Π΅ΠΉΡˆΠΈΡ… ΠΎΠ½Π»Π°ΠΉΠ½-ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΎΠΊ Испании (Infojobs, Fotocasa ΠΈ Π΄Ρ€.).

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Kubernetes ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ Π½Π° Π½Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, нас ΠΏΠΎΠ΄ΠΆΠΈΠ΄Π°Π» Ρ‚Ρ€Π΅Π²ΠΎΠΆΠ½Ρ‹ΠΉ ΡΡŽΡ€ΠΏΡ€ΠΈΠ·. Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° (latency) запросов Π² Kubernetes Π±Ρ‹Π»Π° Π² 10 Ρ€Π°Π· Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Π² EC2. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈΠ±ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ микросСрвиса (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΡ‚ всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°).

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² Kubernetes Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Π² EC2?

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΡƒΠ·ΠΊΠΎΠ΅ мСсто, ΠΌΡ‹ собрали ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° всСм ΠΏΡƒΡ‚ΠΈ запроса. Наша Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° проста: API-шлюз (Zuul) проксируСт запросы ΠΊ экзСмплярам микросСрвиса Π² EC2 ΠΈΠ»ΠΈ Kubernetes. Π’ Kubernetes ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ NGINX Ingress Π‘ontroller, Π° бэкСнды ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° Deployment с JVM-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Spring.

                                  EC2
                            +---------------+
                            |  +---------+  |
                            |  |         |  |
                       +-------> BACKEND |  |
                       |    |  |         |  |
                       |    |  +---------+  |                   
                       |    +---------------+
             +------+  |
Public       |      |  |
      -------> ZUUL +--+
traffic      |      |  |              Kubernetes
             +------+  |    +-----------------------------+
                       |    |  +-------+      +---------+ |
                       |    |  |       |  xx  |         | |
                       +-------> NGINX +------> BACKEND | |
                            |  |       |  xx  |         | |
                            |  +-------+      +---------+ |
                            +-----------------------------+

Казалось, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана с Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ этапС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² бэкСндС (я ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠ» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ участок Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ ΠΊΠ°ΠΊ Β«Ρ…Ρ…Β»). Π’ EC2 ΠΎΡ‚Π²Π΅Ρ‚ прилоТСния Π·Π°Π½ΠΈΠΌΠ°Π» ΠΎΠΊΠΎΠ»ΠΎ 20 мс. Π’ Kubernetes Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° возрастала Π΄ΠΎ 100β€”200 мс.

ΠœΡ‹ быстро отбросили вСроятных ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π΅ΠΌΡ‹Ρ…, связанных со смСной срСды выполнСния. ВСрсия JVM ΠΎΡΡ‚Π°Π»Π°ΡΡŒ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»ΠΈ Π½ΠΈ ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… Π² EC2. Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°? Но ΠΌΡ‹ наблюдали высокиС Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ 1 запросС Π² сСкунду. ΠŸΠ°ΡƒΠ·Π°ΠΌΠΈ Π½Π° сборку мусора Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Ρ‡ΡŒ.

Один ΠΈΠ· Π½Π°ΡˆΠΈΡ… администраторов Kubernetes поинтСрСсовался, Π½Π΅Ρ‚ Π»ΠΈ Ρƒ прилоТСния Π²Π½Π΅ΡˆΠ½ΠΈΡ… зависимостСй, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ запросы ΠΊ DNS Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ схоТиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π“ΠΈΠΏΠΎΡ‚Π΅Π·Π° 1: Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ DNS

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎ Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π· обращаСтся ΠΊ экзСмпляру AWS Elasticsearch Π² Π΄ΠΎΠΌΠ΅Π½Π΅ Π²Ρ€ΠΎΠ΄Π΅ elastic.spain.adevinta.com. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Ρƒ нас имССтся shell, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ поиск Π΄ΠΎΠΌΠ΅Π½Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя.

DNS-запросы ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

[root@be-851c76f696-alf8z /]# while true; do dig "elastic.spain.adevinta.com" | grep time; sleep 2; done
;; Query time: 22 msec
;; Query time: 22 msec
;; Query time: 29 msec
;; Query time: 21 msec
;; Query time: 28 msec
;; Query time: 43 msec
;; Query time: 39 msec

АналогичныС запросы ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· экзСмпляров EC2, Π³Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

bash-4.4# while true; do dig "elastic.spain.adevinta.com" | grep time; sleep 2; done
;; Query time: 77 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec

Учитывая, Ρ‡Ρ‚ΠΎ поиск Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠΊΠΎΠ»ΠΎ 30 мс, стало ясно, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ DNS ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Elasticsearch Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вносит Π²ΠΊΠ»Π°Π΄ Π² возрастаниС Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ.

Однако это Π±Ρ‹Π»ΠΎ странно ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

  1. Π£ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ масса ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Kubernetes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с рСсурсами AWS, Π½ΠΎ Π½Π΅ ΡΡ‚Ρ€Π°Π΄Π°ΡŽΡ‚ ΠΎΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ. Какой Π±Ρ‹ Π½ΠΈ Π±Ρ‹Π»Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΊ этому ΡΠ»ΡƒΡ‡Π°ΡŽ.
  2. ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ JVM осущСствляСт in-memory-ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ DNS. Π’ Π½Π°ΡˆΠΈΡ… ΠΎΠ±Ρ€Π°Π·Π°Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TTL прописано Π² $JAVA_HOME/jre/lib/security/java.security ΠΈ установлСно Π½Π° 10 сСкунд: networkaddress.cache.ttl = 10. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, JVM Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС DNS-запросы Π½Π° 10 сСкунд.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π³ΠΈΠΏΠΎΡ‚Π΅Π·Ρƒ, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π° врСмя ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ DNS ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, исчСзнСт Π»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π‘ΠΏΠ΅Ρ€Π²Π° ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ ΡΠ²ΡΠ·Ρ‹Π²Π°Π»ΠΎΡΡŒ с Elasticsearch Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎ IP-адрСсу, Π° Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π°Π²ΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ развСртывания, поэтому ΠΌΡ‹ просто сопоставили Π΄ΠΎΠΌΠ΅Π½ с Π΅Π³ΠΎ IP-адрСсом Π² /etc/hosts:

34.55.5.111 elastic.spain.adevinta.com

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π» IP ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ, Π½ΠΎ ΠΌΡ‹ лишь слСгка ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΠ»ΠΈΡΡŒ ΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ. Π₯отя Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ DNS Π·Π°Π½ΠΈΠΌΠ°Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, настоящая ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΡƒΡΠΊΠΎΠ»ΡŒΠ·Π°Π»Π° ΠΎΡ‚ нас.

Диагностика с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСти

ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ tcpdump, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ происходит Π² сСти:

[root@be-851c76f696-alf8z /]# tcpdump -leni any -w capture.pcap

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ послали нСсколько запросов ΠΈ скачали ΠΈΡ… capture (kubectl cp my-service:/capture.pcap capture.pcap) для дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π° Π² Wireshark.

Π’ DNS-запросах Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ (ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ΅Π»ΠΎΡ‡ΠΈ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я расскаТу ΠΏΠΎΠ·ΠΆΠ΅). Но Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ странности Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ наш сСрвис ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π» ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚ capture’Π°, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ принятиС запроса Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΎΡ‚Π²Π΅Ρ‚Π°:

«Kubernetes ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ» Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² 10 Ρ€Π°Π·»: ΠΊΡ‚ΠΎ ΠΆΠ΅ Π² этом Π²ΠΈΠ½ΠΎΠ²Π°Ρ‚?

НомСра ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ столбцС. Для ясности я Π²Ρ‹Π΄Π΅Π»ΠΈΠ» Ρ†Π²Π΅Ρ‚ΠΎΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ TCP.

Π—Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с 328-Π³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ (172.17.22.150) установил TCP-соСдинСниС с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ (172.17.36.147). ПослС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ рукопоТатия (328-330), ΠΏΠ°ΠΊΠ΅Ρ‚ 331 принСс HTTP GET /v1/.. β€” входящий запрос ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ сСрвису. Π’Π΅ΡΡŒ процСсс занял 1 мс.

Π‘Π΅Ρ€Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ (с ΠΏΠ°ΠΊΠ΅Ρ‚Π° 339) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ наш сСрвис послал HTTP-запрос ΠΊ экзСмпляру Elasticsearch (TCP-Ρ€ΡƒΠΊΠΎΠΏΠΎΠΆΠ°Ρ‚ΠΈΠ΅ отсутствуСт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ΡΡ соСдинСниС). На это ΡƒΡˆΠ»ΠΎ 18 мс.

Пока всС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌ (20-30 мс ΠΏΡ€ΠΈ Π·Π°ΠΌΠ΅Ρ€Π°Ρ… с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°).

Однако синяя сСкция Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 86 мс. Π§Ρ‚ΠΎ Π² Π½Π΅ΠΉ происходит? Π‘ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ 333 наш сСрвис послал HTTP GET-запрос Π½Π° /latest/meta-data/iam/security-credentials, Π° сразу послС Π½Π΅Π³ΠΎ, ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ TCP-соСдинСнию, Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ GET-запрос Π½Π° /latest/meta-data/iam/security-credentials/arn:...

ΠœΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ это повторяСтся с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запросом Π²ΠΎ всСй трассировкС. Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ DNS Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡ΡƒΡ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π² Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… (объяснСниС этого Ρ„Π΅Π½ΠΎΠΌΠ΅Π½Π° вСсьма интСрСсно, Π½ΠΎ я ΠΏΡ€ΠΈΠ±Π΅Ρ€Π΅Π³Ρƒ Π΅Π³ΠΎ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ). Оказалось, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΡΠ²Π»ΡΡŽΡ‚ΡΡ обращСния ΠΊ сСрвису AWS Instance Metadata ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС.

Π“ΠΈΠΏΠΎΡ‚Π΅Π·Π° 2: лишниС обращСния ΠΊ AWS

Оба endpoint’Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ AWS Instance Metadata API. Наш микросСрвис ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот сСрвис Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Elasticsearch. Оба Π²Ρ‹Π·ΠΎΠ²Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ процСсса Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Endpoint, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ происходит ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запросС, Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ IAM, ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с экзСмпляром.

/ # curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
arn:aws:iam::<account_id>:role/some_role

Π’Ρ‚ΠΎΡ€ΠΎΠΉ запрос обращаСтся ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ endpoint’Ρƒ Π·Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ полномочиями для Π΄Π°Π½Π½ΠΎΠ³ΠΎ экзСмпляра:

/ # curl http://169.254.169.254/latest/meta-data/iam/security-credentials/arn:aws:iam::<account_id>:role/some_role`
{
    "Code" : "Success",
    "LastUpdated" : "2012-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2017-05-17T15:09:54Z"
}

ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌΠΈ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ нСбольшого ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ пСриодичСски Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ сСртификаты (Π΄ΠΎ ΠΈΡ… Expiration). МодСль проста: AWS ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Ρ‡Π°ΡΡ‚ΡƒΡŽ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΏΠΎ сообраТСниям бСзопасности, Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π½Π° нСсколько ΠΌΠΈΠ½ΡƒΡ‚, компСнсируя сниТСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, связанноС с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… сСртификатов.

AWS Java SDK Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π° сСбя Π²Π·ΡΡ‚ΡŒ обязанности ΠΏΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ этого Π½Π΅ происходит.

ΠŸΡ€ΠΎΠ²Π΅Π΄Ρ поиск ΠΏΠΎ issues Π½Π° GitHub, ΠΌΡ‹ Π½Π°Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ #1921. Она ΠΏΠΎΠΌΠΎΠ³Π»Π° Π½Π°ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ слСдуСт Β«ΠΊΠΎΠΏΠ°Ρ‚ΡŒΒ» дальшС.

AWS SDK обновляСт сСртификаты ΠΏΡ€ΠΈ наступлСнии ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условий:

  • Π‘Ρ€ΠΎΠΊ окончания ΠΈΡ… дСйствия (Expiration) ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² EXPIRATION_THRESHOLD, ТСстко установлСнный Π² ΠΊΠΎΠ΄Π΅ Π½Π° 15 ΠΌΠΈΠ½ΡƒΡ‚.
  • Π‘ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСй ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ сСртификаты ΠΏΡ€ΠΎΡˆΠ»ΠΎ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ REFRESH_THRESHOLD, Π·Π°’hardcode’Π΅Π½Π½Ρ‹ΠΉ Π½Π° 60 ΠΌΠΈΠ½ΡƒΡ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ фактичСский срок истСчСния ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… Π½Π°ΠΌΠΈ сСртификатов, ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ cURL-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ ΠΈΠ· экзСмпляра EC2. ВрСмя дСйствия сСртификата, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, оказалось Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΊΠΎΡ€ΠΎΡ‡Π΅: Ρ€ΠΎΠ²Π½ΠΎ 15 ΠΌΠΈΠ½ΡƒΡ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС стало ясно: для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запроса наш сСрвис ΠΏΠΎΠ»ΡƒΡ‡Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сСртификаты. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ срок ΠΈΡ… дСйствия Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π» 15 ΠΌΠΈΠ½ΡƒΡ‚, ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запросС AWS SDK Ρ€Π΅ΡˆΠ°Π» ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ…. И Ρ‚Π°ΠΊΠΎΠ΅ происходило с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запросом.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ срок дСйствия сСртификатов стал ΠΊΠΎΡ€ΠΎΡ‡Π΅?

БСрвис AWS Instance Metadata ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с экзСмплярами EC2, Π° Π½Π΅ Kubernetes. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π½Π°ΠΌ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ интСрфСйс ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Для этого ΠΌΡ‹ воспользовались KIAM β€” инструмСнтом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π³Π΅Π½Ρ‚ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ Kubernetes позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ (ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌ, Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ прилоТСния Π² кластСр) ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ IAM-Ρ€ΠΎΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌ Π² pod’Π°Ρ… Ρ‚Π°ΠΊ, словно ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ инстансами EC2. KIAM ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΊ сСрвису AWS Instance Metadata ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… ΠΈΠ· своСго кэша, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΎΡ‚ AWS. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния прилоТСния Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ мСняСтся.

KIAM поставляСт краткосрочныС сСртификаты pod’Π°ΠΌ. Π­Ρ‚ΠΎ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ, Ссли ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ срСдняя ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сущСствования pod’Π° мСньшС, Ρ‡Π΅ΠΌ экзСмпляра EC2. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ срок дСйствия сСртификатов Ρ€Π°Π²Π΅Π½ Ρ‚Π΅ΠΌ ΠΆΠ΅ 15 ΠΌΠΈΠ½ΡƒΡ‚Π°ΠΌ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅, Ссли Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΎΠ±Π° значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π°, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ сСртификат, прСдоставлСнный ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, истСкаСт Ρ‡Π΅Ρ€Π΅Π· 15 ΠΌΠΈΠ½ΡƒΡ‚. ΠŸΡ€ΠΈ этом AWS Java SDK ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ обновляСт любой сСртификат, Π΄ΠΎ срока окончания дСйствия ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ остаСтся ΠΌΠ΅Π½Π΅Π΅ 15 ΠΌΠΈΠ½ΡƒΡ‚.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ сСртификат ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ обновляСтся с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ запросом, Ρ‡Ρ‚ΠΎ Π²Π»Π΅Ρ‡Π΅Ρ‚ Π·Π° собой ΠΏΠ°Ρ€Ρƒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ API AWS ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ. Π’ AWS Java SDK ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ feature request, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ упоминаСтся аналогичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

РСшСниС оказалось простым. ΠœΡ‹ просто пСрСнастроили KIAM Π½Π° запрос сСртификатов с Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ сроком дСйствия. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, запросы стали ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π±Π΅Π· участия сСрвиса AWS Metadata, Π° Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΡƒΠΏΠ°Π»Π° Π΄Π°ΠΆΠ΅ Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, Ρ‡Π΅ΠΌ Π² EC2.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· нашСго ΠΎΠΏΡ‹Ρ‚Π° с миграциями ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ частых источников ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ β€” это Π½Π΅ ошибки Π² Kubernetes ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнтах ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ Π½Π΅ связан с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ изъянами Π² микросСрвисах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ пСрСносим. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ просто ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ соСдиняСм вмСстС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ элСмСнты.

ΠœΡ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡˆΠΈΠ²Π°Π΅ΠΌ слоТныС систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Ρ€Π°Π½Π΅Π΅ Π½Π΅ взаимодСйствовали Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ, оТидая, Ρ‡Ρ‚ΠΎ вмСстС ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Π΅Π΄ΠΈΠ½ΡƒΡŽ, Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½ΡƒΡŽ систСму. Π£Π²Ρ‹, Ρ‡Π΅ΠΌ большС элСмСнтов, Ρ‚Π΅ΠΌ большС простор для ошибок, Ρ‚Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ энтропия.

Π’ нашСм случаС высокая Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ Π±Ρ‹Π»Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ошибок ΠΈΠ»ΠΈ ΠΏΠ»ΠΎΡ…ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π² Kubernetes, KIAM, AWS Java SDK ΠΈΠ»ΠΈ нашСм микросСрвисС. Она стала ΠΈΡ‚ΠΎΠ³ΠΎΠΌ объСдинСния Π΄Π²ΡƒΡ… нСзависимых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π² KIAM, Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ β€” Π² AWS Java SDK. По ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΠΌΠ΅ΡŽΡ‚ смысл: ΠΈ активная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° обновлСния сСртификатов Π² AWS Java SDK, ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ срок дСйствия сСртификатов Π² KAIM. Но Ссли ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΡ… вмСстС, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ становятся нСпрСдсказуСмыми. Π”Π²Π° нСзависимых ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ вовсС Π½Π΅ обязаны ΠΈΠΌΠ΅Ρ‚ΡŒ смысл ΠΏΡ€ΠΈ объСдинСнии.

P.S. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π£Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ KIAM для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ AWS IAM с Kubernetes ΠΌΠΎΠΆΠ½ΠΎ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΡ‚ Π΅Ρ‘ создатСлСй.

А Π² нашСм Π±Π»ΠΎΠ³Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ