Մի շարք գրառումներ Istio Service Mesh-ում

Մենք սկսում ենք մի շարք գրառումներ, որոնք ցույց են տալիս Istio Service Mesh-ի բազմաթիվ հնարավորությունները՝ Red Hat OpenShift-ի և Kubernetes-ի հետ համատեղ:

Մի շարք գրառումներ Istio Service Mesh-ում

Մաս առաջին, այսօր.

  • Եկեք բացատրենք Kubernetes-ի կողային բեռնարկղերի կոնցեպտը և ձևակերպենք այս շարքի գրառումների լեյտմոտիվը. «Ձեր ծածկագրում որևէ բան փոխելու կարիք չկա».
  • Ներկայացնենք Istio-ի հիմնականը՝ երթուղային կանոնները: Istio-ի մյուս բոլոր հնարավորությունները կառուցված են դրանց վրա, քանի որ դա կանոններն են, որոնք թույլ են տալիս երթևեկությունն ուղղել դեպի միկրոսերվիսներ՝ օգտագործելով YAML ֆայլերը, որոնք դուրս են ծառայության կոդից: Մենք նաև դիտարկում ենք Canary Deployment-ի տեղակայման սխեման: Ամանորյա բոնուս – 10 ինտերակտիվ դաս Istio-ում


Երկրորդ մասը, շուտով, ձեզ կասի.

  • Ինչպես է Istio-ն իրականացնում Pool Ejection-ը Circuit Breaker-ի հետ համատեղ և ցույց կտա, թե ինչպես է Istio-ն թույլ տալիս հավասարակշռող շղթայից հեռացնել մեռած կամ վատ աշխատող պատիճը:
  • Մենք նաև կանդրադառնանք «Circuit Breaker» թեմային առաջին գրառումից՝ տեսնելու, թե ինչպես կարելի է օգտագործել Istio-ն այստեղ: Մենք ձեզ ցույց կտանք, թե ինչպես ուղղորդել երթևեկությունը և կարգավորել ցանցի սխալները՝ օգտագործելով YAML կազմաձևման ֆայլերը և տերմինալի հրամանները՝ առանց ծառայության կոդի նվազագույն փոփոխության:

Մաս երրորդ.

  • Պատմություն հետագծման և մոնիտորինգի մասին, որոնք արդեն ներկառուցված են կամ հեշտությամբ ավելացվում են Istio-ում: Մենք ձեզ ցույց կտանք, թե ինչպես օգտագործել այնպիսի գործիքներ, ինչպիսիք են Prometheus-ը, Jaeger-ը և Grafana-ն OpenShift-ի մասշտաբի հետ համատեղ՝ միկրոսպասարկման ճարտարապետություններն առանց ջանքերի կառավարելու համար:
  • Մենք սխալների մշտադիտարկումից և մշակումից անցնում ենք դրանք համակարգում միտումնավոր ներմուծելուն: Այլ կերպ ասած, մենք սովորում ենք, թե ինչպես անել անսարքության ներարկում առանց աղբյուրի կոդը փոխելու, ինչը շատ կարևոր է թեստավորման տեսանկյունից, քանի որ եթե դրա համար փոխեք կոդը ինքնին, լրացուցիչ սխալներ մտցնելու վտանգ կա:

Վերջապես, Istio Service Mesh-ի վերջին գրառման մեջ.

  • Եկեք գնանք մութ կողմ: Ավելի ճիշտ, մենք կսովորենք օգտագործել Dark Launch սխեման, երբ կոդը տեղադրվում և փորձարկվում է անմիջապես արտադրության տվյալների վրա, բայց որևէ կերպ չի ազդում համակարգի աշխատանքի վրա: Այստեղ է, որ օգտակար է երթևեկությունը բաժանելու Istio-ի կարողությունը: Իսկ կենդանի արտադրության տվյալների վրա փորձարկելու հնարավորությունը՝ առանց որևէ կերպ ազդելու մարտական ​​համակարգի աշխատանքի վրա, ստուգման ամենահամոզիչ մեթոդն է։
  • Հիմնվելով Dark Launch-ի վրա՝ մենք ձեզ ցույց կտանք, թե ինչպես օգտագործել Canary Deployment մոդելը՝ նվազեցնելու ռիսկը և հեշտացնելու նոր ծածկագիրը արտադրության մեջ: Canary Deployment-ն ինքնին հեռու է նորությունից, բայց Istio-ն թույլ է տալիս իրականացնել այս սխեման պարզապես պարզ YAML ֆայլերով:
  • Վերջապես, մենք ձեզ ցույց կտանք, թե ինչպես օգտագործել Istio Egress-ը ծառայություններից օգտվելու համար նրանց, ովքեր գտնվում են ձեր կլաստերներից դուրս, որպեսզի օգտագործեն Istio-ի հնարավորությունները ինտերնետի հետ աշխատելիս:

Այսպիսով, ահա մենք գնում ենք ...

Istio-ի մոնիտորինգի և կառավարման գործիքներ. այն ամենը, ինչ ձեզ անհրաժեշտ է միկրոծառայությունները սպասարկման ցանցում կազմակերպելու համար սպասարկման ցանց.

Ինչ է Istio Service Mesh-ը

Ծառայությունների ցանցն իրականացնում է այնպիսի գործառույթներ, ինչպիսիք են երթևեկության մոնիտորինգը, մուտքի վերահսկումը, հայտնաբերումը, անվտանգությունը, սխալների հանդուրժողականությունը և այլ օգտակար բաներ մի խումբ ծառայությունների համար: Istio-ն թույլ է տալիս այս ամենն անել առանց իրենց ծառայությունների կոդի ամենաչնչին փոփոխության: Ո՞րն է մոգության գաղտնիքը: Istio-ն յուրաքանչյուր ծառայությանը կցում է իր սեփական վստահված անձը կողային բեռնարկղի տեսքով (կողային սայլը մոտոցիկլետի կողային սայլ է), որից հետո այս ծառայության ողջ երթևեկությունը անցնում է վստահված անձի միջոցով, որը, առաջնորդվելով սահմանված քաղաքականությամբ, որոշում է, թե ինչպես, երբ և արդյոք այս երթևեկությունը: պետք է ընդհանրապես հասնի ծառայության: Istio-ն նաև հնարավորություն է տալիս իրականացնել DevOps-ի առաջադեմ տեխնիկա, ինչպիսիք են դեղձանիկների տեղակայումը, անջատիչները, սխալների ներարկումը և շատ ուրիշներ:

Ինչպես է Istio-ն աշխատում բեռնարկղերի և Kubernetes-ի հետ

Istio-ի սպասարկման ցանցը միկրոծառայություններ ստեղծելու և կառավարելու համար անհրաժեշտ ամեն ինչի կողմնակի ներդրումն է՝ մոնիտորինգ, հետագծում, անջատիչներ, երթուղիացում, բեռի հավասարակշռում, անսարքությունների ներարկում, կրկնվող փորձեր, ժամանակի ընդհատումներ, հայելավորում, մուտքի վերահսկում, արագության սահմանափակում և շատ ավելին: Եվ չնայած այսօր կան բազմաթիվ գրադարաններ, որոնք կարող են ուղղակիորեն իրականացնել այս գործառույթները կոդով, Istio-ով դուք կարող եք ստանալ բոլոր նույն բաները՝ առանց որևէ բան փոխելու ձեր կոդի մեջ:

Համաձայն կողային մեքենայի մոդելի՝ Istio-ն աշխատում է Linux կոնտեյներով, որը գտնվում է մեկում Կուբերնետես- pod վերահսկվող ծառայության հետ և ներարկում և արդյունահանում է ֆունկցիոնալությունն ու տեղեկատվությունը՝ ըստ տվյալ կոնֆիգուրացիայի: Մենք շեշտում ենք, որ սա ձեր սեփական կոնֆիգուրացիան է, և այն ապրում է ձեր կոդից դուրս: Հետևաբար կոդը դառնում է շատ ավելի պարզ և կարճ։

Կարևորը նաև այն է, որ միկրոսերվիսների գործառնական բաղադրիչը, պարզվում է, ոչ մի կերպ կապված չէ հենց կոդի հետ, ինչը նշանակում է, որ դրանց աշխատանքը կարող է ապահով կերպով փոխանցվել ՏՏ մասնագետներին։ Իսկապես, ինչու՞ պետք է մշակողը պատասխանատու լինի անջատիչների և անսարքությունների ներարկման համար: Արձագանքել, այո, բայց մշակել դրանք և ստեղծել դրանք: Եթե ​​այս ամենը հանեք կոդից, ծրագրավորողները կկարողանան ամբողջությամբ կենտրոնանալ հավելվածի ֆունկցիոնալության վրա։ Իսկ կոդը ինքնին կդառնա ավելի կարճ և պարզ:

Սպասարկման ցանց

Istio-ն, որն իրականացնում է միկրոծառայությունների կառավարման գործառույթներ իրենց ծածկագրից դուրս, Ծառայությունների ցանցի գաղափարն է: Այլ կերպ ասած, դա մեկ կամ մի քանի երկուականների համակարգված խումբ է, որը կազմում է ցանցի ֆունկցիաների ցանց:

Ինչպես է Istio-ն աշխատում միկրոծառայությունների հետ

Ահա թե ինչ տեսք ունի կողային բեռնարկղերի աշխատանքը՝ զուգակցված Կուբերնետես и Մինի հերթափոխ թռչնի հայացք. գործարկեք Minishift-ի օրինակ, ստեղծեք նախագիծ Istio-ի համար (եկեք այն անվանենք «istio-system»), տեղադրեք և գործարկեք Istio-ի հետ կապված բոլոր բաղադրիչները: Այնուհետև, երբ դուք ստեղծում եք նախագծեր և պատիճներ, դուք ավելացնում եք կազմաձևման տեղեկատվությունը ձեր տեղակայումներին, և ձեր պատյանները սկսում են օգտագործել Istio-ն: Պարզեցված դիագրամն այսպիսի տեսք ունի.

Մի շարք գրառումներ Istio Service Mesh-ում

Այժմ դուք կարող եք փոխել Istio-ի կարգավորումները, որպեսզի, օրինակ, կազմակերպեք սխալների ներարկում, աջակցություն Canary տեղակայում կամ Istio-ի այլ հնարավորություններ, և այս ամենը առանց դիպչելու հենց հավելվածների կոդին: Ենթադրենք, դուք ցանկանում եք վերահղել ամբողջ վեբ տրաֆիկը ձեր ամենամեծ հաճախորդի (Foo Corporation) օգտվողներից դեպի կայքի նոր տարբերակ: Դա անելու համար պարզապես ստեղծեք Istio երթուղային կանոն, որը օգտվողի ID-ում կփնտրի @foocorporation.com և համապատասխանաբար վերահղում: Մնացած բոլոր օգտվողների համար ոչինչ չի փոխվի: Այդ ընթացքում դուք հանգիստ կփորձարկեք կայքի նոր տարբերակը։ Եվ նկատի ունեցեք, որ դրա համար ընդհանրապես պետք չէ ներգրավել մշակողներին:

Իսկ դուք ստիպված կլինե՞ք թանկ վճարել դրա համար։

Ընդհանրապես. Istio-ն բավականին արագ է և գրված է Go և ստեղծում է շատ քիչ ծախսեր: Բացի այդ, առցանց արտադրողականության հնարավոր կորուստը փոխհատուցվում է մշակողների արտադրողականության աճով: Գոնե տեսականորեն. մի մոռացեք, որ մշակողների ժամանակը արժեքավոր է: Ինչ վերաբերում է ծրագրային ապահովման ծախսերին, Istio-ն բաց կոդով ծրագրակազմ է, այնպես որ կարող եք անվճար ստանալ և օգտագործել այն:

Ինքներդ տիրապետեք դրան

Red Hat Developer Experience թիմը մշակել է խորը գործնական աշխատանք ղեկավարությունը Իստիոյի կողմից (անգլերեն): Այն աշխատում է Linux-ի, MacOS-ի և Windows-ի վրա, իսկ կոդը հասանելի է Java-ում և Node.js-ում:

10 ինտերակտիվ դաս Istio-ում

Բլոկ 1 - Սկսնակների համար

Ներածություն Իստիո
30 րոպե
Եկեք ծանոթանանք Service Mesh-ին, սովորենք, թե ինչպես տեղադրել Istio-ն OpenShift Kubernetes կլաստերում։
Գրանցման ամսաթիվ:

Միկրոծառայությունների տեղակայում Իստիոյում
30 րոպե
Մենք օգտագործում ենք Istio-ն՝ Spring Boot-ով և Vert.x-ով երեք միկրոծառայություններ տեղակայելու համար:
Գրանցման ամսաթիվ:

Բլոկ 2 – միջանկյալ մակարդակ

Մոնիտորինգ և հետագծում Իստիոյում
60 րոպե
Մենք կուսումնասիրենք Istio-ի ներկառուցված մոնիտորինգի գործիքները, հատուկ չափումները և OpenTracing-ը Prometheus-ի և Grafana-ի միջոցով:
Գրանցման ամսաթիվ:

Պարզ երթուղի Իստիոյում
60 րոպե
Իմացեք, թե ինչպես կառավարել երթուղին Istio-ում՝ օգտագործելով պարզ կանոններ:
Գրանցման ամսաթիվ:

Ընդլայնված երթուղային կանոններ
60 րոպե
Եկեք դիտարկենք Istio-ի խելացի երթուղին, մուտքի վերահսկումը, բեռնվածության հավասարակշռումը և արագության սահմանափակումը:
Գրանցման ամսաթիվ:

Բլոկ 3 – առաջադեմ օգտվող

Սխալ ներարկում Իստիոյում
60 րոպե
Մենք ուսումնասիրում ենք բաշխված հավելվածներում ձախողման հետ կապված սցենարները՝ ստեղծելով HTTP սխալներ և ցանցային ուշացումներ, և սովորում ենք օգտագործել քաոսի ինժեներությունը՝ շրջակա միջավայրը վերականգնելու համար:
Գրանցման ամսաթիվ:

Անջատիչ Իստիոյում
30 րոպե
Մենք տեղադրում ենք Siege սթրես-թեստավորման վայրերում և սովորում ենք, թե ինչպես ապահովել հետին մասի սխալների հանդուրժողականությունը՝ օգտագործելով կրկնապատկերներ, անջատիչ և լողավազանի արտանետում:
Գրանցման ամսաթիվ:

Էգրես և Իստիո
10 րոպե
Մենք օգտագործում ենք Egress երթուղիները՝ արտաքին API-ների և ծառայությունների հետ ներքին ծառայությունների փոխգործակցության կանոններ ստեղծելու համար:
Գրանցման ամսաթիվ:

Իստիո և Կիալի
15 րոպե
Սովորեք օգտագործել Kiali-ն՝ ծառայության ցանցի ակնարկ ստանալու և հարցումների և տվյալների հոսքերը ուսումնասիրելու համար:
Գրանցման ամսաթիվ:

Փոխադարձ TLS Իստիոյում
15 րոպե
Մենք ստեղծում ենք Istio Gateway-ը և VirtualService-ը, այնուհետև մանրամասն ուսումնասիրում ենք փոխադարձ TLS (mTLS) և դրա կարգավորումները։
Գրանցման ամսաթիվ:

Block 3.1 - Deep Dive. Istio Service Mesh միկրոծառայությունների համար

Մի շարք գրառումներ Istio Service Mesh-ում
Ինչի մասին է գիրքը.

  • Ի՞նչ է սպասարկման ցանցը:
  • Istio համակարգը և նրա դերը միկրոսերվիսային ճարտարապետության մեջ:
  • Օգտագործելով Istio-ն՝ լուծելու հետևյալ խնդիրները.
    • Սխալների հանդուրժողականություն;
    • Երթուղիավորում;
    • Քաոսի փորձարկում;
    • Անվտանգություն;
    • Հեռուստաչափության հավաքածու՝ օգտագործելով հետքեր, չափումներ և Grafana:

Գիրք ներբեռնելու համար

Ծառայողական ցանցերի և Istio-ի վերաբերյալ հոդվածների շարք

Փորձեք դա ինքներդ

Այս գրառումների շարքը նպատակ չունի խորը սուզվել դեպի Իստիո աշխարհ: Մենք պարզապես ուզում ենք ձեզ ներկայացնել հայեցակարգը և միգուցե ոգեշնչել ձեզ փորձել Istio-ն ինքներդ: Դա լիովին անվճար է, և Red Hat-ը տրամադրում է բոլոր այն գործիքները, որոնք անհրաժեշտ են OpenShift-ի, Kubernetes-ի, Linux-ի կոնտեյներների և Istio-ի հետ սկսելու համար, ներառյալ՝ Red Hat Developer OpenShift կոնտեյներային հարթակ, մեր ուղեցույցը դեպի Իստիո և այլ ռեսուրսներ մեր վրա միկրոկայք ծառայության ցանցի վրա. Մի հապաղեք, սկսեք այսօր:

Istio երթուղային կանոններ. ուղղորդել սպասարկման հարցումները, որտեղ նրանք պետք է գնան

OpenShift- ը и Կուբերնետես կատարեք հասցեագրման հիանալի աշխատանք միկրոծառայություններ ուղղորդված դեպի անհրաժեշտ պատյաններ: Սա Kubernetes-ի գոյության պատճառներից մեկն է՝ երթուղիացում և բեռի հավասարակշռում։ Բայց ի՞նչ, եթե ձեզ ավելի նուրբ և բարդ երթուղի է պետք: Օրինակ՝ միաժամանակ օգտագործել միկրոսերվիսի երկու տարբերակ։ Ինչպե՞ս կարող են օգնել այստեղ Istio Route Rules-ը:

Երթուղային կանոնները այն կանոններն են, որոնք իրականում որոշում են երթուղու ընտրությունը: Անկախ համակարգի բարդության մակարդակից, այս կանոնների ընդհանուր գործառնական սկզբունքը մնում է պարզ. հարցումները ուղղորդվում են որոշակի պարամետրերի և HTTP վերնագրի արժեքների հիման վրա:
Դիտարկենք օրինակներ.

Kubernetes լռելյայն. չնչին «50/50»

Մեր օրինակում մենք ցույց կտանք, թե ինչպես կարելի է միաժամանակ օգտագործել միկրոսերվիսի երկու տարբերակ OpenShift-ում, եկեք դրանք անվանենք v1 և v2: Յուրաքանչյուր տարբերակ աշխատում է իր սեփական Kubernetes pod-ում և ըստ լռելյայն վարում է հավասարաչափ հավասարակշռված շրջանաձև երթուղի: Յուրաքանչյուր պատիճ ստանում է հարցումների իր բաժինը՝ հիմնվելով իր միկրոսերվիսների, այլ կերպ ասած՝ կրկնօրինակների քանակի վրա: Istio-ն թույլ է տալիս ձեռքով փոխել այս հաշվեկշիռը:

Ենթադրենք, մենք OpenShift-ում գործարկել ենք մեր առաջարկությունների ծառայության երկու տարբերակ՝ առաջարկություն-v1 և առաջարկություն-v2:
Նկ. Նկար 1-ը ցույց է տալիս, որ երբ յուրաքանչյուր ծառայություն ներկայացված է մեկ օրինակով, հարցումները հավասարապես փոխարինվում են դրանց միջև.

Մի շարք գրառումներ Istio Service Mesh-ում

Տարբերակների միջև կշռված բաշխում

Նկ. Նկար 2-ը ցույց է տալիս, թե ինչ է տեղի ունենում, եթե դուք ավելացնեք v2 ծառայության կրկնօրինակների թիվը մեկից երկուսի (սա արվում է oc սանդղակով — replicas=2 տեղակայում/առաջարկություն-v2 հրաման): Ինչպես տեսնում եք, v1-ի և v2-ի միջև հարցումներն այժմ բաժանված են մեկ-երեք հարաբերակցությամբ՝ 1-2-2-1-2-2-…:

Մի շարք գրառումներ Istio Service Mesh-ում

Անտեսեք տարբերակը՝ օգտագործելով Istio

Istio-ն հեշտացնում է հարցումների բաշխումը մեզ անհրաժեշտ ձևով փոխելը: Օրինակ, ուղարկեք ամբողջ տրաֆիկը միայն առաջարկություն-v1-ին՝ օգտագործելով հետևյալ Istio yaml ֆայլը.

Մի շարք գրառումներ Istio Service Mesh-ում

Այստեղ դուք պետք է ուշադրություն դարձնեք սրան. պատիճները ընտրվում են ըստ պիտակների: Մեր օրինակում օգտագործվում է v1 պիտակը: «Քաշ՝ 100» պարամետրը նշանակում է, որ երթևեկի 100%-ը կուղղվի դեպի բոլոր սպասարկման կետերը, որոնք ունեն v1 պիտակ:

Հրահանգների բաշխում տարբերակների միջև (Canary Deployment)

