Контейнерҳо, микросервисҳо ва торҳои хидматрасонӣ

Дар Интернет як даста мақолаҳо о шабакаи хидматрасонӣ (маш хидматрасонӣ) ва дар ин ҷо боз як. Ура! Аммо барои чӣ? Пас, ман мехоҳам андешаи худро баён кунам, ки агар торҳои хидматрасонӣ 10 сол пеш, пеш аз пайдоиши платформаҳои контейнерӣ ба монанди Docker ва Kubernetes пайдо мешуданд, беҳтар мебуд. Ман намегӯям, ки нуқтаи назари ман аз дигарон беҳтар ё бадтар аст, аммо азбаски торҳои хидматӣ ҳайвонҳои хеле мураккабанд, нуқтаи назари сершумор барои беҳтар фаҳмидани онҳо кӯмак мекунад.

Ман дар бораи платформаи dotCloud сӯҳбат мекунам, ки дар беш аз сад микросервис сохта шудааст ва ҳазорон барномаҳои контейнериро дастгирӣ мекунад. Ман мушкилотҳоеро, ки мо ҳангоми таҳия ва ба кор андохтани он дучор шудем ва чӣ гуна шабакаҳои хидматрасонӣ метавонанд (ё натавонистанд) кӯмак расонанд, шарҳ медиҳам.

Таърихи dotCloud

Ман дар бораи таърихи dotCloud ва интихоби меъмории ин платформа навиштаам, аммо ман дар бораи қабати шабака чандон сӯҳбат накардаам. Агар шумо намехоҳед ба хондан ғарқ шавед мақолаи охирин Дар бораи dotCloud, дар ин ҷо мухтасар аст: ин платформаи PaaS ҳамчун хидматест, ки ба муштариён имкон медиҳад доираи васеи барномаҳоро (Java, PHP, Python...) бо дастгирии доираи васеи маълумот идора кунанд. хидматҳо (MongoDB, MySQL, Redis...) ва ҷараёни корӣ ба монанди Heroku: Шумо рамзи худро ба платформа бор мекунед, он тасвирҳои контейнериро месозад ва онҳоро ҷойгир мекунад.

Ман ба шумо мегӯям, ки чӣ гуна трафик ба платформаи dotCloud равона карда шудааст. На аз он сабаб, ки он махсусан олӣ буд (ҳарчанд система дар вақти худ хуб кор мекард!), балки пеш аз ҳама аз он сабаб, ки бо асбобҳои муосир чунин тарроҳиро метавон дар муддати кӯтоҳ аз ҷониби як дастаи хоксор ба осонӣ амалӣ кард, агар ба онҳо роҳи масири трафики байни як даста лозим бошад. хизматрасониҳои хурд ё як қатор барномаҳо. Бо ин роҳ, шумо метавонед вариантҳоро муқоиса кунед: агар шумо ҳама чизро худатон таҳия кунед ё шабакаи хидматрасонии мавҷударо истифода баред, чӣ мешавад. Интихоби стандартӣ ин аст, ки онро худатон созед ё онро харед.

Масири трафик барои замимаҳои ҷойгиршуда

Барномаҳо дар dotCloud метавонанд нуқтаи ниҳоии HTTP ва TCP-ро фош кунанд.

Нуқтаҳои охири HTTP ба таври динамикӣ ба конфигуратсияи кластери тавозуни сарборӣ илова карда шудааст Гипаче. Ин ба он чизе, ки захираҳо имрӯз мекунанд, монанд аст Ingress дар Кубернетес ва мувозинати сарборӣ ба монанди Трефик.

Мизоҷон ба нуқтаҳои ниҳоии HTTP тавассути доменҳои мувофиқ пайваст мешаванд, ба шарте ки номи домен ба тавозуни сарбории dotCloud ишора кунад. Ҳеҷ чизи махсус.

Нуқтаҳои охири TCP бо рақами порт алоқаманд аст, ки пас аз он ба ҳама контейнерҳои ин стек тавассути тағирёбандаҳои муҳити зист интиқол дода мешавад.

Мизоҷон метавонанд бо истифода аз номи мизбони мувофиқ (чизе ба монанди gateway-X.dotcloud.com) ва рақами порт ба нуқтаҳои ниҳоии TCP пайваст шаванд.

