"Ko nga Kubernetes i piki ake i te 10 nga wa": ko wai te he mo tenei?

Tuhipoka. whakamaori.: Ko tenei tuhinga, i tuhia e Galo Navarro, e mau ana i te turanga o te Tumuaki Pūmanawa Engineer i te kamupene Pakeha Adevinta, he "tirotiro" whakamiharo me te ako i roto i te waahi o nga mahi hanganga. Ko tana taitara taketake i paku whakaroahia i roto i te whakamaoritanga mo te take i whakamaramatia e te kaituhi i te timatanga.

"Ko nga Kubernetes i piki ake i te 10 nga wa": ko wai te he mo tenei?

Panui mai i te kaituhi: Ko te ahua o tenei panui kukume nui atu te aro atu i te mea i tumanakohia. Kei te pukuriri tonu nga korero kei te pohehe te taitara o te tuhinga, kei te pouri etahi o nga kaipānui. Kei te mohio ahau ki nga take o nga mea e pa ana, na reira, ahakoa te kino o te whakakino i te katoa o nga mahi, e hiahia ana ahau ki te korero wawe ki a koe he aha tenei tuhinga. Ko tetahi mea whakamiharo i kite ahau i te hekenga o nga kapa ki Kubernetes ko nga wa ka puta mai he raru (penei i te pikinga o te roa i muri i te hekenga), ko te mea tuatahi ka whakahengia ko Kubernetes, engari ka puta ko te kaitoi kaore i te tino ki whakahenga. Ka korero tenei tuhinga mo tetahi keehi penei. Ko tona ingoa ka whakahoki ano i te tangi a tetahi o a maatau kaiwhakawhanake (i muri mai ka kite koe kaore he mahi a Kubernetes). Kare koe e kite i nga whakakitenga miharo mo Kubernetes i konei, engari ka taea e koe te tumanako kia rua nga akoranga pai mo nga punaha uaua.

I nga wiki e rua kua pahure ake nei, kei te heke taku roopu i tetahi ratonga moroiti kotahi ki tetahi papaaapapa matua kei roto ko CI/CD, he wa whakahaere a Kubernetes, ine, me etahi atu pai. He ahua whakamatautau te nekehanga: i whakaaro matou ki te tango hei turanga me te whakawhiti tata ki te 150 atu ratonga hei nga marama e haere ake nei. Ko ratou katoa te kawenga mo te whakahaere i etahi o nga papaahi ipurangi nui rawa atu i Spain (Infojobs, Fotocasa, etc.).

Whai muri i to tuku tono ki a Kubernetes me te tuku ano i etahi waka ki reira, he ohorere ohorere kei te tatari mai. Whakaroa (tereo) Ko nga tono i Kubernetes he 10 nga wa teitei ake i te EC2. I te nuinga o te waa, me rapu he otinga mo tenei raru, me whakarere ranei te hekenga o te microservice (me, pea, te kaupapa katoa).

He aha te mea he nui ake te torohūtanga o Kubernetes i te EC2?

Ki te kimi i te pounamu, i kohia e matou nga inenga i te ara tono katoa. He ngawari to maatau hoahoanga: he kuaha API (Zuul) ka tono takawaenga ki nga tauira moroiti i EC2, Kubernetes ranei. I roto i nga Kubernetes ka whakamahia e matou NGINX Ingress Controller, a ko nga pito o muri he mea noa penei whakamahinga me te tono JVM i runga i te papaahi Spring.

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

Ko te ahua o te raruraru i pa ki te torohūtanga tuatahi i te tuara (i tohu ahau i te waahi raruraru i te kauwhata hei "xx"). I runga i te EC2, ko te whakautu tono mo te 20ms. I roto i nga Kubernetes, ka piki ake te roa ki te 100-200 ms.

