Pinterest-ում kubernetes հարթակի ստեղծում

Տարիների ընթացքում Pinterest-ի 300 միլիոն օգտատերերը ստեղծել են ավելի քան 200 միլիարդ փին ավելի քան 4 միլիարդ տախտակների վրա: Օգտատերերի այս բանակը և բովանդակության հսկայական բազան սպասարկելու համար պորտալը մշակել է հազարավոր ծառայություններ՝ սկսած միկրոծառայություններից, որոնք կարող են կառավարվել մի քանի պրոցեսորների կողմից, մինչև հսկայական մոնոլիտներ, որոնք աշխատում են վիրտուալ մեքենաների մի ամբողջ նավատորմի վրա: Իսկ հետո եկավ պահը, երբ ընկերության հայացքն ընկավ k8-ների վրա։ Ինչու՞ «խորանարդը» լավ տեսք ուներ Pinterest-ում: Այս մասին կիմանաք մեր վերջին հոդվածի թարգմանությունից բլոգ Pinterest egeneering.

Pinterest-ում kubernetes հարթակի ստեղծում

Այսպիսով, հարյուր միլիոնավոր օգտվողներ և հարյուրավոր միլիարդավոր կապում: Օգտատերերի այս բանակը և բովանդակության հսկայական բազան սպասարկելու համար մենք մշակել ենք հազարավոր ծառայություններ՝ սկսած միկրոծառայություններից, որոնք կարող են կառավարվել մի քանի պրոցեսորների կողմից, մինչև հսկայական մոնոլիտներ, որոնք աշխատում են վիրտուալ մեքենաների ամբողջ նավատորմի վրա: Բացի այդ, մենք ունենք մի շարք շրջանակներ, որոնք կարող են պահանջել նաև պրոցեսոր, հիշողություն կամ մուտքի/ելք մուտք:

Գործիքների այս կենդանաբանական այգին պահպանելիս մշակողների թիմը բախվում է մի շարք մարտահրավերների.

  • Ինժեներների համար արտադրական միջավայր վարելու միասնական ձև չկա: Քաղաքացիություն չունեցող ծառայությունները, պետական ​​ծառայությունները և ակտիվ մշակվող նախագծերը հիմնված են բոլորովին այլ տեխնոլոգիական կույտերի վրա: Սա հանգեցրեց ինժեներների վերապատրաստման մի ամբողջ դասընթացի ստեղծմանը, ինչպես նաև լրջորեն բարդացնում է մեր ենթակառուցվածքային թիմի աշխատանքը:
  • Վիրտուալ մեքենաների սեփական նավատորմ ունեցող մշակողները հսկայական բեռ են ստեղծում ներքին ադմինիստրատորների վրա: Արդյունքում, այնպիսի պարզ գործողությունները, ինչպիսիք են OS-ի կամ AMI-ի թարմացումը, տևում են շաբաթներ և ամիսներ: Սա հանգեցնում է աշխատանքի ծանրաբեռնվածության ավելացմանը թվացյալ բացարձակապես առօրյա իրավիճակներում:
  • Համաշխարհային ենթակառուցվածքների կառավարման գործիքների ստեղծման դժվարություններ գոյություն ունեցող լուծումների վրա: Իրավիճակն ավելի է բարդանում նրանով, որ վիրտուալ մեքենաների տերերին գտնելը հեշտ չէ։ Այսինքն՝ մենք չգիտենք, թե արդյոք այս հզորությունը կարող է ապահով կերպով արդյունահանվել մեր ենթակառուցվածքի այլ մասերում գործելու համար:

Կոնտեյներային նվագախմբային համակարգերը ծանրաբեռնվածության կառավարումը միավորելու միջոց են: Դրանք բացում են զարգացման արագության բարձրացման դուռ և պարզեցնում ենթակառուցվածքների կառավարումը, քանի որ նախագծում ներգրավված բոլոր ռեսուրսները կառավարվում են մեկ կենտրոնացված համակարգի կողմից:

Pinterest-ում kubernetes հարթակի ստեղծում

Գծապատկեր 1. Ենթակառուցվածքի առաջնահերթություններ (հուսալիություն, մշակողի արտադրողականություն և արդյունավետություն):

Cloud Management Platform-ի թիմը Pinterest-ում հայտնաբերել է K8-ները 2017 թվականին: 2017 թվականի առաջին կեսին մենք փաստագրել էինք մեր արտադրական հնարավորությունների մեծ մասը, ներառյալ API-ն և մեր բոլոր վեբ սերվերները: Այնուհետև մենք իրականացրեցինք կոնտեյներային լուծումների կազմակերպման, կլաստերների կառուցման և դրանց հետ աշխատելու տարբեր համակարգերի մանրակրկիտ գնահատում: 2017-ի վերջին մենք որոշեցինք օգտագործել Kubernetes-ը։ Այն բավականին ճկուն էր և լայնորեն աջակցվում էր մշակողների համայնքում:

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

Kubernetes: The Pinterest Way

Kubernetes-ի հետ սկսելը Pinterest-ի մասշտաբով, որպես հարթակ, որը կցանկանային մեր ինժեներներին, ուղեկցվեց բազմաթիվ մարտահրավերներով:

Որպես խոշոր ընկերություն՝ մենք մեծ ներդրումներ ենք կատարել ենթակառուցվածքային գործիքների մեջ: Օրինակները ներառում են անվտանգության գործիքներ, որոնք կարգավորում են վկայականների մշակումը և բաշխումը, երթևեկության կառավարման բաղադրիչները, ծառայության հայտնաբերման համակարգերը, տեսանելիության բաղադրիչները և գրանցամատյանների և չափումների ուղարկման բաղադրիչները: Այս ամենը հավաքվել է մի պատճառով. մենք անցել ենք փորձության և սխալի սովորական ճանապարհը, և, հետևաբար, մենք ցանկանում էինք ինտեգրել այս ամբողջ սարքավորումը Kubernetes-ի նոր ենթակառուցվածքի մեջ՝ հին անիվը նոր հարթակի վրա նորից հայտնագործելու փոխարեն: Այս մոտեցումն ընդհանուր առմամբ պարզեցրեց միգրացիան, քանի որ հավելվածի ամբողջ աջակցությունն արդեն գոյություն ունի և կարիք չկա զրոյից ստեղծելու:

Մյուս կողմից, բեռի կանխատեսման մոդելները հենց Kubernetes-ում (ինչպիսիք են տեղակայումները, աշխատատեղերը և Daemon հավաքածուները) բավարար չեն մեր նախագծի համար: Օգտագործելիության այս խնդիրները հսկայական խոչընդոտներ են Kubernetes տեղափոխվելու համար: Օրինակ, մենք լսել ենք, որ ծառայությունների մշակողները բողոքում են մուտքի կարգավորումների բացակայության կամ սխալի մասին: Մենք հանդիպեցինք նաև կաղապարների շարժիչների սխալ օգտագործման, երբ հարյուրավոր օրինակներ ստեղծվեցին նույն ճշգրտմամբ և առաջադրանքով, ինչը հանգեցրեց մղձավանջային վրիպազերծման խնդիրների:

Շատ դժվար էր նաև նույն կլաստերում տարբեր տարբերակներ պահպանելը։ Պատկերացրեք հաճախորդների աջակցության բարդությունը, եթե ձեզ անհրաժեշտ է միաժամանակ աշխատել նույն գործարկման միջավայրի մի քանի տարբերակներում՝ իրենց բոլոր խնդիրներով, սխալներով և թարմացումներով:

Pinterest-ի օգտատերերի հատկությունները և վերահսկիչները

Մեր ինժեներների համար Kubernetes-ի ներդրումը հեշտացնելու և մեր ենթակառուցվածքը պարզեցնելու և արագացնելու համար մենք մշակել ենք մեր սեփական ռեսուրսների սահմանումները (CRD):