Ин номи мизбон ба кластери сервери "nats" ҳал мешавад (бо НАТС), ки пайвастҳои воридотии TCP-ро ба контейнери дуруст равона мекунад (ё дар ҳолати хидматрасонии мувозинат, ба контейнерҳои дуруст).

Агар шумо бо Kubernetes шинос бошед, ин эҳтимол ба шумо хидматҳоро хотиррасон мекунад NodePort.

Дар платформаи dotCloud хидматҳои баробар вуҷуд надоштанд ClusterIP: Барои соддагӣ, хидматҳо ҳам аз дохил ва ҳам берун аз платформа як хел дастрас карда шуданд.

Ҳама чиз ба таври оддӣ ташкил карда шуд: татбиқи ибтидоии шабакаҳои масир HTTP ва TCP эҳтимолан ҳамагӣ чандсад сатри Python буд. Алгоритмҳои оддӣ (ман соддалавҳона гуфта метавонам), ки бо афзоиши платформа такмил дода шуданд ва талаботҳои иловагӣ пайдо шуданд.

Рефакторинги васеъи коди мавҷуда талаб карда нашуд. Бавижа, Барномаҳои 12 омил метавонад бевосита суроғаеро, ки тавассути тағирёбандаҳои муҳити зист ба даст омадааст, истифода барад.

Ин аз шабакаи муосири хидматрасонӣ чӣ фарқ дорад?

Маҳдуд аёният. Мо умуман ягон ченак барои шабакаи масир TCP надорем. Вақте ки сухан дар бораи масири HTTP меравад, версияҳои баъдӣ ченакҳои муфассали HTTP-ро бо рамзҳои хатогӣ ва вақти посух пешниҳод карданд, аммо торҳои муосири хидматрасонӣ боз ҳам дуртар рафта, ҳамгироиро бо системаҳои ҷамъоварии метрика ба монанди Prometheus таъмин мекунанд.

Намоиш на танҳо аз нуқтаи назари амалиётӣ муҳим аст (барои рафъи мушкилот), балки ҳангоми баровардани хусусиятҳои нав. Ин дар бораи бехатар аст ҷойгиркунии кабуд-сабз и ҷойгиркунии канарей.

Самаранокии масир низ маҳдуд аст. Дар шабакаи масиркунии dotCloud, тамоми трафик бояд аз кластери гиреҳҳои масирсозии махсус гузарад. Ин маънои эҳтимолан убур кардани сарҳадҳои сершумори AZ (Минтақаи дастрас) ва ба таври назаррас афзоиш додани таъхирро дошт. Ман коди бартарафсозии мушкилотро дар ёд дорам, ки дар як саҳифа зиёда аз сад дархости SQL эҷод мекард ва барои ҳар як дархост пайвасти нав ба сервери SQL мекушояд. Ҳангоми ба таври маҳаллӣ кор кардан, саҳифа фавран бор мешавад, аммо дар dotCloud барои бор кардан чанд сония вақт лозим аст, зеро ҳар як пайвасти TCP (ва дархости минбаъдаи SQL) даҳҳо миллисонияро мегирад. Дар ин ҳолат, пайвастҳои доимӣ мушкилотро ҳал карданд.

Шабакаҳои хидматрасонии муосир дар ҳалли чунин мушкилот беҳтаранд. Пеш аз ҳама, онҳо тафтиш мекунанд, ки пайвастагиҳо ба роҳ монда шудаанд дар манбаъ. Ҷараёни мантиқӣ якхела аст: клиент → меш → сервис, аммо ҳоло тор ба таври маҳаллӣ кор мекунад ва на дар гиреҳҳои дурдаст, бинобар ин пайвастшавӣ клиент → меш маҳаллӣ ва хеле зуд аст (микросонияҳо ба ҷои миллисонияҳо).

Шабакаҳои муосири хидматрасонӣ инчунин алгоритмҳои оқилонаи мувозинати сарбориро амалӣ мекунанд. Бо мониторинги саломатии пуштибонҳо, онҳо метавонанд трафики бештарро ба ақибмондаҳои тезтар ирсол кунанд, ки ин боиси беҳтар шудани кори умумӣ мегардад.

