Nyiptakeun platform kubernetes dina Pinterest

Salila sababaraha taun, 300 juta pangguna Pinterest parantos nyiptakeun langkung ti 200 milyar pin dina langkung ti 4 milyar papan. Pikeun ngalayanan tentara ieu pamaké sarta base eusi vast, portal geus ngembangkeun rébuan jasa, mimitian ti microservices nu bisa diatur ku sababaraha CPUs, mun monoliths raksasa nu ngajalankeun dina sakabéh armada mesin virtual. Lajeng momen sumping nalika panon parusahaan murag kana k8s. Naha "kubus" katingali saé dina Pinterest? Anjeun bakal diajar ngeunaan ieu tina tarjamahan kami tina artikel panganyarna tina blog Pinterest rékayasa.

Nyiptakeun platform kubernetes dina Pinterest

Janten, ratusan juta pangguna sareng ratusan milyar pin. Pikeun ngalayanan tentara ieu pamaké sarta base eusi vast, kami geus ngembangkeun rébuan jasa, mimitian ti microservices nu bisa diatur ku sababaraha CPUs, mun monoliths raksasa nu ngajalankeun on sakabéh armada mesin virtual. Sajaba ti éta, urang boga rupa-rupa frameworks nu ogé bisa merlukeun CPU, memori, atawa aksés I / O.

Dina ngajaga kebon binatang ieu pakakas, tim pamekaran nyanghareupan sababaraha tantangan:

  • Teu aya cara anu seragam pikeun insinyur pikeun ngajalankeun lingkungan produksi. Ladenan stateless, jasa Stateful sarta proyék dina ngembangkeun aktip dumasar kana tumpukan téhnologi lengkep béda. Ieu nyababkeun nyiptakeun sadaya kursus pelatihan pikeun insinyur, sareng ogé ngahesekeun padamelan tim infrastruktur urang.
  • Pamekar sareng armada mesin virtual sorangan nyiptakeun beban anu ageung pikeun pangurus internal. Hasilna, operasi basajan sapertos ngamutahirkeun OS atanapi AMI butuh sababaraha minggu sareng bulan. Ieu nyababkeun kanaékan beban kerja dina kaayaan anu katingalina sapopoe.
  • Kasesahan dina nyiptakeun alat manajemén infrastruktur global di luhur solusi anu aya. Kaayaan ieu langkung pajeulit ku kanyataan yén milarian pamilik mesin virtual henteu gampang. Nyaéta, urang henteu terang naha kapasitas ieu tiasa aman diekstrak pikeun beroperasi di bagian séjén infrastruktur urang.

Sistem orkestrasi wadah mangrupikeun cara pikeun ngahijikeun manajemén beban kerja. Aranjeunna muka panto pikeun ningkatkeun laju pangwangunan sareng nyederhanakeun manajemén infrastruktur, sabab sadaya sumber daya anu aya dina proyék éta diurus ku hiji sistem terpusat.

Nyiptakeun platform kubernetes dina Pinterest

Gambar 1: Prioritas Infrastruktur (reliabilitas, produktivitas pamekar, sareng efisiensi).

Tim Platform Manajemén Awan di Pinterest mendakan K8 dina 2017. Dina satengah munggaran 2017, kami parantos ngadokumentasikeun kalolobaan kamampuan produksi urang, kalebet API sareng sadaya pangladén wéb kami. Sanggeus éta, urang ngalaksanakeun hiji assessment teleb tina sagala rupa sistem pikeun orchestrating solusi wadahna, ngawangun klaster sarta gawé bareng aranjeunna. Nepi ka ahir 2017, urang mutuskeun pikeun ngagunakeun Kubernetes. Éta cukup fleksibel sareng dirojong sacara lega di komunitas pamekar.

