Pinterest-те kubernetes платформасын жасау

Осы жылдар ішінде Pinterest-тің 300 миллион пайдаланушысы 200 миллиардтан астам тақтада 4 миллиардтан астам түйреуіш жасады. Осы пайдаланушылар армиясына және кең мазмұндық базаға қызмет көрсету үшін портал бірнеше орталық процессорлар басқара алатын микросервистерден бастап виртуалды машиналардың бүкіл паркінде жұмыс істейтін алып монолиттерге дейінгі мыңдаған қызметтерді әзірледі. Содан кейін компанияның көзқарасы k8-ге түскен сәт келді. Неліктен «текше» Pinterest-те жақсы көрінді? Сіз бұл туралы біздің соңғы мақаланың аудармасынан біле аласыз блог Pinterest инженерия.

Pinterest-те kubernetes платформасын жасау

Сонымен, жүздеген миллион пайдаланушылар және жүздеген миллиард түйреуіштер. Осы пайдаланушылар армиясына және кең мазмұндық базаға қызмет көрсету үшін біз бірнеше орталық процессорлар басқара алатын микросервистерден бастап виртуалды машиналардың бүкіл паркінде жұмыс істейтін алып монолиттерге дейінгі мыңдаған қызметтерді әзірледік. Бұған қоса, бізде процессорды, жадты немесе енгізу/шығару қатынасын қажет ететін әртүрлі фреймворктар бар.

Бұл хайуанаттар бағын сақтауда әзірлеушілер тобы бірқатар қиындықтарға тап болады:

  • Инженерлер үшін өндірістік ортаны басқарудың біркелкі тәсілі жоқ. Азаматтығы жоқ қызметтер, мемлекеттік қызметтер және белсенді дамып жатқан жобалар мүлдем басқа технологиялық стектерге негізделген. Бұл инженерлер үшін толық курстың құрылуына әкелді, сонымен қатар біздің инфрақұрылымдық команданың жұмысын айтарлықтай қиындатады.
  • Өзінің виртуалды машиналар паркі бар әзірлеушілер ішкі әкімшілерге үлкен жүктеме жасайды. Нәтижесінде ОЖ немесе AMI жаңарту сияқты қарапайым операциялар апталар мен айларды алады. Бұл күнделікті болып көрінетін жағдайларда жұмыс жүктемесінің артуына әкеледі.
  • Қолданыстағы шешімдердің үстіне жаһандық инфрақұрылымды басқару құралдарын құрудағы қиындықтар. Виртуалды машиналардың иелерін табу оңай емес болғандықтан, жағдай одан әрі қиындады. Яғни, біз бұл қуатты инфрақұрылымымыздың басқа бөліктерінде жұмыс істеу үшін қауіпсіз түрде алуға болатынын білмейміз.

Контейнерлік оркестрлік жүйелер жұмыс жүктемесін басқаруды біріздендіру тәсілі болып табылады. Олар даму жылдамдығын арттыруға және инфрақұрылымды басқаруды жеңілдетуге есік ашады, өйткені жобаға тартылған барлық ресурстар бір орталықтандырылған жүйемен басқарылады.

Pinterest-те kubernetes платформасын жасау

1-сурет: Инфрақұрылым басымдықтары (сенімділік, әзірлеушілердің өнімділігі және тиімділік).

Pinterest-тегі Cloud Management Platform командасы K8 құрылғыларын 2017 жылы тапты. 2017 жылдың бірінші жартыжылдығында біз API және барлық веб-серверлерімізді қоса алғанда, өндірістік мүмкіндіктеріміздің көпшілігін құжаттадық. Содан кейін біз контейнерлік шешімдерді ұйымдастыруға, кластерлерді құруға және олармен жұмыс істеуге арналған әртүрлі жүйелерді мұқият бағалауды жүргіздік. 2017 жылдың соңына қарай біз Kubernetes пайдалануды шештік. Ол өте икемді болды және әзірлеушілер қауымдастығында кеңінен қолдау тапты.

Бүгінгі күні біз Kops негізінде өзіміздің кластерлік жүктеу құралдарын құрдық және желі, қауіпсіздік, метрика, журнал жүргізу, сәйкестендіруді басқару және Kubernetes-ке трафик сияқты бар инфрақұрылымдық құрамдастарды көшірдік. Біз сондай-ақ ресурсымыз үшін жұмыс жүктемесін модельдеу жүйесін енгіздік, оның күрделілігі әзірлеушілерден жасырылады. Қазір біз кластердің тұрақтылығын қамтамасыз етуге, оны масштабтауға және жаңа клиенттерді қосуға бағытталғанбыз.