Амният хам бехтар. Шабакаи масиркунии dotCloud пурра дар EC2 Classic кор мекард ва трафикро рамзгузорӣ накардааст (дар асоси тахмине, ки агар касе тавонист, ки ба трафики шабакаи EC2 снайфер гузошта шавад, шумо аллакай дар мушкилии калон қарор доштед). Шабакаҳои хидматрасонии муосир тамоми трафики моро шаффоф муҳофизат мекунанд, масалан, бо аутентификатсияи мутақобилаи TLS ва рамзгузории минбаъда.

Масири трафик барои хидматҳои платформа

Хуб, мо трафики байни барномаҳоро муҳокима кардем, аммо дар бораи худи платформаи dotCloud чӣ гуфтан мумкин аст?

Худи платформа аз тақрибан сад микросервисҳо иборат буд, ки барои вазифаҳои гуногун масъуланд. Баъзеҳо дархостҳои дигаронро қабул карданд ва баъзеҳо коргарони заминавӣ буданд, ки ба хидматҳои дигар пайвастанд, аммо худашон пайвастҳоро қабул намекарданд. Дар ҳар сурат, ҳар як хидмат бояд нуқтаи ниҳоии суроғаҳоро донад, ки ба он пайваст шудан лозим аст.

Бисёре аз хидматҳои сатҳи баланд метавонанд шабакаи масирро истифода баранд. Дарвоқеъ, бисёре аз беш аз сад микросервисҳои dotCloud ҳамчун барномаҳои муқаррарӣ дар худи платформаи dotCloud ҷойгир шудаанд. Аммо шумораи ками хидматҳои сатҳи паст (махсусан онҳое, ки ин шабакаи масирро амалӣ мекунанд) ба чизи соддатар ниёз доштанд, ки вобастагии камтар доранд (зеро онҳо наметавонистанд барои кор аз худ вобаста бошанд - мушкилоти хуби мурғ ва тухм).

Ин хидматҳои сатҳи пасти рисолати муҳим тавассути интиқоли контейнерҳо мустақиман дар чанд гиреҳи калидӣ ҷойгир карда шуданд. Дар ин ҳолат хидматҳои стандартии платформа истифода нашуданд: пайвандкунанда, нақшакаш ва даванда. Агар шумо хоҳед, ки бо платформаҳои контейнерии муосир муқоиса кунед, ин ба он монанд аст, ки як ҳавопаймои идоракунӣ бо docker run бевосита дар гиреҳҳо, ба ҷои ба Кубернетес додани вазифа. Он дар консепсия хеле монанд аст модулҳои статикӣ (подҳо), ки онро истифода мебарад кубеадм ё bootkube ҳангоми пурборкунии кластери мустақил.

Ин хидматҳо ба таври оддӣ ва дағалона фош карда шуданд: файли YAML ном ва суроғаҳои онҳоро номбар кардааст; ва ҳар як муштарӣ бояд нусхаи ин файли YAML-ро барои ҷойгиркунӣ бигирад.

Аз як тараф, он бениҳоят боэътимод аст, зеро он дастгирии як мағозаи берунии калид/арзишро ба монанди Zookeeper талаб намекунад (дар хотир доред, etcd ё Консул он вақт вуҷуд надошт). Аз тарафи дигар, интиқоли хидматҳоро душвор мегардонд. Ҳар дафъае, ки ҳаракат анҷом дода мешуд, ҳамаи муштариён файли навшудаи YAML -ро мегиранд (ва эҳтимолан аз нав оғоз кунанд). На он қадар бароҳат!

Баъдан, мо ба татбиқи нақшаи нав шурӯъ кардем, ки дар он ҳар як муштарӣ ба сервери прокси маҳаллӣ пайваст мешавад. Ба ҷои суроға ва порт, он танҳо бояд рақами порти хидматро донад ва тавассути он пайваст шавад localhost. Прокси маҳаллӣ ин пайвастро идора мекунад ва онро ба сервери воқеӣ интиқол медиҳад. Ҳоло, ҳангоми интиқоли пуштибон ба мошини дигар ё миқёссозӣ, ба ҷои навсозии ҳамаи муштариён, шумо танҳо бояд ҳамаи ин проксиҳои маҳаллиро нав кунед; ва бозсозӣ дигар талаб карда намешавад.

