"Kubernetes pọ si lairi nipasẹ awọn akoko 10": tani o jẹbi fun eyi?

Akiyesi. itumọ.: Nkan yii, ti Galo Navarro kọ, ti o ni ipo ti Olukọni Software Engineer ni ile-iṣẹ European Adevinta, jẹ "iwadi" ti o fanimọra ati itọnisọna ni aaye awọn iṣẹ amayederun. Àkọlé ìpilẹ̀ṣẹ̀ rẹ̀ jẹ́ fífẹ̀ díẹ̀ nínú ìtúmọ̀ fún ìdí kan tí òǹkọ̀wé ṣàlàyé ní ìbẹ̀rẹ̀.

"Kubernetes pọ si lairi nipasẹ awọn akoko 10": tani o jẹbi fun eyi?

Akiyesi lati onkowe: O dabi ifiweranṣẹ yii ni ifojusi Elo siwaju sii akiyesi ju o ti ṣe yẹ. Mo ṣì máa ń bínú pé àkọlé àpilẹ̀kọ náà ń ṣini lọ́nà àti pé inú àwọn òǹkàwé kan bà jẹ́. Mo loye awọn idi fun ohun ti n ṣẹlẹ, nitorinaa, laibikita ewu ti iparun gbogbo intrigue, Mo fẹ lati sọ fun ọ lẹsẹkẹsẹ kini nkan yii jẹ nipa. Ohun iyanilenu ti Mo ti rii bi awọn ẹgbẹ ṣe ṣilọ si Kubernetes ni pe nigbakugba ti iṣoro kan ba dide (gẹgẹbi lairi ti o pọ si lẹhin iṣiwa), ohun akọkọ ti o jẹbi ni Kubernetes, ṣugbọn lẹhinna o han pe akọrin naa kii ṣe gaan si ìdálẹ́bi. Nkan yii sọ nipa iru ọran kan. Orukọ rẹ tun sọ asọye ti ọkan ninu awọn olupilẹṣẹ wa (nigbamii iwọ yoo rii pe Kubernetes ko ni nkankan lati ṣe pẹlu rẹ). Iwọ kii yoo rii eyikeyi awọn ifihan iyalẹnu nipa Kubernetes nibi, ṣugbọn o le nireti awọn ẹkọ ti o dara meji nipa awọn ọna ṣiṣe eka.

Ni ọsẹ meji sẹyin, ẹgbẹ mi n rin kiri iṣẹ microservice kan si ipilẹ ipilẹ kan ti o pẹlu CI/CD, akoko ṣiṣe orisun Kubernetes kan, awọn metiriki, ati awọn ire miiran. Gbigbe naa jẹ ti iseda idanwo: a gbero lati mu gẹgẹbi ipilẹ ati gbigbe awọn iṣẹ 150 diẹ sii ni awọn oṣu to n bọ. Gbogbo wọn ni o ni iduro fun iṣẹ diẹ ninu awọn iru ẹrọ ori ayelujara ti o tobi julọ ni Ilu Sipeeni (Infojobs, Fotocasa, bbl).

Lẹhin ti a ti gbe ohun elo naa lọ si Kubernetes ti a si darí diẹ ninu awọn ijabọ si rẹ, iyalẹnu iyalẹnu n duro de wa. Idaduro (lairi) Awọn ibeere ni Kubernetes jẹ awọn akoko 10 ti o ga ju ni EC2. Ni gbogbogbo, o jẹ dandan lati boya wa ojutu kan si iṣoro yii, tabi fi kọ ijira ti microservice (ati, o ṣee ṣe, gbogbo iṣẹ akanṣe).

Kini idi ti aipe pupọ ga julọ ni Kubernetes ju ni EC2?

Lati wa ọrun igo, a gba awọn metiriki ni ọna gbogbo ọna ibeere. Iṣagbekalẹ wa rọrun: ẹnu-ọna API (Zuul) awọn ibeere aṣoju si awọn apẹẹrẹ microservice ni EC2 tabi Kubernetes. Ni Kubernetes a lo NGINX Ingress Controller, ati awọn ẹhin jẹ awọn ohun elo lasan bi imuṣiṣẹ pẹlu ohun elo JVM lori orisun orisun omi.

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

Iṣoro naa dabi ẹni pe o ni ibatan si airi akọkọ ni ẹhin (Mo samisi agbegbe iṣoro naa lori aworan naa bi “xx”). Lori EC2, idahun ohun elo gba nipa 20ms. Ni Kubernetes, lairi naa pọ si 100-200 ms.

