Bangun platform kubernetes di Pinterest

Selama bertahun-tahun keberadaan Pinterest, 300 juta pengguna layanan telah menciptakan lebih dari 200 miliar pin pada lebih dari 4 miliar papan. Untuk melayani pasukan pengguna ini dan basis konten yang luas, portal ini telah mengembangkan ribuan layanan, mulai dari layanan microser yang dapat ditangani oleh beberapa CPU, dan diakhiri dengan monolith raksasa yang berputar pada seluruh armada mesin virtual. Dan tiba saatnya ketika mata perusahaan tertuju pada k8. Apa yang terlihat "kubus" dengan "Bunga"? Anda akan belajar tentang ini dari terjemahan kami dari posting blog Pinterest terbaru.



Jadi, ratusan juta pengguna dan ratusan miliar pin. Untuk melayani pasukan pengguna ini dan basis konten yang luas, kami telah mengembangkan ribuan layanan, mulai dari layanan microser yang dapat ditangani oleh beberapa CPU hingga monolit raksasa yang berputar di seluruh armada mesin virtual. Selain itu, kami memiliki berbagai kerangka kerja yang mungkin juga memerlukan sumber daya CPU, memori, atau akses ke I / O.

Untuk mendukung kebun binatang ini, tim pengembangan menghadapi sejumlah tantangan:

  • Insinyur tidak memiliki cara terpadu untuk menjalankan lingkungan kerja. Layanan tanpa kewarganegaraan, layanan Stateful, dan proyek dalam pengembangan aktif didasarkan pada tumpukan teknologi yang sama sekali berbeda. Hal ini menyebabkan terciptanya keseluruhan kursus pelatihan untuk para insinyur, dan juga secara serius mempersulit pekerjaan tim infrastruktur kami.
  • Pengembang dengan armada mesin virtual mereka sendiri menciptakan beban besar pada administrator internal. Akibatnya, operasi sederhana seperti memperbarui OS atau AMI berlangsung selama berminggu-minggu dan berbulan-bulan. Ini mengarah pada peningkatan beban kerja dalam situasi yang tampaknya benar-benar sehari-hari.
  • Kesulitan menciptakan alat manajemen infrastruktur global di atas solusi yang ada. Situasi ini diperumit oleh fakta bahwa menemukan pemilik mesin virtual tidaklah mudah. Artinya, kita tidak tahu apakah aman untuk mengekstrak kapasitas ini untuk bekerja di bagian lain dari infrastruktur kami.

Sistem orkestrasi kontainer adalah cara untuk menyatukan manajemen beban kerja. Mereka membuka jalan bagi Anda untuk meningkatkan kecepatan pengembangan dan menyederhanakan manajemen infrastruktur, karena semua sumber daya yang terlibat dalam proyek dikelola oleh satu sistem terpusat.



Gambar 1: Prioritas infrastruktur (keandalan, produktivitas pengembang, dan efisiensi).

Tim Platform Manajemen Cloud di Pinterest bertemu K8 pada 2017. Pada paruh pertama 2017, kami mendokumentasikan sebagian besar fasilitas produksi kami, termasuk API dan semua server web kami. Setelah itu, kami dengan hati-hati menilai berbagai sistem orkestrasi solusi wadah, membangun kelompok dan bekerja dengan mereka. Pada akhir 2017, kami memutuskan untuk menggunakan Kubernetes. Itu cukup fleksibel dan banyak didukung di komunitas pengembang.

Sejauh ini, kami telah menciptakan alat bootstrap cluster berbasis Kops kami sendiri dan mentransfer ke komponen infrastruktur yang ada Kubernetes seperti jaringan, keamanan, metrik, logging, manajemen identitas, dan lalu lintas. Kami juga menerapkan sistem pemodelan beban kerja untuk sumber daya kami, yang kompleksitasnya disembunyikan dari pengembang. Sekarang kami fokus untuk memastikan stabilitas cluster, penskalaan dan menghubungkan klien baru.

Kubernetes: Pinterest's Way


Memulai dengan Kubernet pada skala Pinterest sebagai platform yang akan sangat disukai oleh teknisi kami.

Sebagai perusahaan besar, kami telah banyak berinvestasi dalam alat infrastruktur. Contohnya termasuk alat keamanan yang memproses sertifikat dan mendistribusikan kunci, komponen kontrol lalu lintas, sistem penemuan layanan, visibilitas dan pengiriman log dan metrik. Semua ini dikumpulkan karena suatu alasan: kami menggunakan cara coba-coba yang normal, dan oleh karena itu kami ingin mengintegrasikan semua ekonomi ini ke dalam infrastruktur baru di Kubernet alih-alih menciptakan kembali sepeda lama pada platform baru. Pendekatan ini umumnya menyederhanakan migrasi, karena semua dukungan aplikasi sudah ada, itu tidak perlu dibuat dari awal.