Кубернетес: Pinterest жолы

Біздің инженерлерге ұнайтын платформа ретінде Pinterest ауқымында Kubernetes-ті бастау көптеген қиындықтарға тап болды.

Ірі компания ретінде біз инфрақұрылым құралдарына көп инвестиция салдық. Мысалдар сертификатты өңдеуді және кілтті таратуды өңдейтін қауіпсіздік құралдарын, трафикті басқару құрамдастарын, қызметті табу жүйелерін, көріну құрамдастарын және журнал мен көрсеткіштерді жіберу құрамдастарын қамтиды. Мұның бәрі бір себеппен жиналды: біз сынақ пен қателіктің қалыпты жолынан өттік, сондықтан біз ескі дөңгелекті жаңа платформада қайта ойлап табудың орнына осы жабдықтың барлығын Кубернетестегі жаңа инфрақұрылымға біріктіргіміз келді. Бұл тәсіл тұтастай алғанда тасымалдауды жеңілдетеді, өйткені барлық қолданбаларды қолдау бұрыннан бар және оны нөлден жасау қажет емес.

Екінші жағынан, Kubernetes ішіндегі жүктемені болжау үлгілері (орналастырулар, жұмыс орындары және Daemon жинақтары сияқты) біздің жобамыз үшін жеткіліксіз. Бұл ыңғайлылық мәселелері Кубернетеске көшу үшін үлкен кедергілер болып табылады. Мысалы, қызмет әзірлеушілерінің кіру параметрлері жоқ немесе дұрыс емес деп шағымданғанын естідік. Жүздеген көшірмелер бірдей спецификациямен және тапсырмамен жасалған кезде, біз шаблондық қозғалтқыштарды дұрыс пайдаланбаған кезде де кездестік, бұл қорқынышты жөндеу мәселелеріне әкелді.

Бір кластерде әртүрлі нұсқаларды сақтау өте қиын болды. Бір орындалу ортасының бірнеше нұсқаларында, олардың барлық мәселелерімен, қателерімен және жаңартуларымен бір уақытта жұмыс істеу қажет болса, тұтынушыларға қолдау көрсетудің күрделілігін елестетіп көріңіз.

Pinterest пайдаланушы сипаттары және контроллерлері

Инженерлерімізге Kubernetes-ті енгізуді жеңілдету және инфрақұрылымымызды жеңілдету және жылдамдату үшін біз өзіміздің пайдаланушы ресурс анықтамаларын (CRD) жасадық.

CRD келесі функцияларды қамтамасыз етеді:

  1. Бірыңғай жұмыс жүктемесі ретінде жұмыс істейтіндей әртүрлі жергілікті Kubernetes ресурстарын біріктіру. Мысалы, PinterestService ресурсы орналастыруды, кіру қызметін және конфигурация картасын қамтиды. Бұл әзірлеушілерге DNS орнату туралы алаңдамауға мүмкіндік береді.
  2. Қажетті қолданбалы қолдауды іске қосыңыз. Пайдаланушы бизнес логикасына сәйкес тек контейнер спецификациясына назар аударуы керек, ал CRD контроллері барлық қажетті бастапқы контейнерлерін, орта айнымалы мәндерін және подкаст сипаттамаларын жүзеге асырады. Бұл әзірлеушілерге жайлылықтың түбегейлі басқа деңгейін қамтамасыз етеді.
  3. CRD контроллері сонымен қатар жергілікті ресурстардың өмірлік циклін басқарады және жөндеудің қолжетімділігін жақсартады. Бұған қажетті және нақты сипаттамаларды сәйкестендіру, CRD күйін жаңарту және оқиғалар журналдарын жүргізу және т.б. кіреді. CRD болмаса, әзірлеушілер бірнеше ресурстарды басқаруға мәжбүр болады, бұл тек қате ықтималдығын арттырады.

Мұнда біздің контроллер басқаратын PinterestService және ішкі ресурс мысалы келтірілген:

Pinterest-те kubernetes платформасын жасау

