"Kubernetes e eketsehile latency ka makhetlo a 10": ke mang ea molato ka see?

Hlokomela. fetolela.: Sehlooho sena, se ngotsoeng ke Galo Navarro, ea nang le boemo ba Principal Software Engineer k'hamphaning ea Europe ea Adevinta, ke "lipatlisiso" tse tsotehang le tse rutang lefapheng la ts'ebetso ea mekhoa ea motheo. Sehlooho sa eona sa pele se ile sa atolosoa hanyenyane phetolelong ka lebaka leo mongoli a le hlalosang qalong.

"Kubernetes e eketsehile latency ka makhetlo a 10": ke mang ea molato ka see?

Ela hloko ho tsoa ho mongoli: E shebahala joalo ka poso ena hohela tlhokomelo e ngata hofeta kamoo ho neng ho lebelletsoe. Ke ntse ke utloa mantsoe a halefileng a hore sehlooho sa sehlooho sena se khelosa le hore babali ba bang ba hloname. Ke utloisisa mabaka a se etsahalang, ka hona, ho sa tsotellehe kotsi ea ho senya bolotsana bohle, ke batla ho u bolella hang-hang hore na sehlooho sena se bua ka eng. Ntho e makatsang eo ke e boneng ha lihlopha li fallela Kubernetes ke hore neng kapa neng ha bothata bo hlaha (joalo ka ho eketseha ha latency ka mor'a ho falla), ntho ea pele e qosoang ke Kubernetes, empa joale ho hlaha hore sebini ha se hantle. molato. Sengoliloeng sena se bua ka nyeoe e 'ngoe e joalo. Lebitso la eona le pheta polelo ea e mong oa bahlahisi ba rona (hamorao u tla bona hore Kubernetes ha e amane le eona). U ke ke ua fumana tšenolo efe kapa efe e makatsang ka Kubernetes mona, empa u ka lebella lithuto tse 'maloa tse ntle mabapi le litsamaiso tse rarahaneng.

Libekeng tse 'maloa tse fetileng, sehlopha sa ka se ne se fallisetsa microservice e le' ngoe sethaleng sa mantlha se neng se kenyelletsa CI / CD, nako ea ho sebetsa e thehiloeng ho Kubernetes, metrics, le lintho tse ling tse ntle. Ho falla e ne e le teko: re rerile ho e nka e le motheo le ho fetisetsa litšebeletso tse ling tse ka bang 150 likhoeling tse tlang. Kaofela ha bona ba ikarabella bakeng sa ts'ebetso ea li-platform tse kholo ka ho fetisisa tsa marang-rang Spain (Infojobs, Fotocasa, joalo-joalo).

Kamora hore re romelle kopo ho Kubernetes le ho khutlisetsa sephethephethe ho eona, re ne re letetsoe ke ntho e makatsang. tieho (boikutlo) likopo ho Kubernetes li ne li phahame ka makhetlo a 10 ho feta EC2. Ka kakaretso, ho ne ho hlokahala ho fumana tharollo bothateng bona, kapa ho tlohela ho falla ha microservice (le, mohlomong, morero oohle).

Hobaneng ha latency e phahame haholo Kubernetes ho feta EC2?

Ho fumana botlolo, re ile ra bokella metrics tseleng eohle ea kopo. Meaho ea rona e bonolo: li-proxies tsa API (Zuul) li kopa liketsahalo tsa microservice ho EC2 kapa Kubernetes. Ho Kubernetes re sebelisa NGINX Ingress Controller, 'me li-backends ke lintho tse tloaelehileng tse kang dulang ka kopo ea JVM sethaleng sa Selemo.

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

Bothata bo ne bo bonahala bo amana le latency ea pele ka morao (ke tšoaile sebaka sa bothata kerafong e le "xx"). Ho EC2, karabo ea kopo e nkile hoo e ka bang 20ms. Kubernetes, latency e ile ea eketseha ho 100-200 ms.

Ka potlako re ile ra leleka lipelaelo tse neng li ka etsahala tse amanang le phetoho ea nako ea ho sebetsa. Mofuta oa JVM o ntse o tšoana. Mathata a Containerization le ona a ne a se na letho le amanang le ona: ts'ebeliso e ne e se e ntse e sebetsa ka katleho ka har'a lijana ho EC2. Loading? Empa re hlokometse ho lieha ho hoholo esita le ka kopo e le 1 motsotsoana. Likhefutso tsa ho bokella lithōle le tsona li ka hlokomolohuoa.

E mong oa li-admin tsa rona tsa Kubernetes o ile a ipotsa hore na ts'ebeliso e na le litšepiso tsa kantle hobane lipotso tsa DNS li bakile litaba tse tšoanang nakong e fetileng.

Khopolo-taba ea 1: Qeto ea lebitso la DNS

Bakeng sa kopo e 'ngoe le e' ngoe, kopo ea rona e fihlella mohlala oa AWS Elasticsearch ho isa ho makhetlo a mararo sebakeng se joalo elastic.spain.adevinta.com. Ka har'a lijana tsa rona ho na le khetla, kahoo re ka hlahloba hore na ho batla sebaka sa marang-rang ho nka nako e telele.

Dipotso tsa DNS ho tswa ho setshelo:

[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

Likopo tse ts'oanang ho tsoa ho e 'ngoe ea maemo a EC2 moo kopo e sebetsang:

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

Ha ho nahanoa hore ho batla ho nkile hoo e ka bang 30ms, ho ile ha hlaka hore qeto ea DNS ha o fihlella Elasticsearch e hlile e tlatsetsa keketsehong ea latency.

Leha ho le joalo, sena se ne se makatsa ka mabaka a mabeli:

  1. Re se re ntse re e-na le lithane tsa lits'ebetso tsa Kubernetes tse sebelisanang le lisebelisoa tsa AWS ntle le ho ba le latency e phahameng. Ho sa tsotellehe hore na lebaka ke lefe, e amana ka ho khetheha le nyeoe ena.
  2. Rea tseba hore JVM e etsa caching ea memori ea DNS. Litšoantšong tsa rona, boleng ba TTL bo ngotsoe ho $JAVA_HOME/jre/lib/security/java.security 'me u behe metsotsoana e 10: networkaddress.cache.ttl = 10. Ka mantsoe a mang, JVM e lokela ho boloka lipotso tsohle tsa DNS metsotsoana e 10.

Ho tiisa khopolo-taba ea pele, re ile ra etsa qeto ea ho khaotsa ho letsetsa DNS nakoana 'me re bone hore na bothata bo ile ba fela. Taba ea pele, re nkile qeto ea ho hlophisa sesebelisoa hape hore se buisane ka kotloloho le Elasticsearch ka aterese ea IP, eseng ka lebitso la domain. Sena se ka hloka liphetoho tsa khoutu le phepelo e ncha, kahoo re ile ra etsa 'mapa oa sebaka ho aterese ea eona ea IP /etc/hosts:

34.55.5.111 elastic.spain.adevinta.com

Hona joale setshelo se fumane IP hoo e ka bang hang-hang. Sena se ile sa fella ka ntlafatso e itseng, empa re ne re le haufi hanyenyane feela le maemo a lebeletsoeng a latency. Leha qeto ea DNS e nkile nako e telele, lebaka la 'nete le ne le ntse le sa re tsebe.

Diagnostics ka marangrang

Re ile ra etsa qeto ea ho hlahloba sephethephethe ho tloha setshelo ho sebelisa tcpdumpho bona se etsahalang marang-rang:

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

Ka mor'a moo re ile ra romela likopo tse 'maloa' me ra khoasolla ho hapa ha bona (kubectl cp my-service:/capture.pcap capture.pcap) bakeng sa tlhahlobo e eketsehileng ho Wireshark.

Ho ne ho se letho le belaetsang ka lipotso tsa DNS (ntle le ntho e le 'ngoe e nyane eo ke tla bua ka eona hamorao). Empa ho ne ho e-na le lintho tse sa tloaelehang tseleng eo tšebeletso ea rōna e neng e sebetsana le kōpo ka ’ngoe. Ka tlase ke setšoantšo sa skrini se bonts'ang kopo e amoheloang pele karabo e qala:

"Kubernetes e eketsehile latency ka makhetlo a 10": ke mang ea molato ka see?

Linomoro tsa sephutheloana li bonts'itsoe kholomong ea pele. Bakeng sa ho hlaka, ke kentse mebala e fapaneng ea melapo ea TCP.

Molapo o motala o qalang ka pakete ea 328 o bontša kamoo mofani (172.17.22.150) a thehileng khokahanyo ea TCP ho setshelo (172.17.36.147). Kamora ho ts'oarana ka letsoho ha pele (328-330), sephutheloana sa 331 se tlisitsoe HTTP GET /v1/.. — kopo e kenang tshebeletsong ya rona. Ts'ebetso eohle e nkile 1 ms.

The grey stream (ho tloha paketeng ea 339) e bonts'a hore ts'ebeletso ea rona e rometse kopo ea HTTP ho mohlala oa Elasticsearch (ha ho na ho ts'oarana ka letsoho TCP hobane e sebelisa khokahano e teng). Sena se nkile 18ms.

Ho fihlela joale ntho e 'ngoe le e' ngoe e lokile, 'me linako li batla li lumellana le tieho e lebelletsoeng (20-30 ms ha e lekantsoe ho tsoa ho moreki).

Leha ho le joalo, karolo e putsoa e nka 86ms. Ho etsahalang ho yona? Ka pakete 333, tšebeletso ea rona e rometse kopo ea HTTP GET ho /latest/meta-data/iam/security-credentials, 'me hang ka mor'a eona, holim'a khokahanyo e tšoanang ea TCP, kopo e' ngoe ea GET ho /latest/meta-data/iam/security-credentials/arn:...

Re fumane hore sena se phetoa ka kopo e 'ngoe le e' ngoe ho latela mohlala. Qeto ea DNS ehlile e ea butle butle ka har'a lijana tsa rona (tlhaloso ea ketsahalo ena e khahla haholo, empa ke tla e boloka bakeng sa sengoloa se arohaneng). Ho ile ha fumaneha hore sesosa sa tieho e telele e ne e le mehala ho tšebeletso ea Metadata ea AWS Instance ka kopo e 'ngoe le e 'ngoe.

Khopolo-taba ea 2: mehala e sa hlokahaleng ho AWS

Liqeto ka bobeli ke tsa AWS Instance Metadata API. Microservice ea rona e sebelisa ts'ebeletso ena ha e ntse e tsamaisa Elasticsearch. Mehala ka bobeli ke karolo ea ts'ebetso ea mantlha ea tumello. Qetello e fihlellehang kopong ea pele e fana ka karolo ea IAM e amanang le mohlala.

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

Kopo ea bobeli e kopa pheletso ea bobeli bakeng sa litumello tsa nakoana bakeng sa ketsahalo ena:

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

Moreki a ka li sebelisa ka nako e khuts'oane mme o tlameha ho fumana litifikeiti tse ncha nako le nako (pele li ba teng Expiration). Mohlala o bonolo: AWS e potoloha linotlolo tsa nakoana khafetsa ka mabaka a ts'ireletso, empa bareki ba ka li boloka metsotso e seng mekae ho lefella kotlo ea ts'ebetso e amanang le ho fumana mangolo a macha.

AWS Java SDK e lokela ho nka boikarabelo ba ho hlophisa ts'ebetso ena, empa ka mabaka a itseng sena ha se etsahale.

Kamora ho batla litaba ho GitHub, re ile ra kopana le bothata #1921. O ile a re thusa hore re tsebe hore na re “epa” ka tsela efe ho ea pele.

AWS SDK e ntlafatsa setifikeiti ha e 'ngoe ea maemo a latelang e etsahala:

  • Letsatsi la pheletso (Expiration) Oele ho EXPIRATION_THRESHOLD, hardcoded ho metsotso e 15.
  • Ho se ho fetile nako e ngata ho tloha tekong ea ho qetela ea ho nchafatsa litifikeiti ho feta REFRESH_THRESHOLD, e ngotsoe ka thata metsotso e 60.

Ho bona letsatsi la ho felloa ke nako ha litifikeiti tseo re li fumanang, re tsamaisitse litaelo tse kaholimo tsa cURL ho tsoa ho sets'oants'o le mohlala oa EC2. Nako ea ho nepahala ea setifikeiti se amohetsoeng ho tsoa setshelong e bile khuts'oane haholo: metsotso e 15 hantle.

Hona joale ntho e 'ngoe le e' ngoe e hlakile: bakeng sa kopo ea pele, tšebeletso ea rona e fumane mangolo a nakoana. Kaha li ne li sa sebetse nako e fetang metsotso e 15, AWS SDK e ne e tla etsa qeto ea ho li nchafatsa ka kopo e latelang. Mme sena se etsahetse ka kopo e nngwe le e nngwe.

Ke hobane'ng ha nako ea ho sebetsa ha setifikeiti e se e le khuts'oane?

AWS Instance Metadata e etselitsoe ho sebetsa le maemo a EC2, eseng Kubernetes. Ka lehlakoreng le leng, re ne re sa batle ho fetola sebopeho sa kopo. Bakeng sa sena re ne re sebelisa KIAM - sesebelisoa seo, ho sebelisa baemeli sebakeng se seng le se seng sa Kubernetes, se lumellang basebelisi (baenjiniere ba tsamaisang likopo ho sehlopha) ho abela likarolo tsa IAM ho lijana tse ka har'a li-pods joalokaha eka ke liketsahalo tsa EC2. KIAM e thibela mehala ho ts'ebeletso ea AWS Instance Metadata mme e e sebelisa ho tsoa ho cache ea eona, kaha e ne e kile ea e amohela ho tsoa ho AWS. Ho latela pono ea ts'ebeliso, ha ho letho le fetohang.

KIAM e fana ka litifikeiti tsa nako e khuts'oane ho li-pods. Sena sea utloahala ha ho nahanoa hore nako e tloaelehileng ea bophelo ba pod e khuts'oane ho feta ea mohlala oa EC2. Nako ea kamehla ea ho netefatsa litifikeiti e lekanang le metsotso e 15 e tšoanang.

Ka lebaka leo, haeba u koahela litekanyetso tse peli tsa kamehla holim'a tse ling, bothata bo hlaha. Setifikeiti se seng le se seng se fanoeng ho kopo se fela kamora metsotso e 15. Leha ho le joalo, AWS Java SDK e qobella ho nchafatsa setifikeiti leha e le sefe se setseng metsotso e ka tlase ho 15 pele ho letsatsi la ho felloa ke nako.

Ka lebaka leo, setifikeiti sa nakoana se qobelloa ho nchafatsoa ka kopo e 'ngoe le e' ngoe, e kenyelletsang mehala e 'maloa ho AWS API mme e baka keketseho e kholo ea latency. Ho AWS Java SDK re fumane kopo ea tšobotsi, e buang ka bothata bo tšoanang.

Tharollo e ile ea e-ba bonolo. Re sa tsoa hlophisa KIAM ho kopa litifikeiti tse nang le nako e telele ea ho netefatsa. Hang ha sena se etsahala, likōpo li ile tsa qala ho phalla ntle le ho kenya letsoho ha tšebeletso ea Metadata ea AWS, 'me latency e ile ea theohela maemong a tlaase ho feta a EC2.

fumanoeng ke

Ho ipapisitsoe le boiphihlelo ba rona ba ho falla, e 'ngoe ea mehloli e atileng haholo ea mathata ha se litšitšili ho Kubernetes kapa likarolo tse ling tsa sethala. Hape ha e rarolle liphoso tsa mantlha ho li-microservices tseo re li tsamaisang. Hangata mathata a hlaha hobane feela re kopanya likarolo tse fapaneng.

Re kopanya hammoho mekhoa e rarahaneng e e-s'o ka e sebelisana le e mong pele, re lebeletse hore hammoho ba tla theha tsamaiso e le 'ngoe, e kholoanyane. Oho, likarolo tse ngata, ho na le sebaka se eketsehileng sa liphoso, ho eketsa entropy.

Tabeng ea rona, latency e phahameng e ne e se ka lebaka la likokoana-hloko kapa liqeto tse mpe ho Kubernetes, KIAM, AWS Java SDK, kapa microservice ea rona. E bile phello ea ho kopanya litlhophiso tse peli tse ikemetseng tse ikemetseng: e 'ngoe e le KIAM, e' ngoe ho AWS Java SDK. Ha li nkuoa ka thoko, liparamente ka bobeli lia utloahala: leano le sebetsang la nchafatso ea setifikeiti ho AWS Java SDK, le nako e khuts'oane ea setifikeiti ho KAIM. Empa ha u li kopanya, liphello e ba tse sa lebelloang. Litharollo tse peli tse ikemetseng le tse utloahalang ha lia lokela ho utloahala ha li kopantsoe.

PS ho tsoa ho mofetoleli

U ka ithuta ho eketsehileng ka meralo ea ts'ebeliso ea KIAM ea ho kopanya AWS IAM le Kubernetes ho sehlooho sena ho tsoa ho baetsi ba eona.

Hape bala ho blog ea rona:

Source: www.habr.com

Eketsa ka tlhaloso