(Инчунин ба нақша гирифта шуда буд, ки трафик дар пайвастҳои TLS ва гузоштани сервери дигари прокси ба тарафи қабулкунанда, инчунин санҷиши сертификатҳои TLS бе иштироки хидмати қабулкунанда, ки барои қабули пайвастҳо танҳо дар localhost. Муфассалтар дар ин бора баъдтар).

Ин хеле монанд аст SmartStack аз Airbnb, аммо фарқияти назаррас дар он аст, ки SmartStack татбиқ ва дар истеҳсолот ҷойгир карда мешавад, дар ҳоле ки системаи масиркунии дохилии dotCloud вақте ки dotCloud Docker шуд, рафъ карда шуд.

Ман шахсан SmartStack-ро яке аз пешгузаштагони системаҳо ба монанди Istio, Linkerd ва Consul Connect мешуморам, зеро ҳамаи онҳо як намунаро пайравӣ мекунанд:

  • Дар ҳар як гиреҳ проксиро иҷро кунед.
  • Мизоҷон ба прокси пайваст мешаванд.
  • Ҳавопаймои идоракунӣ конфигуратсияи проксиро ҳангоми тағир додани пуштибонҳо нав мекунад.
  • ... Фоида!

Татбиқи муосири шабакаи хидматрасонӣ

Агар ба мо лозим буд, ки имрӯз як шабакаи шабеҳро татбиқ кунем, мо метавонем принсипҳои шабеҳро истифода барем. Масалан, як минтақаи дохилии DNS-ро тавассути харитаи номҳои хидматрасонӣ ба суроғаҳо дар фазо танзим кунед 127.0.0.0/8. Сипас HAProxy-ро дар ҳар як гиреҳи кластер иҷро кунед ва пайвастҳоро дар ҳар як суроғаи хидматрасонӣ (дар он зершабака) қабул кунед 127.0.0.0/8) ва равона кардан/мувозинат додани сарборӣ ба пуштибони мувофиқ. Конфигуратсияи HAProxy-ро идора кардан мумкин аст confd, ба шумо имкон медиҳад, ки маълумоти пуштибониро дар etcd ё Consul нигоҳ доред ва ҳангоми зарурат конфигуратсияи навшударо ба HAProxy ба таври худкор тела диҳед.

Истио чунин кор мекунад! Аммо бо баъзе фарқиятҳо:

  • Истифода мебарад Прокси фиристода ба ҷои HAProxy.
  • Конфигуратсияи пуштибониро тавассути Kubernetes API ба ҷои etcd ё Consul нигоҳ медорад.
  • Хизматҳо ба ҷои 127.0.0.0/8 дар зершабакаи дохилӣ (суроғаҳои Kubernetes ClusterIP) суроғаҳо ҷудо карда мешаванд.
  • Барои илова кардани аутентификатсияи мутақобилаи TLS байни муштарӣ ва серверҳо як ҷузъи иловагӣ (Citadel) дорад.
  • Хусусиятҳои навро, аз қабили шикастани ноқилҳо, пайгирии тақсимшуда, ҷойгиркунии канария ва ғайра дастгирӣ мекунад.

Биёед ба баъзе фарқиятҳо зуд назар андозем.

Прокси фиристода

Envoy Proxy аз ҷониби Lyft навишта шудааст [рақиби Uber дар бозори таксӣ - тақрибан. хати]. Он аз бисёр ҷиҳат ба проксиҳои дигар шабоҳат дорад (масалан, HAProxy, Nginx, Traefik...), аммо Lyft прокси онҳоро навишт, зеро онҳо ба хусусиятҳое ниёз доштанд, ки проксиҳои дигар намерасанд ва ба назар чунин менамуд, ки сохтани прокси нав ба ҷои васеъ кардани прокси мавҷуда оқилонатар буд.

Фиристода метавонад мустақилона истифода шавад. Агар ман як хидмати мушаххасе дошта бошам, ки бояд ба хидматҳои дигар пайваст шавад, ман метавонам онро барои пайвастшавӣ ба Envoy танзим кунам ва сипас Envoy-ро бо ҷойгиршавии хидматҳои дигар динамикӣ танзим ва аз нав танзим кунам, дар ҳоле ки бисёр функсияҳои иловагии иловагӣ, ба монанди намоёнӣ ба даст меоранд. Ба ҷои китобхонаи фармоишии муштарӣ ё ворид кардани нишонаҳои занг ба код, мо трафикро ба Envoy мефиристем ва он барои мо ченакҳоро ҷамъ мекунад.