Nepi ka ayeuna, kami parantos ngawangun alat boot cluster sorangan dumasar kana Kops sareng migrasi komponén infrastruktur anu aya sapertos jejaring, kaamanan, métrik, logging, manajemén identitas, sareng lalu lintas ka Kubernetes. Urang ogé nerapkeun sistem modeling workload pikeun sumberdaya urang, pajeulitna nu disumputkeun ti developer. Ayeuna kami difokuskeun pikeun mastikeun stabilitas klaster, skala sareng nyambungkeun klien anyar.

Kubernetes: The Pinterest Way

Ngamimitian ku Kubernetes dina skala Pinterest salaku platform anu bakal dipikacinta ku insinyur urang datang sareng seueur tantangan.

Salaku perusahaan ageung, kami parantos investasi pisan dina alat infrastruktur. Conto kalebet alat kaamanan anu nanganan sertipikat sareng distribusi konci, komponén kontrol lalu lintas, sistem panemuan jasa, komponén visibilitas, sareng komponén kiriman log sareng métrik. Sadaya ieu dikumpulkeun pikeun alesan: urang indit ngaliwatan jalur normal trial and error, sarta ku kituna urang hayang ngahijikeun sakabeh parabot ieu kana infrastruktur anyar dina Kubernetes tinimbang reinventing kabayang heubeul dina platform anyar. Pendekatan ieu sacara umum nyederhanakeun migrasi, sabab sadaya pangrojong aplikasi parantos aya sareng henteu kedah didamel ti mimiti.

Di sisi séjén, modél ramalan beban di Kubernetes sorangan (sapertos panyebaran, padamelan, sareng set Daemon) henteu cekap pikeun proyék kami. Masalah usability ieu mangrupikeun halangan anu ageung pikeun ngalih ka Kubernetes. Contona, urang geus ngadéngé pamekar ladenan ngawadul ngeunaan leungit atawa salah setelan login. Urang encountered ogé pamakéan lepat mesin template, lamun ratusan salinan dijieun kalawan spésifikasi sarua jeung tugas, nu nyababkeun masalah debugging ngimpina.

Éta ogé hésé pisan pikeun ngajaga versi anu béda dina klaster anu sami. Bayangkeun pajeulitna dukungan palanggan upami anjeun kedah damel sakaligus dina sababaraha vérsi lingkungan runtime anu sami, sareng sadaya masalahna, bug sareng apdet.

Pinterest Pasipatan pamaké sarta Controllers

Pikeun ngagampangkeun insinyur urang pikeun nerapkeun Kubernetes, sareng nyederhanakeun sareng nyepetkeun prasarana, kami parantos ngembangkeun definisi sumberdaya khusus (CRD).

CRDs nyadiakeun pungsi handap:

  1. Ngagabungkeun sumber daya Kubernetes asli anu béda-béda supados tiasa dianggo salaku beban kerja tunggal. Contona, sumberdaya PinterestService ngawengku hiji deployment, layanan login, sarta peta konfigurasi. Hal ieu ngamungkinkeun pamekar teu salempang ngeunaan nyetel DNS.
  2. Laksanakeun pangrojong aplikasi anu diperyogikeun. Pamaké kudu difokuskeun ukur spésifikasi wadahna nurutkeun logika bisnis maranéhanana, bari controller CRD implements sakabeh wadahna init perlu, variabel lingkungan jeung spésifikasi pod. Ieu nyadiakeun tingkat kanyamanan fundamentally béda pikeun pamekar.
  3. Pengendali CRD ogé ngatur siklus hirup sumberdaya asli sareng ningkatkeun kasadiaan debug. Ieu kalebet reconciling spésifikasi anu dipikahoyong sareng aktual, ngamutahirkeun status CRD sareng ngajaga log acara, sareng seueur deui. Tanpa CRD, pamekar bakal kapaksa ngatur sababaraha sumber, nu ngan bakal ngaronjatkeun likelihood kasalahan.

Ieu conto PinterestService sareng sumber internal anu dikokolakeun ku controller kami:

Nyiptakeun platform kubernetes dina Pinterest