Жоғарыда көріп отырғаныңыздай, пайдаланушы контейнеріне қолдау көрсету үшін қауіпсіздікті, көрінуді және желілік трафикті қамтамасыз ету үшін init контейнерін және бірнеше қондырмаларды біріктіру қажет. Сонымен қатар, біз конфигурация картасы үлгілерін жасадық және пакеттік тапсырмаларға арналған PVC үлгілеріне қолдауды жүзеге асырдық, сонымен қатар сәйкестендіруді, ресурстарды тұтынуды және қоқыс жинауды қадағалау үшін бірнеше орта айнымалыларын қадағалау.

Әзірлеушілер бұл конфигурация файлдарын CRD қолдауынсыз қолмен жазғысы келетінін елестету қиын.

Қолданбаны орналастыру жұмыс процесі

Pinterest-те kubernetes платформасын жасау

Жоғарыдағы сурет Kubernetes кластеріне Pinterest реттелетін ресурсын қалай орналастыру керектігін көрсетеді:

  1. Әзірлеушілер біздің Kubernetes кластерімен CLI және пайдаланушы интерфейсі арқылы өзара әрекеттеседі.
  2. CLI/UI құралдары жұмыс процесі конфигурациясының YAML файлдарын және басқа құрастыру сипаттарын (бір нұсқа идентификаторы) Artifactory жүйесінен шығарып алады, содан кейін оларды Тапсырманы жіберу қызметіне жібереді. Бұл қадам кластерге тек өндіріс нұсқаларының жеткізілуін қамтамасыз етеді.
  3. JSS - әртүрлі платформалар үшін, соның ішінде Kubernetes үшін шлюз. Мұнда пайдаланушы аутентификацияланады, квоталар шығарылады және біздің CRD конфигурациясы ішінара тексеріледі.
  4. JSS жағында CRD тексергеннен кейін ақпарат k8s платформасының API-ге жіберіледі.
  5. Біздің CRD контроллеріміз барлық пайдаланушы ресурстарындағы оқиғаларды бақылайды. Ол CR-ді жергілікті k8s ресурстарына түрлендіреді, қажетті модульдерді қосады, сәйкес орта айнымалы мәндерін орнатады және контейнерленген пайдаланушы қолданбаларында жеткілікті инфрақұрылымдық қолдау болуын қамтамасыз ету үшін басқа қолдау жұмыстарын орындайды.
  6. Содан кейін CRD контроллері қабылданған деректерді жоспарлаушы өңдеп, өндіріске енгізу үшін Kubernetes API-ге жібереді.

ескерту: Бұл орналастырудың шығарылым алдындағы жұмыс ағыны жаңа k8s платформасының алғашқы пайдаланушылары үшін жасалған. Қазіргі уақытта біз жаңа CI/CD-мен толық біріктіру үшін бұл процесті нақтылау үстіндеміз. Бұл Кубернетеске қатысты бәрін айта алмаймыз дегенді білдіреді. «Pinterest үшін CI/CD платформасын құру» атты келесі блог жазбамызда тәжірибемізбен және команданың осы бағыттағы жетістіктерімен бөлісуді асыға күтеміз.

Арнайы ресурстардың түрлері

Pinterest-тің ерекше қажеттіліктеріне сүйене отырып, біз әртүрлі жұмыс процестеріне сәйкес келетін келесі CRD-ларды жасадық:

  • PinterestService — ұзақ уақыт бойы жұмыс істеп тұрған азаматтығы жоқ қызметтер. Біздің көптеген негізгі жүйелеріміз осындай қызметтер жиынтығына негізделген.
  • PinterestJobSet толық циклды пакеттік тапсырмаларды модельдейді. Pinterest-тегі жалпы сценарий - басқа ұқсас процестерге қарамастан, бірнеше жұмыс бірдей контейнерлерді параллельді іске қосады.
  • PinterestCronJob шағын мерзімді жүктемелермен бірге кеңінен қолданылады. Бұл қауіпсіздік, трафик, журналдар мен көрсеткіштерге жауап беретін Pinterest қолдау механизмдерімен жергілікті cron жұмысына арналған қаптама.
  • PinterestDaemon құрамына Daemon инфрақұрылымы кіреді. Бұл отбасы өсуде, өйткені біз кластерлерімізге көбірек қолдау көрсетеміз.
  • PinterestTrainingJob Tensorflow және Pytorch процестеріне дейін кеңейіп, барлық басқа CRD құрылғыларымен бірдей орындалу уақытын қолдау деңгейін қамтамасыз етеді. Pinterest Tensorflow және басқа машиналық оқыту жүйелерін белсенді түрде пайдаланатындықтан, бізде олардың айналасында жеке CRD құруға себеп болды.