A yarayara yọ awọn afurasi ti o ṣeeṣe ti o ni ibatan si iyipada akoko asiko. JVM version si maa wa kanna. Awọn iṣoro apoti tun ko ni nkankan lati ṣe pẹlu rẹ: ohun elo ti nṣiṣẹ tẹlẹ ni aṣeyọri ninu awọn apoti lori EC2. Nkojọpọ? Ṣugbọn a ṣe akiyesi awọn latencies giga paapaa ni ibeere 1 fun iṣẹju kan. Awọn idaduro fun ikojọpọ idoti le tun jẹ igbagbe.

Ọkan ninu awọn alabojuto Kubernetes wa ṣe iyalẹnu boya ohun elo naa ni awọn igbẹkẹle ita nitori awọn ibeere DNS ti fa awọn ọran ti o jọra ni iṣaaju.

Itumọ 1: ipinnu orukọ DNS

Fun ibeere kọọkan, ohun elo wa wọle si apẹẹrẹ AWS Elasticsearch ọkan si igba mẹta ni agbegbe bii elastic.spain.adevinta.com. Inu awọn apoti wa ikarahun wa, nitorinaa a le ṣayẹwo boya wiwa fun agbegbe kan nitootọ gba akoko pipẹ.

Awọn ibeere DNS lati inu apoti:

[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

Awọn ibeere ti o jọra lati ọkan ninu awọn iṣẹlẹ EC2 nibiti ohun elo n ṣiṣẹ:

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

Ṣiyesi pe wiwa naa gba to 30ms, o han gbangba pe ipinnu DNS nigbati iraye si Elasticsearch n ṣe idasi nitootọ si ilosoke ninu lairi.

Sibẹsibẹ, eyi jẹ ajeji fun awọn idi meji:

  1. A ti ni pupọ ti awọn ohun elo Kubernetes ti o nlo pẹlu awọn orisun AWS laisi ijiya lati lairi giga. Ohunkohun ti idi, o jọmọ pataki si ọran yii.
  2. A mọ pe JVM ṣe ni iranti DNS caching. Ninu awọn aworan wa, iye TTL ti kọ sinu $JAVA_HOME/jre/lib/security/java.security ati ṣeto si iṣẹju-aaya 10: networkaddress.cache.ttl = 10. Ni awọn ọrọ miiran, JVM yẹ ki o kaṣe gbogbo awọn ibeere DNS fun awọn aaya 10.

Lati jẹrisi iṣeduro akọkọ, a pinnu lati da pipe DNS duro fun igba diẹ ati rii boya iṣoro naa lọ. Ni akọkọ, a pinnu lati tunto ohun elo naa ki o ba sọrọ taara pẹlu Elasticsearch nipasẹ adiresi IP, dipo nipasẹ orukọ ìkápá kan. Eyi yoo nilo awọn iyipada koodu ati imuṣiṣẹ tuntun, nitorinaa a kan ya aworan agbegbe naa si adiresi IP rẹ ninu /etc/hosts:

34.55.5.111 elastic.spain.adevinta.com

Bayi eiyan gba IP kan fere lesekese. Eyi yorisi ilọsiwaju diẹ, ṣugbọn a sunmọ diẹ si awọn ipele airotẹlẹ ti a nireti. Botilẹjẹpe ipinnu DNS gba akoko pipẹ, idi gidi tun yọ wa kuro.

Ayẹwo nipasẹ nẹtiwọki

A pinnu lati itupalẹ ijabọ lati eiyan lilo tcpdumplati wo kini gangan n ṣẹlẹ lori nẹtiwọọki:

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

Lẹhinna a firanṣẹ ọpọlọpọ awọn ibeere ati ṣe igbasilẹ igbasilẹ wọn (kubectl cp my-service:/capture.pcap capture.pcap) fun siwaju onínọmbà ni Wireshark.

Ko si ohun ifura nipa awọn ibeere DNS (ayafi fun ohun kekere kan ti Emi yoo sọrọ nipa nigbamii). Àmọ́ ọ̀nà tí iṣẹ́ ìsìn wa gbà ń bójú tó ọ̀kọ̀ọ̀kan ìbéèrè náà làwọn nǹkan kan wà. Ni isalẹ ni aworan sikirinifoto ti imudani ti n fihan ibeere ti a gba ṣaaju ki idahun naa bẹrẹ:

"Kubernetes pọ si lairi nipasẹ awọn akoko 10": tani o jẹbi fun eyi?

Awọn nọmba idii ti han ni iwe akọkọ. Fun wípé, Mo ti sọ awọ-se amin awọn ti o yatọ TCP ṣiṣan.

Awọn alawọ san ti o bere pẹlu soso 328 fihan bi awọn ose (172.17.22.150) mulẹ a TCP asopọ si awọn eiyan (172.17.36.147). Lẹhin imudani ibẹrẹ (328-330), package 331 mu HTTP GET /v1/.. - ibeere ti nwọle si iṣẹ wa. Gbogbo ilana gba 1 ms.

ṣiṣan grẹy (lati apo 339) fihan pe iṣẹ wa fi ibeere HTTP ranṣẹ si apẹẹrẹ Elasticsearch (ko si imuwọwọ TCP nitori pe o nlo asopọ ti o wa tẹlẹ). Eyi gba 18ms.

Nitorinaa ohun gbogbo dara, ati pe awọn akoko ni aijọju ni ibamu si awọn idaduro ti a nireti (20-30 ms nigbati wọn ṣe iwọn lati ọdọ alabara).

Sibẹsibẹ, apakan buluu gba 86ms. Kini o n ṣẹlẹ ninu rẹ? Pẹlu packet 333, iṣẹ wa fi ibeere HTTP GET ranṣẹ si /latest/meta-data/iam/security-credentials, ati lẹsẹkẹsẹ lẹhin rẹ, lori asopọ TCP kanna, ibeere GET miiran lati /latest/meta-data/iam/security-credentials/arn:...

A rii pe eyi tun ṣe pẹlu gbogbo ibeere jakejado itọpa naa. Ipinnu DNS jẹ looto diẹ diẹ ninu awọn apoti wa (alaye fun iṣẹlẹ yii jẹ ohun ti o dun, ṣugbọn Emi yoo fipamọ fun nkan lọtọ). O wa jade pe idi ti awọn idaduro gigun ni awọn ipe si iṣẹ AWS Apejuwe Metadata lori ibeere kọọkan.

Hypothesis 2: awọn ipe ti ko wulo si AWS

Mejeeji endpoints je ti AWS Apeere Metadata API. Microservice wa nlo iṣẹ yii lakoko ṣiṣe Elasticsearch. Awọn ipe mejeeji jẹ apakan ti ilana igbanilaaye ipilẹ. Oju-ipari ti o wọle si ibeere akọkọ n ṣalaye ipa IAM ti o ni nkan ṣe pẹlu apẹẹrẹ.

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

Ibeere keji beere aaye ipari keji fun awọn igbanilaaye igba diẹ fun apẹẹrẹ yii:

/ # 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"
}