Sakumaha anjeun tiasa tingali di luhur, pikeun ngadukung wadah khusus urang kedah ngahijikeun wadah init sareng sababaraha tambihan pikeun nyayogikeun kaamanan, pisibilitas, sareng lalu lintas jaringan. Salaku tambahan, kami nyiptakeun témplat peta konfigurasi sareng ngalaksanakeun dukungan pikeun témplat PVC pikeun padamelan bets, ogé ngalacak sababaraha variabel lingkungan pikeun ngalacak identitas, konsumsi sumber daya, sareng koleksi sampah.

Hésé ngabayangkeun yén pamekar hoyong nyerat file konfigurasi ieu ku tangan tanpa dukungan CRD, sumawona langkung ngajaga sareng debug konfigurasi.

Alur kerja panyebaran aplikasi

Nyiptakeun platform kubernetes dina Pinterest

Gambar di luhur nunjukkeun kumaha cara nyebarkeun sumberdaya khusus Pinterest kana klaster Kubernetes:

  1. Pamekar berinteraksi sareng klaster Kubernetes kami ngalangkungan CLI sareng antarmuka pangguna.
  2. Alat CLI/UI nyandak file YAML konfigurasi alur kerja sareng sipat ngawangun anu sanés (ID versi anu sami) ti Artifactory teras kirimkeun ka Service Submission Job. Léngkah ieu mastikeun yén ngan ukur versi produksi anu dikirimkeun ka kluster.
  3. JSS mangrupikeun gateway pikeun sababaraha platform, kalebet Kubernetes. Di dieu pangguna dioténtikasi, kuota dikaluarkeun sareng konfigurasi CRD kami sawaréh dipariksa.
  4. Saatos mariksa CRD di sisi JSS, informasi dikirim ka API platform k8s.
  5. Controller CRD kami ngawas acara dina sadaya sumber daya pangguna. Ieu ngarobah CRs kana sumberdaya k8s asli, nambahkeun modul diperlukeun, susunan variabel lingkungan luyu, sarta ngalakukeun karya rojongan séjén pikeun mastikeun aplikasi pamaké containerized boga rojongan infrastruktur cukup.
  6. Kontroler CRD teras ngirimkeun data anu ditampi ka API Kubernetes supados tiasa diolah ku scheduler sareng dilebetkeun kana produksi.

nyarios: aliran karya pre-release ieu deployment dijieun pikeun pamaké mimiti platform k8s anyar. Kami ayeuna nuju prosés nyaring prosés ieu pikeun ngahijikeun lengkep sareng CI / CD anyar kami. Ieu ngandung harti yén urang teu bisa ngabejaan Anjeun sagalana patali Kubernetes. Kami ngarepkeun ngabagi pangalaman sareng kamajuan tim dina arah ieu dina tulisan blog salajengna urang, "Ngawangun platform CI / CD pikeun Pinterest."

Jenis sumberdaya husus

Dumasar kabutuhan husus Pinterest urang, kami geus ngembangkeun CRDs handap pikeun nyocogkeun workflows béda:

  • PinterestService mangrupakeun ladenan stateless nu geus ngajalankeun pikeun lila. Seueur sistem inti urang dumasar kana sakumpulan jasa sapertos kitu.
  • PinterestJobSet model jobs bets siklus pinuh. Skenario umum dina Pinterest nyaéta sababaraha padamelan ngajalankeun wadah anu sami paralel, henteu paduli prosés anu sami.
  • PinterestCronJob loba dipaké ditéang jeung beban periodik leutik. Ieu mangrupikeun bungkus pikeun karya cron asli sareng mékanisme dukungan Pinterest anu tanggung jawab pikeun kaamanan, lalu lintas, log sareng métrik.
  • PinterestDaemon ngawengku Daemons infrastruktur. Kulawarga ieu terus tumuwuh nalika urang nambihan langkung seueur dukungan kana klaster urang.
  • PinterestTrainingJob ngalegaan kana prosés Tensorflow sareng Pytorch, nyayogikeun tingkat dukungan runtime anu sami sareng sadaya CRD anu sanés. Kusabab Pinterest aktip ngagunakeun Tensorflow sarta sistem learning mesin sejen, urang boga alesan pikeun ngawangun hiji CRD misah sabudeureun éta.