I tukuna tere e matou nga whakapae e pa ana ki te huringa o te wa whakahaere. He rite tonu te putanga JVM. Ko nga raruraru whakaurunga karekau he take: kua pai te whakahaere o te tono ki roto i nga ipu kei runga EC2. Uta ana? Engari i kite matou i nga waahi teitei ahakoa i te 1 tono mo ia hekona. Ka warewarehia ano nga okiokinga mo te kohikohi para.

I whakaaro tetahi o o matou kaiwhakahaere Kubernetes mena he whakawhirinakitanga o waho te tono na te mea he rite nga take i puta mai i nga patai DNS i mua.

Whakaaro 1: Whakatau ingoa DNS

Mo ia tono, ka uru ta maatau tono ki tetahi tauira AWS Elasticsearch kotahi ki te toru nga wa i roto i te rohe penei elastic.spain.adevinta.com. Kei roto i a maatau ipu he anga, kia taea ai e tatou te tirotiro mena he roa te rapu rohe.

Uiui DNS mai i ipu:

[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

He rite nga tono mai i tetahi o nga tauira EC2 kei te whakahaerehia te tono:

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

Ki te whakaaro he 30ms te roa o te tirotiro, kua marama ko te whakataunga DNS i te wa e uru atu ana ki a Elasticsearch i tino whai hua ki te pikinga o te torohūtanga.

Heoi, he rereke tenei mo nga take e rua:

  1. He maha nga tono Kubernetes kei a maatau e mahi tahi ana me nga rauemi AWS me te kore e mate i te roanga teitei. Ahakoa te take, e pa ana ki tenei keehi.
  2. E mohio ana matou kei te mahi te JVM i te keteroki DNS i roto i te mahara. I a maatau whakaahua, kua tuhia te uara TTL ki roto $JAVA_HOME/jre/lib/security/java.security ka tautuhi ki te 10 hēkona: networkaddress.cache.ttl = 10. I etahi atu kupu, me huna e te JVM nga patai DNS katoa mo te 10 hēkona.

Hei whakaū i te whakapae tuatahi, i whakatau matou kia mutu te waea ki a DNS mo tetahi wa ka kite mena kua ngaro te raru. Tuatahi, i whakatau matou ki te whirihora ano i te tono kia korero tika ki a Elasticsearch ma te wahitau IP, kaua ma te ingoa rohe. Me whakarereke te waehere me te whakatakotoranga hou, no reira ka mapi noa matou i te rohe ki tona wahitau IP /etc/hosts:

34.55.5.111 elastic.spain.adevinta.com

Inaianei kua whiwhi te ipu i te IP tata tonu. I hua ake he whakapai ake, engari he paku tata atu matou ki nga taumata taima e tumanakohia ana. Ahakoa he wa roa te whakataunga DNS, kare tonu te tino take i a maatau.

Nga tātaritanga ma te whatunga

I whakatau matou ki te tātari i nga waka mai i te ipu ma te whakamahi tcpdumpkia kite he aha te mea e tupu ana i runga i te whatunga:

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

Ka tukuna e matou etahi tono me te tango i ta raatau hopu (kubectl cp my-service:/capture.pcap capture.pcap) mo etahi atu tātaritanga i roto Wireshark.

Karekau he mea ohorere mo nga patai DNS (haunga tetahi mea iti ka korerohia e au i muri mai). Te vai ra râ te tahi mau huru taa ê i roto i ta matou taviniraa i te raveraa i te mau aniraa tataitahi. Kei raro nei te whakaahua o te hopu e whakaatu ana i te tono kua whakaaetia i mua i te tiimata o te whakautu:

"Ko nga Kubernetes i piki ake i te 10 nga wa": ko wai te he mo tenei?

Ka whakaatuhia nga nama mokete ki te pou tuatahi. Mo te whakamarama, kua tohuhia e au nga momo awa TCP rereke.

Ko te awa kaakaariki timata mai i te paatete 328 e whakaatu ana i te mahi a te kiritaki (172.17.22.150) i te hononga TCP ki te ipu (172.17.36.147). Whai muri i te ruru ringa tuatahi (328-330), ka mauria mai te kete 331 HTTP GET /v1/.. — he tono taumai ki ta maatau ratonga. Ko te tukanga katoa i 1 ms.

Ko te awa hina (mai i te paatete 339) e whakaatu ana i tukuna e ta maatau ratonga he tono HTTP ki te tauira Elasticsearch (kare he ruru a TCP na te mea kei te whakamahi hononga o naianei). 18ms tenei.

I tenei wa kei te pai nga mea katoa, me nga wa e rite ana ki nga wa roa (20-30 ms ka inehia mai i te kiritaki).

Heoi, ko te wahanga kahurangi e 86ms. He aha te mahi i roto? Ma te putea 333, i tukuna e ta maatau ratonga he tono HTTP GET ki /latest/meta-data/iam/security-credentials, a, i muri tonu mai, i runga i te hononga TCP kotahi, tetahi atu tono GET ki /latest/meta-data/iam/security-credentials/arn:...

I kitea e matou kua hoki ano tenei ki nga tono katoa puta noa i te tohu. He tino puhoi ake te whakatau DNS i roto i a maatau ipu (he tino rawe te whakamaramatanga mo tenei ahuatanga, engari ka penapenahia e au mo tetahi tuhinga motuhake). I puta ko te take o te roa o te roa ko nga waea ki te ratonga AWS Instance Metadata mo ia tono.

Whakaaro 2: nga waea koretake ki AWS

No nga pito mutunga e rua AWS Instance Metadata API. Ka whakamahia e ta maatau ratonga miihini tenei ratonga i te wa e whakahaere ana a Elasticsearch. Ko nga waea e rua he waahanga o te tukanga whakamanatanga taketake. Ko te pito mutunga ka uru atu ki te tono tuatahi ka puta te mahi IAM e hono ana ki te tauira.

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

Ko te tono tuarua ka patai ki te pito mutunga tuarua mo nga whakaaetanga rangitahi mo tenei tauira:

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

Ka taea e te kiritaki te whakamahi mo te wa poto me te whiwhi tiwhikete hou i ia wa (i mua i to raatau Expiration). He maamaa te tauira: Ka huri te AWS i nga taviri rangitahi mo nga take haumarutanga, engari ka taea e nga kaihoko te huna mo etahi meneti hei utu mo te whiunga mahi e pa ana ki te whiwhi tiwhikete hou.

Me tango e te AWS Java SDK te kawenga mo te whakarite i tenei mahi, engari mo etahi take kaore tenei e puta.

Whai muri i te rapu take i runga i te GitHub, ka raru matou #1921. I awhina ia ki te whakatau i te huarahi e "keri" atu ai.

Ka whakahōuhia e te AWS SDK nga tiwhikete ina puta tetahi o nga tikanga e whai ake nei:

  • Rā paunga (Expiration) Taka ki roto EXPIRATION_THRESHOLD, kua tohua kia 15 meneti.
  • Kua roa ake te wa mai i te nganatanga whakamutunga ki te whakahou i nga tiwhikete REFRESH_THRESHOLD, he tohu pakeke mo te 60 meneti.

Hei kite i te ra paunga o nga tiwhikete ka riro mai i a maatau, i whakahaerehia e matou nga whakahau cURL i runga ake nei mai i te ipu me te tauira EC2. Ko te wa whaimana o te tiwhikete i whakawhiwhia mai i te ipu ka tino poto ake: 15 meneti.

Inaianei kua marama nga mea katoa: mo te tono tuatahi, i whakawhiwhia e taatau ratonga nga tiwhikete rangitahi. I te mea kaore i whai mana mo te neke atu i te 15 meneti, ka whakatau te AWS SDK ki te whakahou i a raatau i runga i te tono a muri ake nei. Na ka puta tenei me nga tono katoa.

He aha i poto ake ai te wa mana o nga tiwhikete?

I hoahoatia te AWS Instance Metadata ki te mahi me nga tauira EC2, ehara i a Kubernetes. I tetahi atu taha, kaore matou i pai ki te whakarereke i te atanga tono. Mo tenei i whakamahia e matou KIAM - he taputapu, ma te whakamahi i nga kaihoko i ia node Kubernetes, ka taea e nga kaiwhakamahi (nga miihini e tuku tono ana ki te kapoi) ki te tautapa i nga mahi IAM ki nga ipu i roto i nga pona me te mea he tauira EC2. Ka haukotia e KIAM nga waea ki te ratonga AWS Instance Metadata me te tukatuka mai i tana keteroki, kua riro mai i a AWS i mua. Mai i te tirohanga tono, kaore he rereke.

Ka tukuna e KIAM nga tiwhikete mo te wa poto ki nga pene. He pai tenei ki te whakaaro he poto ake te roanga o te ora o te pona i te tauira EC2. Te wa mana taunoa mo nga tiwhikete he rite ki te 15 meneti.

Ko te mutunga, ki te whakakikorua koe i nga uara taunoa e rua ki runga ake o tetahi ki tetahi, ka puta he raru. Ko ia tiwhikete ka tukuna ki tetahi tono ka pau i muri i te 15 meneti. Heoi, ka kaha te AWS Java SDK ki te whakahou i tetahi tiwhikete iti iho i te 15 meneti e toe ana i mua i tona ra paunga.

Ko te mutunga, ka akiakihia te tiwhikete rangitahi ki te whakahou me ia tono, e rua nga waeatanga ki te AWS API me te nui o te pikinga o te roanga. I roto i te AWS Java SDK i kitea e matou tono āhuatanga, e whakahua ana i tetahi raruraru rite.

Ko te otinga i puta he ngawari. I whirihora ano e matou te KIAM ki te tono tiwhikete me te waa whai mana. I te wa i puta mai tenei, ka timata nga tono ki te rere me te kore e uru mai ki te ratonga AWS Metadata, a ka heke iho te roa ki nga taumata iti ake i te EC2.

kitenga

I runga i o maatau wheako ki nga hekenga, ko tetahi o nga tino take o nga raru ehara i nga ngarara i Kubernetes me etahi atu waahanga o te papaaho. Kare ano hoki e whakatika i nga hapa taketake o nga ratonga miihini e kawe ana matou. He maha nga raruraru ka puta mai na te mea ka whakakotahihia e tatou nga momo waahanga.

Ka whakakotahihia e matou nga punaha uaua kaore ano kia taunekeneke tetahi ki tetahi i mua, me te tumanako ka hangaia he punaha kotahi, nui ake. Aue, ka nui ake nga huānga, ka nui ake te waahi mo nga hapa, ka teitei ake te entropy.

I roto i a maatau, ko te roanga teitei ehara i te hua o nga pepeha, i nga whakatau kino ranei i Kubernetes, KIAM, AWS Java SDK, i a maatau ratonga miihini ranei. Ko te hua o te whakakotahi i nga tautuhinga taunoa motuhake e rua: tetahi i KIAM, tetahi i te AWS Java SDK. Ka tangohia motuhake, ka whai tikanga nga tawhā e rua: te kaupapa here whakahou tiwhikete kaha i roto i te AWS Java SDK, me te wa poto o nga tiwhikete i KAIM. Engari ka whakakotahihia e koe, ka kore e kitea nga hua. E rua nga otinga motuhake me te arorau kaore e whai tikanga ina whakakotahi.

PS mai i te kaiwhakamaori

Ka taea e koe te ako ake mo te hoahoanga o te taputapu KIAM mo te whakauru AWS IAM me Kubernetes i tenei tuhinga mai i ona kaihanga.

Pānuihia hoki i runga i ta maatau blog:

Source: will.com

Tāpiri i te kōrero