Onibara le lo wọn fun igba diẹ ati pe o gbọdọ gba awọn iwe-ẹri tuntun lorekore (ṣaaju ki wọn to wa Expiration). Awoṣe naa rọrun: AWS n yi awọn bọtini igba diẹ nigbagbogbo fun awọn idi aabo, ṣugbọn awọn alabara le kaṣe wọn fun iṣẹju diẹ lati sanpada fun ijiya iṣẹ ṣiṣe ti o ni nkan ṣe pẹlu gbigba awọn iwe-ẹri tuntun.

AWS Java SDK yẹ ki o gba ojuse fun siseto ilana yii, ṣugbọn fun idi kan eyi ko ṣẹlẹ.

Lẹhin wiwa awọn ọran lori GitHub, a wa iṣoro kan #1921. Ó ràn wá lọ́wọ́ láti mọ ọ̀nà tí a ó fi “wà” síwájú sí i.

AWS SDK ṣe imudojuiwọn awọn iwe-ẹri nigbati ọkan ninu awọn ipo atẹle ba waye:

  • Ọjọ ipari (Expiration) Subu sinu EXPIRATION_THRESHOLD, lile-coded fun 15 iṣẹju.
  • Akoko diẹ sii ti kọja lati igba igbiyanju ikẹhin lati tunse awọn iwe-ẹri ju REFRESH_THRESHOLD, hardcoded fun 60 iṣẹju.

Lati wo ọjọ ipari gangan ti awọn iwe-ẹri ti a gba, a ran awọn aṣẹ cURL loke lati inu apoti mejeeji ati apẹẹrẹ EC2. Akoko ifọwọsi ti ijẹrisi ti o gba lati inu eiyan ti jade lati jẹ kukuru pupọ: iṣẹju 15 gangan.

Bayi ohun gbogbo ti di mimọ: fun ibeere akọkọ, iṣẹ wa gba awọn iwe-ẹri igba diẹ. Niwọn igba ti wọn ko wulo fun diẹ sii ju awọn iṣẹju 15, AWS SDK yoo pinnu lati ṣe imudojuiwọn wọn lori ibeere ti o tẹle. Ati pe eyi ṣẹlẹ pẹlu gbogbo ibeere.