Kami ogé damel di PinterestStatefulSet, anu bakal pas diadaptasi pikeun gudang data sareng sistem stateful anu sanés.

rojongan Runtime

Nalika pod aplikasi dijalankeun dina Kubernetes, éta otomatis nampi sertipikat pikeun ngaidentipikasi dirina. Sertipikat ieu dianggo pikeun ngaksés neundeun rahasia atanapi pikeun komunikasi sareng jasa anu sanés ngalangkungan mTLS. Samentara éta, Container Init Configurator sareng Daemon bakal ngaunduh sadaya kagumantungan anu diperyogikeun sateuacan ngajalankeun aplikasi wadahna. Nalika sadayana tos siap, sidecar lalu lintas sareng Daemon bakal ngadaptarkeun alamat IP modul sareng Zookeeper kami supados klien tiasa mendakanana. Sadaya ieu tiasa dianggo sabab modul jaringan dikonpigurasi sateuacan aplikasi diluncurkeun.

Di luhur mangrupikeun conto umum tina dukungan runtime pikeun beban kerja. Jenis beban kerja anu sanés peryogi dukungan anu rada béda, tapi éta sadayana dina bentuk sidecars tingkat pod, tingkat titik atanapi Daemon tingkat mesin virtual. Urang mastikeun yén sakabéh ieu deployed dina infrastruktur manajemén sarta konsisten sakuliah aplikasi, nu pamustunganana nyata ngurangan beungbeurat dina watesan karya teknis na rojongan customer.

Uji coba sareng QA

Kami ngawangun pipa uji tungtung-ka-tungtung di luhur infrastruktur uji Kubernetes anu tos aya. Tés ieu dilarapkeun ka sadaya klaster urang. Pipa kami ngalangkungan seueur révisi sateuacan janten bagian tina klaster produk.

Salian sistem tés, kami gaduh sistem ngawaskeun sareng waspada anu terus-terusan ngawas status komponén sistem, konsumsi sumberdaya sareng indikator penting anu sanés, ngan ukur ngawartosan kami nalika campur tangan manusa diperyogikeun.

Alternatipna

Urang nempo sababaraha alternatif pikeun sumberdaya custom, kayaning controller aksés mutasi sarta sistem template. Nanging, aranjeunna sadayana gaduh tantangan operasional anu signifikan, janten kami milih jalur CRD.

Controller pangakuan mutasi dianggo pikeun ngenalkeun sidecars, variabel lingkungan, sareng dukungan runtime anu sanés. Sanajan kitu, eta Nyanghareupan sagala rupa masalah, kayaning sumberdaya mengikat jeung manajemén lifecycle, dimana masalah sapertos teu timbul dina CRD.

Catetan: Sistem citakan sapertos Helm chart ogé seueur dianggo pikeun ngajalankeun aplikasi sareng konfigurasi anu sami. Nanging, aplikasi padamelan urang rupa-rupa teuing pikeun diurus nganggo témplat. Ogé salami panyebaran kontinyu bakal seueur teuing kasalahan nalika nganggo témplat.

Gawé nu bakal datang

Kami ayeuna nuju kaayaan beban anu dicampur dina sadaya klaster kami. Pikeun ngadukung prosés sapertos jinis sareng ukuran anu béda, kami damel di daérah ieu:

  • Kumpulan klaster ngadistribusikaeun aplikasi badag sakuliah klaster béda pikeun scalability jeung stabilitas.
  • Mastikeun stabilitas klaster, skalabilitas sareng pisibilitas pikeun nyiptakeun konektipitas aplikasi sareng SLA.
  • Ngatur sumber daya sareng kuota supados aplikasi henteu saling bertentangan, sareng skala kluster dikawasa ku urang.
  • Platform CI/CD anyar pikeun ngadukung sareng nyebarkeun aplikasi dina Kubernetes.

sumber: www.habr.com

Tambahkeun komentar