Di sisi lain, model prakiraan beban di Kubernet sendiri (misalnya, penyebaran, pekerjaan, dan kit Daemon) tidak cukup untuk proyek kami. Masalah kegunaan ini merupakan hambatan besar untuk pindah ke Kubernetes. Misalnya, kami mendengar pengembang layanan mengeluh tentang pengaturan login yang hilang atau salah. Kami juga menemukan penggunaan mesin template yang tidak tepat ketika ratusan salinan dibuat dengan spesifikasi dan tugas yang sama, yang mengakibatkan masalah mimpi buruk dengan debugging.

Itu juga sangat sulit untuk mendukung versi yang berbeda di cluster yang sama. Bayangkan kerumitan dukungan pelanggan jika Anda perlu segera bekerja di banyak versi runtime yang sama, dengan semua masalah, bug, dan pembaruan mereka.

Sumber daya dan pengontrol khusus Pinterest


Untuk membuat implementasi Kubernet lebih mudah bagi para insinyur kami, serta untuk menyederhanakan dan mempercepat infrastruktur, kami telah mengembangkan definisi sumber daya kustom kami sendiri (CRD).

CRD menyediakan fitur berikut:

  1. Menggabungkan berbagai sumber daya Kubernet asli untuk membuatnya berfungsi sebagai satu beban. Misalnya, sumber daya PinterestService mencakup penyebaran, layanan masuk, dan peta konfigurasi. Ini memungkinkan pengembang untuk tidak khawatir tentang pengaturan DNS.
  2. Terapkan dukungan aplikasi yang diperlukan. Pengguna harus fokus hanya pada spesifikasi wadah sesuai dengan logika bisnis mereka, sementara pengontrol CRD mengimplementasikan semua kontainer init yang diperlukan, variabel lingkungan, dan spesifikasi pod. Ini memberikan tingkat kenyamanan yang berbeda secara fundamental bagi pengembang.
  3. Pengontrol CRD juga mengelola siklus hidup sumber daya mereka sendiri dan meningkatkan ketersediaan debugging. Ini termasuk menyetujui spesifikasi yang diinginkan dan aktual, memperbarui status CRD dan memelihara log peristiwa dan banyak lagi. Tanpa CRD, pengembang akan dipaksa untuk mengelola sejumlah besar sumber daya, yang hanya akan meningkatkan kemungkinan kesalahan.

Berikut adalah contoh PinterestService dan sumber daya internal yang dikendalikan oleh pengontrol kami:



Seperti yang Anda lihat di atas, untuk mendukung wadah kustom, kami perlu mengintegrasikan wadah inisialisasi dan beberapa add-on ke dalamnya untuk memastikan keamanan, visibilitas dan bekerja dengan lalu lintas jaringan. Selain itu, kami membuat templat peta konfigurasi dan menerapkan dukungan untuk templat PVC untuk pekerjaan batch, serta melacak berbagai variabel lingkungan untuk melacak identifikasi, konsumsi sumber daya, dan pengumpulan sampah.

Sulit membayangkan bahwa pengembang ingin menulis file konfigurasi ini secara manual tanpa dukungan CRD, belum lagi dukungan dan debugging konfigurasi.

Penerapan aplikasi alur kerja




Gambar di atas menunjukkan cara menggunakan sumber daya khusus Pinterest di kluster Kubernetes:

  1. Pengembang berinteraksi dengan kluster Kubernetes kami melalui CLI dan antarmuka pengguna.
  2. Alat CLI / UI mengekstrak konfigurasi alur kerja file YAML dan properti rakitan lainnya (pengidentifikasi versi yang sama) dari Artifactory, dan kemudian mengirimkannya ke Layanan Pengiriman Pekerjaan. Langkah ini memastikan bahwa hanya versi produksi yang dikirim ke cluster.
  3. JSS adalah pintu gerbang ke berbagai platform, termasuk Kubernetes. Di sinilah otentikasi pengguna, penerbitan kuota, dan verifikasi parsial dari konfigurasi CRD kami berlangsung.
  4. Setelah memeriksa CRD di sisi JSS, informasi dikirim ke platform API k8s.
  5. Pengontrol CRD kami memantau acara di semua sumber daya pengguna. Ini mengubah CR menjadi sumber daya k8s asli, menambahkan modul yang diperlukan, menetapkan variabel lingkungan yang sesuai dan melakukan pekerjaan tambahan lainnya, yang menjamin aplikasi pengguna kontainer dukungan infrastruktur yang memadai.
  6. Kemudian kontroler CRD mentransfer data yang diterima ke API Kubernetes sehingga diproses oleh scheduler dan dioperasikan.

Catatan : penyebaran alur kerja pra-rilis ini dibuat untuk pengguna pertama platform k8s baru. Kami sekarang dalam proses memfinalisasi proses ini agar dapat berintegrasi sepenuhnya dengan CI / CD baru kami. Ini berarti bahwa kami tidak dapat memberi tahu semua yang terkait dengan Kubernetes. Kami berharap dapat berbagi pengalaman dan memberi tahu tim tentang kemajuan ini di posting blog berikutnya “Membangun platform CI / CD untuk Pinterest”.

Jenis Sumber Daya Khusus