Біз сондай-ақ жақын арада деректер қоймалары мен басқа күйі бар жүйелерге бейімделетін PinterestStatefulSet бойынша жұмыс істеп жатырмыз.

Орындау уақытын қолдау

Қолданба подкрыты Kubernetes жүйесінде жұмыс істегенде, ол өзін анықтау үшін автоматты түрде сертификат алады. Бұл сертификат құпия жадқа кіру немесе mTLS арқылы басқа қызметтермен байланысу үшін пайдаланылады. Сонымен қатар, контейнерлік бағдарламаны іске қоспас бұрын Container Init конфигураторы мен Daemon барлық қажетті тәуелділіктерді жүктеп алады. Барлығы дайын болғанда, трафиктің серігі мен Демон модульдің IP мекенжайын Zookeeper-ге тіркейді, осылайша клиенттер оны таба алады. Мұның бәрі желілік модуль қолданбаны іске қоспас бұрын конфигурацияланғандықтан жұмыс істейді.

Жоғарыда жұмыс жүктемелері үшін орындау уақытын қолдаудың типтік мысалдары берілген. Жұмыс жүктемелерінің басқа түрлері сәл басқаша қолдауды қажет етуі мүмкін, бірақ олардың барлығы под-деңгейдегі бүйірлік тақталар, түйін деңгейіндегі немесе виртуалды машина деңгейіндегі демондар түрінде келеді. Біз мұның барлығы басқару инфрақұрылымында орналастырылғанын және қолданбалар арасында сәйкес келетінін қамтамасыз етеміз, бұл сайып келгенде, техникалық жұмыс пен тұтынушыларды қолдауға қатысты жүктемені айтарлықтай азайтады.

Тестілеу және QA

Біз бұрыннан бар Kubernetes сынақ инфрақұрылымының үстіне ұшты сынақ құбырын салдық. Бұл сынақтар біздің барлық кластерлерімізге қолданылады. Біздің құбырымыз өнім кластерінің бөлігі болғанға дейін көптеген қайта қараулардан өтті.

Тестілеу жүйелерінен басқа, бізде жүйе құрамдастарының күйін, ресурстарды тұтынуды және басқа да маңызды көрсеткіштерді үнемі қадағалайтын, адамның араласуы қажет болғанда ғана хабарлайтын бақылау және ескерту жүйелері бар.

Баламалар

Біз мутацияға қол жеткізу контроллері және үлгі жүйелері сияқты пайдаланушы ресурстарының кейбір баламаларын қарастырдық. Дегенмен, олардың барлығында айтарлықтай операциялық қиындықтар туындайды, сондықтан біз CRD бағытын таңдадық.

Мутациялы қабылдау контроллері бүйірлік арбаларды, орта айнымалыларын және басқа жұмыс уақытын қолдауды енгізу үшін пайдаланылды. Дегенмен, ол CRD-де мұндай мәселелер туындамайтын ресурстарды байланыстыру және өмірлік циклді басқару сияқты әртүрлі мәселелерге тап болды.

Ескертпе: Helm диаграммалары сияқты үлгілік жүйелер де конфигурациялары ұқсас қолданбаларды іске қосу үшін кеңінен қолданылады. Дегенмен, біздің жұмыс қолданбаларымыз үлгілер арқылы басқару үшін тым әртүрлі. Сондай-ақ үздіксіз орналастыру кезінде үлгілерді пайдалану кезінде қателер тым көп болады.

Алдағы жұмыс

Біз қазір барлық кластерлерімізде аралас жүктемемен айналысамыз. Әртүрлі типтегі және өлшемдегі осындай процестерді қолдау үшін біз келесі бағыттар бойынша жұмыс істейміз:

  • Кластерлер жинағы ауқымдылық пен тұрақтылық үшін әртүрлі кластерлер бойынша үлкен қолданбаларды таратады.
  • Қолданба қосылымын және SLAs жасау үшін кластердің тұрақтылығын, ауқымдылығын және көрінуін қамтамасыз ету.
  • Қолданбалар бір-біріне қайшы келмеуі үшін ресурстар мен квоталарды басқару және кластердің масштабы біздің тарапымыздан бақыланады.
  • Kubernetes жүйесінде қолданбаларды қолдауға және орналастыруға арналған жаңа CI/CD платформасы.

Ақпарат көзі: www.habr.com

пікір қалдыру