CRD-ները ապահովում են հետևյալ ֆունկցիոնալությունը.

  1. Համատեղելով տարբեր բնիկ Kubernetes ռեսուրսներ, որպեսզի նրանք աշխատեն որպես մեկ ծանրաբեռնվածություն: Օրինակ, PinterestService ռեսուրսը ներառում է տեղակայում, մուտքի ծառայություն և կազմաձևման քարտեզ: Սա թույլ է տալիս ծրագրավորողներին չանհանգստանալ DNS կարգավորելու մասին:
  2. Իրականացնել անհրաժեշտ հավելվածի աջակցություն: Օգտագործողը պետք է կենտրոնանա միայն կոնտեյների ճշգրտման վրա՝ ըստ իր բիզնես տրամաբանության, մինչդեռ CRD վերահսկիչը իրականացնում է բոլոր անհրաժեշտ սկզբնական կոնտեյներները, շրջակա միջավայրի փոփոխականները և pod բնութագրերը: Սա ծրագրավորողների համար ապահովում է հարմարավետության սկզբունքորեն տարբեր մակարդակ:
  3. CRD կարգավարները նաև կառավարում են բնիկ ռեսուրսների կյանքի ցիկլը և բարելավում վրիպազերծման հասանելիությունը: Սա ներառում է ցանկալի և իրական բնութագրերի համաձայնեցում, CRD կարգավիճակի թարմացում և իրադարձությունների մատյանների պահպանում և այլն: Առանց CRD-ի, մշակողները ստիպված կլինեն կառավարել բազմաթիվ ռեսուրսներ, ինչը միայն կբարձրացնի սխալի հավանականությունը:

Ահա PinterestService-ի և ներքին ռեսուրսի օրինակ, որը կառավարվում է մեր վերահսկիչի կողմից.

Pinterest-ում kubernetes հարթակի ստեղծում

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

Դժվար է պատկերացնել, որ մշակողները կցանկանան գրել այս կազմաձևման ֆայլերը ձեռքով, առանց CRD-ի աջակցության, էլ չենք խոսում կոնֆիգուրացիաների հետագա պահպանման և վրիպազերծման մասին:

Հավելվածի տեղակայման աշխատանքային ընթացքը

Pinterest-ում kubernetes հարթակի ստեղծում

Վերևի պատկերը ցույց է տալիս, թե ինչպես կարելի է տեղակայել Pinterest-ի մաքսային ռեսուրսը Kubernetes կլաստերում.

  1. Մշակողները համագործակցում են մեր Kubernetes կլաստերի հետ CLI-ի և օգտատիրոջ միջերեսի միջոցով:
  2. CLI/UI գործիքները առբերում են աշխատանքային հոսքի կազմաձևման YAML ֆայլերը և կառուցման այլ հատկություններ (նույն տարբերակի ID) Artifactory-ից և այնուհետև ներկայացնում դրանք Աշխատանքի ներկայացման ծառայությանը: Այս քայլը ապահովում է, որ միայն արտադրական տարբերակներն են առաքվում կլաստերին:
  3. JSS-ը դարպաս է տարբեր հարթակների համար, ներառյալ Kubernetes-ը: Այստեղ օգտատերը վավերացվում է, տրվում են քվոտաներ և մասամբ ստուգվում է մեր CRD-ի կոնֆիգուրացիան:
  4. JSS-ի կողմից CRD-ն ստուգելուց հետո տեղեկատվությունը ուղարկվում է k8s հարթակի API:
  5. Մեր CRD կարգավորիչը վերահսկում է իրադարձությունները օգտվողի բոլոր ռեսուրսների վրա: Այն փոխակերպում է CR-ները հայրենի k8s ռեսուրսների, ավելացնում է անհրաժեշտ մոդուլները, սահմանում է համապատասխան միջավայրի փոփոխականները և կատարում այլ օժանդակ աշխատանքներ՝ ապահովելու համար կոնտեյներային օգտագործողների հավելվածները բավարար ենթակառուցվածքային աջակցություն:
  6. Այնուհետև CRD կարգավորիչը ստացված տվյալները փոխանցում է Kubernetes API-ին, որպեսզի դրանք կարողանան մշակվել ժամանակացույցի կողմից և արտադրվել:

ՆշումՏեղակայման այս նախնական թողարկման աշխատանքային հոսքը ստեղծվել է նոր k8s հարթակի առաջին օգտատերերի համար: Ներկայումս մենք այս գործընթացը կատարելագործելու գործընթացում ենք՝ մեր նոր CI/CD-ին լիովին ինտեգրվելու համար: Սա նշանակում է, որ մենք չենք կարող ձեզ պատմել այն ամենը, ինչ կապված է Kubernetes-ի հետ: Մենք անհամբեր սպասում ենք կիսվել մեր փորձով և այս ուղղությամբ թիմի առաջընթացով մեր հաջորդ բլոգային գրառման մեջ՝ «Pinterest-ի համար CI/CD հարթակի կառուցում»:

Հատուկ ռեսուրսների տեսակները

Հիմնվելով Pinterest-ի հատուկ կարիքների վրա՝ մենք մշակել ենք հետևյալ CRD-ները՝ տարբեր աշխատանքային հոսքերին համապատասխանելու համար.

  • PinterestService-ը քաղաքացիություն չունեցող ծառայություններ են, որոնք գործում են երկար ժամանակ: Մեր հիմնական համակարգերից շատերը հիմնված են նման ծառայությունների մի շարքի վրա:
  • PinterestJobSet-ը մոդելավորում է ամբողջական ցիկլի խմբաքանակի աշխատանքներ: Pinterest-ի ընդհանուր սցենարն այն է, որ մի քանի աշխատատեղեր զուգահեռաբար աշխատում են նույն կոնտեյներով՝ անկախ այլ նմանատիպ գործընթացներից:
  • PinterestCronJob-ը լայնորեն օգտագործվում է փոքր պարբերական բեռների հետ միասին: Սա փաթաթված է բնիկ cron աշխատանքի համար Pinterest-ի աջակցման մեխանիզմներով, որոնք պատասխանատու են անվտանգության, երթևեկության, տեղեկամատյանների և չափումների համար:
  • PinterestDaemon-ը ներառում է ենթակառուցվածքային Դեմոններ: Այս ընտանիքը շարունակում է աճել, քանի որ մենք ավելի շատ աջակցություն ենք ավելացնում մեր կլաստերներին:
  • PinterestTrainingJob-ը տարածվում է Tensorflow և Pytorch պրոցեսների վրա՝ ապահովելով գործարկման ժամանակի նույն մակարդակը, ինչ մյուս բոլոր CRD-ները: Քանի որ Pinterest-ը ակտիվորեն օգտագործում է Tensorflow-ը և մեքենայական ուսուցման այլ համակարգեր, մենք պատճառ ունեինք դրանց շուրջ ստեղծելու առանձին CRD:

Մենք նաև աշխատում ենք PinterestStatefulSet-ի վրա, որը շուտով կհարմարեցվի տվյալների պահեստների և պետական ​​այլ համակարգերի համար:

Runtime աջակցություն

Երբ հավելվածի pod-ն աշխատում է Kubernetes-ում, այն ավտոմատ կերպով ստանում է ինքն իրեն ճանաչելու վկայական: Այս վկայագիրը օգտագործվում է գաղտնի պահեստ մուտք գործելու կամ mTLS-ի միջոցով այլ ծառայությունների հետ հաղորդակցվելու համար: Միևնույն ժամանակ, Container Init Configurator-ը և Daemon-ը կներբեռնեն բոլոր անհրաժեշտ կախվածությունները՝ նախքան բեռնարկղային հավելվածը գործարկելը: Երբ ամեն ինչ պատրաստ է, երթևեկության կողային սայլը և Daemon-ը կգրանցեն մոդուլի IP հասցեն մեր Zookeeper-ում, որպեսզի հաճախորդները կարողանան հայտնաբերել այն: Այս ամենը կաշխատի, քանի որ ցանցային մոդուլը կազմաձևվել է մինչև հավելվածի գործարկումը:

Վերոնշյալները աշխատանքային ծանրաբեռնվածության համար գործարկման ժամանակի աջակցության բնորոշ օրինակներ են: Աշխատանքային բեռների այլ տեսակներ կարող են պահանջել մի փոքր այլ աջակցություն, բայց դրանք բոլորն էլ գալիս են pod-level sidecars, node-level կամ վիրտուալ մեքենայի մակարդակի Daemons-ի տեսքով: Մենք ապահովում ենք, որ այս ամենը տեղակայվի կառավարման ենթակառուցվածքում և հետևողական լինի բոլոր հավելվածներում, ինչը, ի վերջո, զգալիորեն նվազեցնում է բեռը տեխնիկական աշխատանքի և հաճախորդների աջակցության առումով:

Թեստավորում և ՈԱ

Մենք կառուցեցինք ծայրից ծայր փորձնական խողովակաշար՝ գոյություն ունեցող Kubernetes փորձարկման ենթակառուցվածքի վերևում: Այս թեստերը վերաբերում են մեր բոլոր կլաստերներին: Մեր խողովակաշարն անցել է բազմաթիվ վերանայումների միջով, նախքան այն դառնալով արտադրանքի կլաստերի մաս:

Բացի թեստավորման համակարգերից, մենք ունենք մոնիտորինգի և ահազանգման համակարգեր, որոնք մշտապես վերահսկում են համակարգի բաղադրիչների կարգավիճակը, ռեսուրսների սպառումը և այլ կարևոր ցուցանիշները՝ տեղեկացնելով մեզ միայն այն դեպքում, երբ անհրաժեշտ է մարդկային միջամտություն:

Այլընտրանքները

Մենք դիտարկեցինք հատուկ ռեսուրսների որոշ այլընտրանքներ, ինչպիսիք են մուտացիայի հասանելիության կարգավորիչները և կաղապարային համակարգերը: Այնուամենայնիվ, դրանք բոլորն ունեն զգալի գործառնական մարտահրավերներ, ուստի մենք ընտրեցինք CRD երթուղին:

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

Նշում: Կաղապարային համակարգերը, ինչպիսիք են Helm գծապատկերները, նույնպես լայնորեն օգտագործվում են նմանատիպ կոնֆիգուրացիաներով հավելվածներ գործարկելու համար: Այնուամենայնիվ, մեր աշխատանքային հավելվածները չափազանց բազմազան են՝ կաղապարների միջոցով կառավարելու համար: Նաև շարունակական տեղակայման ժամանակ կաղապարներ օգտագործելիս չափազանց շատ սխալներ կլինեն:

Առաջիկա աշխատանք

Ներկայումս մենք գործ ունենք խառը բեռի հետ մեր բոլոր կլաստերներում: Տարբեր տեսակի և չափերի նման գործընթացներին աջակցելու համար մենք աշխատում ենք հետևյալ ոլորտներում.

  • Կլաստերների հավաքածուն լայնածավալ ծրագրեր է բաշխում տարբեր կլաստերների վրա՝ մասշտաբայնության և կայունության համար:
  • Կլաստերների կայունության, մասշտաբայնության և տեսանելիության ապահովում՝ հավելվածների միացում և SLA-ներ ստեղծելու համար:
  • Ռեսուրսների և քվոտաների կառավարում, որպեսզի հավելվածները չհակասեն միմյանց, և կլաստերի մասշտաբը վերահսկվի մեր կողմից:
  • Նոր CI/CD հարթակ՝ Kubernetes-ում հավելվածների աջակցման և տեղակայման համար:

Source: www.habr.com

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