Berdasarkan kebutuhan spesifik Pinterest, kami telah mengembangkan CRD berikut yang cocok untuk berbagai alur kerja:

  • PinterestService adalah layanan stateless yang sudah berjalan lama. Banyak sistem utama kami didasarkan pada serangkaian layanan tersebut.
  • PinterestJobSet memodelkan pekerjaan batch siklus penuh. Pinterest memiliki skenario umum, di mana beberapa tugas menjalankan wadah yang sama secara paralel, dan terlepas dari proses serupa lainnya.
  • PinterestCronJob banyak digunakan bersama dengan beban periodik kecil. Ini adalah shell asli cron dengan mekanisme dukungan Pinterest yang bertanggung jawab untuk keamanan, lalu lintas, log, dan metrik.
  • PinterestDaemon termasuk infrastruktur Daemon. Keluarga ini terus tumbuh ketika kami menambahkan lebih banyak dukungan untuk kelompok kami.
  • PinterestTrainingJob meluas ke proses Tensorflow dan Pytorch, memberikan tingkat dukungan online yang sama dengan semua CRD lainnya. Karena Pinterest aktif menggunakan Tensorflow dan sistem pembelajaran mesin lainnya, kami memiliki alasan untuk membuat CRD terpisah di sekitarnya.

Kami juga bekerja di PinterestStatefulSet, yang akan segera diadaptasi untuk gudang data dan sistem stateful lainnya.

Dukungan runtime


Ketika modul aplikasi berjalan di Kubernetes, modul itu secara otomatis menerima sertifikat untuk mengidentifikasi dirinya. Sertifikat ini digunakan untuk mengakses toko rahasia atau untuk berkomunikasi dengan layanan lain melalui mTLS. Sementara itu, konfigurator inisialisasi wadah dan Daemon akan mengunduh semua dependensi yang diperlukan sebelum meluncurkan aplikasi kontainer. Ketika semuanya sudah siap, lalu lintas sespan dan Daemon akan mendaftarkan alamat IP modul di Zookeeper kami sehingga pelanggan dapat menemukannya. Semua ini akan berfungsi, karena modul jaringan telah dikonfigurasi sebelum aplikasi diluncurkan.

Berikut ini adalah contoh umum dari dukungan beban kerja run-time. Untuk jenis beban kerja lain, dukungan yang sedikit berbeda mungkin diperlukan, tetapi semuanya disajikan sebagai mesin tingkat sespan, nodal atau mesin virtual tingkat Daemon. Kami memastikan bahwa semua ini digunakan dalam kerangka infrastruktur manajemen dan terkoordinasi antara aplikasi, yang pada akhirnya secara signifikan mengurangi beban dalam hal pekerjaan teknis dan dukungan pelanggan.

Pengujian dan QA


Kami telah mengumpulkan jalur uji ujung ke ujung di atas infrastruktur uji Kubernet yang ada. Tes ini berlaku untuk semua cluster kami. Pipa kami mengalami banyak perubahan sebelum menjadi bagian dari kluster produk.

Selain sistem pengujian, kami memiliki sistem pemantauan dan peringatan yang terus-menerus memantau status komponen sistem, konsumsi sumber daya dan indikator penting lainnya, memberi tahu kami hanya jika diperlukan intervensi manusia.

Alternatif


Kami melihat beberapa alternatif untuk sumber daya khusus, seperti pengontrol akses mutasi dan sistem templat. Namun, semuanya penuh dengan kesulitan serius dalam pekerjaan, jadi kami memilih jalur CRD.

Pengontrol toleransi mutasi digunakan untuk memasukkan bilah samping, variabel lingkungan, dan dukungan runtime lainnya. Namun demikian, ia menghadapi berbagai masalah, misalnya, dengan pengikatan sumber daya dan pengelolaan siklus hidup mereka, ketika masalah seperti itu tidak muncul dalam CRD.

Catatan: Sistem template seperti diagram Helm juga banyak digunakan untuk menjalankan aplikasi dengan konfigurasi yang sama. Namun, aplikasi produksi kami terlalu beragam untuk mengelolanya dengan templat. Selain itu, selama penerapan berkelanjutan, menggunakan templat akan menghasilkan terlalu banyak kesalahan.

Pekerjaan di masa depan


Sekarang kita berurusan dengan beban campuran pada semua cluster kami. Untuk mendukung proses serupa dari berbagai jenis dan ukuran, kami bekerja di bidang berikut:

  • Cluster cluster mendistribusikan aplikasi besar di seluruh cluster untuk memberikan skalabilitas dan stabilitas.
  • Memastikan stabilitas, skalabilitas, dan visibilitas cluster untuk membuat koneksi aplikasi dan SLA-nya.
  • Manajemen sumber daya dan kuota sehingga aplikasi tidak saling bertentangan, dan skala cluster dikendalikan oleh kami.
  • Platform CI / CD baru untuk mendukung dan menggunakan aplikasi di Kubernetes.

Source: https://habr.com/ru/post/id465487/


All Articles