Аммо Фиристода низ қодир ба кор ҳамчун ҳавопаймои маълумот (ҳавопаймои маълумот) барои шабакаи хидматрасонӣ. Ин маънои онро дорад, ки Envoy ҳоло барои ин шабакаи хидматӣ танзим шудааст ҳавопаймои идоракунӣ (ҳавопаймои идоракунӣ).

Ҳавопаймои идоракунӣ

Барои ҳавопаймои идоракунӣ, Istio ба API Kubernetes такя мекунад. Ин аз истифодаи confd чандон фарқ надорад, ки барои дидани маҷмӯи калидҳо дар анбори додаҳо ба etcd ё Консул такя мекунад. Istio API-и Kubernetes-ро барои дидани маҷмӯи захираҳои Kubernetes истифода мебарад.

Дар байни ин ва баъд: Ман шахсан инро муфид пайдо кардам Тавсифи API Kubernetesки гуфта мешавад:

Сервери Kubernetes API "сервери гунг" аст, ки барои захираҳои API нигоҳдорӣ, версиясозӣ, тасдиқкунӣ, навсозӣ ва семантикаро пешниҳод мекунад.

Istio барои кор бо Kubernetes тарҳрезӣ шудааст; ва агар шумо хоҳед, ки онро берун аз Kubernetes истифода баред, пас шумо бояд як мисоли сервери API Kubernetes (ва хидмати ёрирасони etcd) -ро иҷро кунед.

Суроғаҳои хидматрасонӣ

Istio ба суроғаҳои ClusterIP такя мекунад, ки Kubernetes ҷудо мекунад, бинобар ин хидматҳои Istio суроғаи дохилиро мегиранд (на дар диапазон) 127.0.0.0/8).

Трафик ба суроғаи ClusterIP барои хидмати мушаххас дар кластери Kubernetes бе Istio тавассути kube-proxy боздошта мешавад ва ба пуштибонии он прокси фиристода мешавад. Агар шумо ба тафсилоти техникӣ таваҷҷӯҳ дошта бошед, kube-proxy қоидаҳои iptables (ё тавозуни сарбории IPVS, вобаста аз он ки чӣ тавр танзим карда шудааст) муқаррар мекунад, то суроғаҳои IP-и таъиноти пайвастҳоро ба суроғаи ClusterIP ворид кунанд.

Вақте ки Istio дар кластери Kubernetes насб карда мешавад, ҳеҷ чиз тағир намеёбад, то он даме ки он барои истеъмолкунандаи дода ё ҳатто тамоми фазои ном тавассути ворид кардани контейнер ба таври возеҳ фаъол карда нашавад sidecar ба қуттиҳои фармоишӣ. Ин контейнер як намунаи Envoy-ро мегардонад ва маҷмӯи қоидаҳои iptablesро муқаррар мекунад, то трафики ба хидматҳои дигар воридшударо боздорад ва ин трафикро ба Envoy равона кунад.

Ҳангоми ҳамгироӣ бо Kubernetes DNS, ин маънои онро дорад, ки рамзи мо метавонад бо номи хидмат пайваст шавад ва ҳама чиз "фақат кор мекунад". Ба ибораи дигар, коди мо дархостҳоро ба монанди http://api/v1/users/4242баъд api ҳалли дархост барои 10.97.105.48, қоидаҳои iptables пайвастагиҳоро аз 10.97.105.48 бозмедоранд ва онҳоро ба прокси фиристодаи маҳаллӣ равон мекунанд ва он прокси маҳаллӣ дархостро ба API воқеии пуштибонӣ ирсол мекунад. Оҳ!

Рангҳои иловагӣ

Istio инчунин рамзгузорӣ ва аутентификатсияро тавассути mTLS (TLS мутақобила) таъмин мекунад. Компонент номида мешавад Citadel.