Kini idi ti akoko ifọwọsi ti awọn iwe-ẹri di kukuru?

Metadata AWS Apejọ jẹ apẹrẹ lati ṣiṣẹ pẹlu awọn iṣẹlẹ EC2, kii ṣe Kubernetes. Ni apa keji, a ko fẹ yi wiwo ohun elo pada. Fun eyi a lo KIAM - ọpa kan ti o, lilo awọn aṣoju lori aaye Kubernetes kọọkan, ngbanilaaye awọn olumulo (awọn onise-ẹrọ ti nfi awọn ohun elo ranṣẹ si iṣupọ) lati fi awọn ipa IAM si awọn apoti ni awọn apoti bi ẹnipe wọn jẹ awọn iṣẹlẹ EC2. KIAM ṣe idiwọ awọn ipe si iṣẹ Metadata AWS Instance ati ṣiṣe wọn lati kaṣe rẹ, ti gba wọn tẹlẹ lati AWS. Lati oju wiwo ohun elo, ko si ohun ti o yipada.

KIAM n pese awọn iwe-ẹri igba kukuru si awọn adarọ-ese. Eyi jẹ oye ni imọran pe aropin igbesi aye ti podu kan kuru ju apẹẹrẹ EC2 lọ. Akoko ifọwọsi aiyipada fun awọn iwe-ẹri dogba si kanna 15 iṣẹju.

Bi abajade, ti o ba bo awọn iye aiyipada mejeeji lori ara wọn, iṣoro kan dide. Iwe-ẹri kọọkan ti a pese si ohun elo dopin lẹhin iṣẹju 15. Sibẹsibẹ, AWS Java SDK fi agbara mu isọdọtun ti eyikeyi ijẹrisi ti o kere ju iṣẹju 15 ti o ku ṣaaju ọjọ ipari rẹ.

Bi abajade, ijẹrisi igba diẹ ni a fi agbara mu lati tunse pẹlu ibeere kọọkan, eyiti o kan awọn ipe meji si API AWS ati pe o fa ilosoke pataki ni lairi. Ni AWS Java SDK a ri ẹya beere, eyi ti o mẹnuba iru iṣoro kan.

Ojutu naa yipada lati rọrun. A nìkan tunto KIAM lati beere awọn iwe-ẹri pẹlu akoko wiwulo to gun. Ni kete ti eyi ba ṣẹlẹ, awọn ibeere bẹrẹ si ṣiṣan laisi ikopa ti iṣẹ Metadata AWS, ati pe lairi lọ silẹ si awọn ipele kekere paapaa ni EC2.

awari

Da lori iriri wa pẹlu awọn iṣiwa, ọkan ninu awọn orisun ti o wọpọ julọ ti awọn iṣoro kii ṣe awọn idun ni Kubernetes tabi awọn eroja miiran ti pẹpẹ. Ko tun koju awọn abawọn ipilẹ eyikeyi ninu awọn iṣẹ microservices ti a n gbe. Awọn iṣoro nigbagbogbo dide nitori a fi awọn eroja oriṣiriṣi papọ.

A dapọ awọn ọna ṣiṣe idiju ti ko ti ni ibaraenisepo pẹlu ara wa tẹlẹ, nireti pe papọ wọn yoo ṣe eto ẹyọ kan, ti o tobi julọ. Alas, awọn eroja diẹ sii, yara diẹ sii fun awọn aṣiṣe, ti o ga julọ entropy.

Ninu ọran wa, lairi giga kii ṣe abajade ti awọn idun tabi awọn ipinnu buburu ni Kubernetes, KIAM, AWS Java SDK, tabi microservice wa. O jẹ abajade ti apapọ awọn eto aiyipada ominira meji: ọkan ni KIAM, ekeji ni AWS Java SDK. Mu ni lọtọ, awọn paramita mejeeji jẹ oye: ilana isọdọtun ijẹrisi ti nṣiṣe lọwọ ni AWS Java SDK, ati akoko ifọwọsi kukuru ti awọn iwe-ẹri ni KAIM. Ṣugbọn nigbati o ba fi wọn papọ, awọn abajade yoo di airotẹlẹ. Awọn ojutu olominira meji ati ọgbọn ko ni lati ni oye nigbati a ba papọ.

PS lati onitumọ

O le kọ ẹkọ diẹ sii nipa faaji ti ohun elo KIAM fun iṣọpọ AWS IAM pẹlu Kubernetes ni Arokọ yi lati awọn oniwe-Eleda.

Tun ka lori bulọọgi wa:

orisun: www.habr.com

Fi ọrọìwòye kun