Հաջորդը, օգտագործելով քաշի պարամետրը, կարող եք ուղղորդել երթևեկությունը երկու պատիճների վրա՝ անտեսելով դրանցից յուրաքանչյուրում աշխատող միկրոսերվիսների քանակը: Օրինակ, այստեղ մենք ուղղում ենք տրաֆիկի 90%-ը դեպի v1 և 10% դեպի v2:

Մի շարք գրառումներ Istio Service Mesh-ում

Առանձին երթուղիացում բջջային օգտատերերի համար

Եզրափակելով՝ մենք ցույց կտանք, թե ինչպես ստիպել բջջային օգտատերերի տրաֆիկը ուղղորդել դեպի v2 ծառայություն, իսկ մնացած բոլորին՝ v1: Դա անելու համար մենք օգտագործում ենք կանոնավոր արտահայտություններ՝ հարցման վերնագրում օգտագործող-գործակալի արժեքը վերլուծելու համար.

Մի շարք գրառումներ Istio Service Mesh-ում

Հիմա ձեր հերթն է

Վերնագրերի վերլուծման կանոնավոր արտահայտություններով օրինակը պետք է ձեզ դրդի գտնել Istio երթուղային կանոնների ձեր սեփական օգտագործումը: Ավելին, այստեղ հնարավորությունները բավականին ընդարձակ են, քանի որ վերնագրի արժեքները կարող են ձևավորվել հավելվածի սկզբնական կոդում:

Եվ հիշեք, որ Ops-ը, ոչ թե Dev

Այն ամենը, ինչ մենք ցույց տվեցինք վերը նշված օրինակներում, արվում է առանց ելակետային կոդի ամենափոքր փոփոխության, բացառությամբ այն դեպքերի, երբ անհրաժեշտ է ստեղծել հատուկ հարցումների վերնագրեր: Istio-ն օգտակար կլինի ինչպես մշակողների համար, ովքեր, օրինակ, կկարողանան օգտագործել այն թեստավորման փուլում, այնպես էլ ՏՏ համակարգերի շահագործման մասնագետներին, որոնց համար այն մեծապես կօգնի արտադրության մեջ։

Այսպիսով, եկեք կրկնենք այս գրառումների շարքի լեյտմոտիվը. ձեզ հարկավոր չէ որևէ բան փոխել ձեր ծածկագրում. Նոր պատկերներ կառուցելու կամ նոր կոնտեյներներ գործարկելու կարիք չկա: Այս ամենն իրականացվում է կոդից դուրս։

Օգտագործեք ձեր երևակայությունը

Պարզապես պատկերացրեք վերնագրի վերլուծության հնարավորությունները՝ օգտագործելով կանոնավոր արտահայտություններ: Ցանկանում եք վերահղել ձեր ամենամեծ հաճախորդին ձեր հատուկ տարբերակին միկրոծառայություններ? Հեշտությամբ! Պե՞տք է առանձին տարբերակ Chrome բրաուզերի համար: Ոչ մի խնդիր! Դուք կարող եք երթևեկել ըստ գրեթե ցանկացած բնութագրիչի:

Փորձեք դա ինքներդ

Istio-ի, Kubernetes-ի և OpenShift-ի մասին կարդալը մի բան է, բայց ինչո՞ւ ինքներդ չդիպչել ամեն ինչին: Թիմ Red Hat ծրագրավորող ծրագիր պատրաստել է մանրամասն ուղեցույց (անգլերեն), որը կօգնի ձեզ հնարավորինս արագ տիրապետել այս տեխնոլոգիաներին։ Ձեռնարկը նույնպես 100% բաց կոդով է, ուստի այն տեղադրված է հանրային տիրույթում: Ֆայլն աշխատում է macOS-ի, Linux-ի և Windows-ի վրա, իսկ սկզբնական կոդը հասանելի է Java և node.js տարբերակներում (այլ լեզուներով տարբերակները շուտով): Պարզապես բացեք համապատասխան git պահոցը ձեր բրաուզերում Red Hat Developer Demo.

Հաջորդ գրառման մեջ՝ մենք գեղեցիկ ենք մշակում խնդիրները

Այսօր դուք տեսաք, թե ինչ կարող են անել Istio երթուղային կանոնները: Հիմա պատկերացրեք նույնը, բայց միայն սխալների հետ կապված: Սա հենց այն է, ինչի մասին մենք կխոսենք հաջորդ գրառման մեջ:

Source: www.habr.com

Добавить комментарий