Инчунин як компонент вуҷуд дорад Миксер, ки Фиристода метавонад дархост кунад ҳар яке дархост барои қабули қарори махсус дар бораи ин дархост вобаста ба омилҳои гуногун, аз қабили сарлавҳаҳо, сарбории пуштибонӣ ва ғайра... (парво накунед: роҳҳои зиёде барои нигоҳ доштани Миксер вуҷуд доранд ва ҳатто агар он ба садама дучор шавад, Envoy корашро идома медиҳад. хуб ҳамчун прокси).

Ва, албатта, мо аёниятро қайд кардем: Фиристода ҳангоми таъмини пайгирии тақсимшуда миқдори зиёди ченакҳоро ҷамъ меорад. Дар меъмории хидматрасонии микро, агар дархости ягонаи API бояд тавассути микросервисҳои A, B, C ва D гузарад, пас ҳангоми ворид шудан пайгирии тақсимшуда ба дархост як идентификатори беназир илова мекунад ва ин идентификаторро тавассути зердархостҳо ба ҳамаи ин хидматрасониҳо нигоҳ медорад, ки имкон медиҳад ҳама зангҳои марбут ба забт кардан. таъхирҳо ва ғайра.

Таҳия кунед ё харед

Истио барои мураккаб буданаш обру дорад. Баръакс, сохтани шабакаи масир, ки ман дар аввали ин мақола тавсиф кардам, бо истифода аз абзорҳои мавҷуда нисбатан содда аст. Пас, оё ба ҷои он сохтани шабакаи хидматрасонии шахсии худ маъно дорад?

Агар мо эҳтиёҷоти хоксорона дошта бошем (мо ба намоёнӣ, ноқил ва дигар нозукиҳо ниёз надорем), пас фикрҳо барои таҳияи асбоби худамон меоянд. Аммо агар мо Kubernetes-ро истифода барем, шояд он ҳатто лозим набошад, зеро Kubernetes аллакай абзорҳои асосиро барои кашфи хидмат ва мувозинати сарборӣ таъмин мекунад.

Аммо агар мо талаботи пешрафта дошта бошем, пас "харидани" торҳои хидматрасонӣ як варианти беҳтар ба назар мерасад. (Ин на ҳамеша "харидан" аст, зеро Istio манбаи кушода аст, аммо ба мо лозим аст, ки барои фаҳмидан, ҷойгир кардан ва идора кардани он вақти муҳандисиро сарф кунем.)

Оё ман бояд Истио, Linkerd ё Consul Connect -ро интихоб кунам?

То хол мо факат дар бораи Истио сухан рондаем, аммо ин ягона торчаи хизматрасонй нест. Алтернативаи маъмул - Линкерд, ва бештар вуҷуд дорад Консул пайваст.

Чӣ бояд интихоб кард?

Ростӣ, ман намедонам. Дар айни замон ман худро барои посух додан ба ин савол ба қадри кофӣ салоҳиятдор намедонам. Якчанд ҳастанд шавқовар мақолаҳо бо мукоисаи ин асбобхо ва хатто меъёрҳо.

Яке аз равиши умедбахш истифода бурдани асбобе ба монанди SuperGloo. Он як қабати абстраксияро барои содда ва муттаҳид кардани API-ҳои тавассути торҳои хидматрасонӣ ошкоршуда амалӣ мекунад. Ба ҷои омӯхтани API-ҳои мушаххаси (ва, ба андешаи ман, нисбатан мураккаб) шабакаҳои хидматрасонии гуногун, мо метавонем конструксияҳои оддии SuperGloo-ро истифода барем ва ба осонӣ аз як ба дигараш гузарем, гӯё мо формати конфигуратсияи фосилавии тавсифи интерфейсҳои HTTP ва пуштибонҳоро дошта бошем. тавлиди конфигуратсияи воқеӣ барои Nginx, HAProxy, Traefik, Apache...

Ман каме бо Istio ва SuperGloo машғул шудам ва дар мақолаи навбатӣ ман мехоҳам нишон диҳам, ки чӣ тавр Istio ё Linkerd-ро бо истифода аз SuperGloo ба кластери мавҷуда илова кардан мумкин аст ва чӣ тавр охирин корро иҷро мекунад, яъне ба шумо имкон медиҳад, ки аз як шабакаи хидматрасонӣ ба дигараш бидуни сабти конфигуратсияҳо.

Манбаъ: will.com

Илова Эзоҳ