Pola Penyimpanan Kubernetes


Halo, Habr!

Kami mengingatkan Anda bahwa kami telah dirilis lain yang sangat menarik dan berguna buku tentang pola Kubernetes. Semuanya dimulai dengan β€œ Pola ” Brendan Burns , dan, omong-omong, pekerjaan di segmen ini sedang berjalan lancar . Hari ini kami mengundang Anda untuk membaca artikel dari blog MinIO yang merangkum tren dan spesifikasi pola penyimpanan data di Kubernetes.


Kubernetes secara mendasar mengubah pola tradisional pengembangan dan penerapan aplikasi. Sekarang tim dapat membutuhkan beberapa hari untuk mengembangkan, menguji dan menyebarkan aplikasi - di lingkungan yang berbeda, dan semua ini dalam kelompok Kubernetes. Pekerjaan seperti itu dengan teknologi dari generasi sebelumnya biasanya memakan waktu berminggu-minggu, jika tidak berbulan-bulan.

Akselerasi seperti itu dimungkinkan berkat abstraksi yang disediakan oleh Kubernetes - yaitu, karena fakta bahwa Kubernetes sendiri berinteraksi dengan detail tingkat rendah dari mesin fisik atau virtual, yang memungkinkan pengguna untuk menyatakan, di antara parameter lain, prosesor yang diinginkan, memori yang diperlukan, jumlah instance kontainer. Karena Kubernetes didukung oleh komunitas besar, dan cakupan Kubernetes terus berkembang, ia memimpin dengan margin yang lebar di antara semua platform orkestrasi wadah.

Saat penggunaan Kubernetes meluas, demikian juga kebingungan tentang pola penyimpanan yang digunakan di dalamnya .

Dengan kompetisi umum untuk sepotong kue Kubernetes (yaitu, untuk penyimpanan data), ketika berbicara tentang penyimpanan data, sinyal tenggelam dalam suara keras.
Kubernetes mewujudkan model modern untuk mengembangkan, menyebarkan, dan mengelola aplikasi. Model modern semacam itu tidak memungkinkan penyimpanan data dari komputasi. Untuk sepenuhnya memahami detasemen ini dalam konteks Kubernetes, Anda juga perlu memahami apa itu aplikasi stateful dan stateless, dan bagaimana penyimpanan data digabungkan dengan ini. Di sinilah pendekatan REST API yang digunakan oleh S3 memiliki keunggulan yang jelas atas pendekatan POSIX / CSI yang khas dari solusi lain.

Dalam artikel ini kita akan berbicara tentang pola penyimpanan di Kubernetes dan kita akan secara terpisah membahas debat tentang aplikasi yang aman dan tanpa negara, sehingga kita dapat dengan jelas memahami perbedaan di antara mereka dan mengapa itu penting. Lebih lanjut dalam teks, kami akan mempertimbangkan aplikasi dan pola penyimpanan data yang digunakan di dalamnya dalam terang praktik terbaik untuk bekerja dengan wadah dan Kubernetes.

Wadah stateless


Wadah pada dasarnya ringan dan fana. Mereka dapat dengan mudah dihentikan, dihapus atau digunakan pada node lain - semua ini membutuhkan waktu beberapa detik. Dalam sistem orkestrasi wadah besar, operasi seperti itu terjadi setiap saat, dan pengguna bahkan tidak melihat perubahan seperti itu. Namun, gerakan hanya dimungkinkan jika wadah tidak memiliki ketergantungan pada simpul di mana ia berada. Wadah ini dikatakan bekerja tanpa pengawetan negara .

Wadah Stateful


Jika kontainer menyimpan data pada perangkat yang terhubung secara lokal (atau pada perangkat blok), maka data warehouse di mana ia berada harus dipindahkan ke node baru bersama dengan wadah itu sendiri - jika terjadi kegagalan. Ini penting, karena jika tidak, aplikasi yang berjalan di wadah tidak akan dapat berfungsi dengan benar, karena itu perlu mengakses data yang disimpan di media lokal. Wadah ini dikatakan stateful .

Dari sudut pandang teknis, wadah stateful juga dapat dipindahkan ke node lain. Biasanya, ini dicapai dengan menggunakan sistem file terdistribusi atau memblokir penyimpanan jaringan yang melekat pada semua node di mana wadah beroperasi. Dengan demikian, kontainer mendapatkan akses ke volume untuk penyimpanan data yang persisten, dan informasi disimpan pada disk yang berlokasi di seluruh jaringan. Saya akan menyebut metode semacam itu sebagai " pendekatan wadah pelestarian negara ," dan di artikel selanjutnya saya akan menyebutnya metode demi keseragaman.



Dalam pendekatan wadah stateful khas, semua pod aplikasi dilampirkan ke satu sistem file terdistribusi - semacam penyimpanan bersama diperoleh, di mana semua data aplikasi diperoleh. Sementara beberapa variasi dimungkinkan, ini adalah pendekatan tingkat tinggi.

Sekarang mari kita lihat mengapa pendekatan wadah stateful di dunia berbasis cloud adalah antipattern.

Desain Aplikasi Berbasis Cloud


Secara tradisional, aplikasi menggunakan basis data untuk penyimpanan informasi dan disk lokal yang terstruktur atau sistem file terdistribusi, di mana semua data tidak terstruktur atau bahkan semi-terstruktur dibuang. Dengan meningkatnya volume data yang tidak terstruktur, para pengembang menyadari bahwa POSIX terlalu β€œlatah”, terkait dengan biaya yang signifikan dan, pada akhirnya, mengganggu aplikasi ketika pindah ke skala yang sangat besar.

Ini terutama berkontribusi pada munculnya standar baru untuk penyimpanan data, yaitu penyimpanan berbasis cloud yang bekerja terutama berdasarkan REST API dan membebaskan aplikasi dari pemeliharaan yang memberatkan dari gudang data lokal. Dalam hal ini, aplikasi benar-benar memasuki mode operasi tanpa menyimpan status (karena status berada dalam penyimpanan jarak jauh). Aplikasi modern sedang dibangun dari awal sudah memperhitungkan faktor ini. Sebagai aturan, setiap aplikasi modern yang memproses data dari satu jenis atau lainnya (log, metadata, blob, dll) dibangun di atas paradigma berorientasi cloud, di mana negara ditransfer ke sistem perangkat lunak yang khusus dialokasikan untuk penyimpanannya.

Pendekatan wadah yang stateful membuat seluruh paradigma ini kembali persis ke tempat awalnya!

Ketika menggunakan antarmuka POSIX untuk menyimpan data, aplikasi bekerja dengan cara yang sama seperti jika mereka mempertahankan keadaan, dan karena itu, mereka menyimpang dari postulat paling penting dari desain berbasis cloud, yaitu dari kemampuan untuk memvariasikan ukuran alur kerja aplikasi tergantung pada masuk memuat, pindah ke simpul baru segera setelah simpul saat ini gagal, dan sebagainya.

Melihat lebih dekat pada situasi ini mengungkapkan bahwa ketika memilih data warehouse, kita lagi dan lagi menghadapi dilema "POSIX versus REST API", TETAPI dengan pemburukan tambahan masalah POSIX karena sifat terdistribusi dari lingkungan Kubernetes. Khususnya,

  • POSIX : POSIX , . , . API , , S3 API, , , «» . , . .
  • : , , . , , ( ), , . - POSIX . , S3 API , , , .
  • : POSIX : . - . , API, , , ..
  • : , . , , , . , , , .


Sedangkan antarmuka penyimpanan data kontainer (CSI) banyak membantu dengan distribusi tingkat volume Kubernetes, sebagian meneruskannya ke vendor gudang data pihak ketiga, tetapi juga secara tidak sengaja berkontribusi pada keyakinan bahwa pendekatan kontainer stateful adalah metode penyimpanan data yang direkomendasikan di Kubernetes.

CSI dikembangkan sebagai standar untuk menyediakan sistem penyimpanan blok dan file yang sewenang-wenang untuk aplikasi lawas saat bekerja dengan Kubernetes. Dan, seperti yang ditunjukkan dalam artikel ini, satu-satunya situasi di mana pendekatan wadah stateful (dan CSI dalam bentuk saat ini) sesuai adalah ketika aplikasi itu sendiri adalah sistem warisan di mana tidak mungkin untuk menambahkan dukungan untuk API penyimpanan data objek.

Penting untuk dipahami bahwa menggunakan CSI dalam bentuk saat ini, yaitu, ketika memasang volume ketika bekerja dengan aplikasi modern, kita akan menghadapi masalah yang kira-kira sama dengan yang dihadapi dalam sistem di mana penyimpanan data diatur dalam gaya POSIX.

Pendekatan yang lebih baik


Dalam hal ini, penting untuk dipahami bahwa sebagian besar aplikasi pada dasarnya tidak diasah khusus untuk bekerja dengan atau tanpa pengawetan negara. Perilaku ini tergantung pada arsitektur keseluruhan sistem dan pada opsi spesifik yang dipilih selama desain. Mari kita bicara sedikit tentang aplikasi stateful.

Pada prinsipnya, semua data aplikasi dapat dibagi menjadi beberapa tipe luas:

  • Log Data
  • Data cap waktu
  • Data transaksi
  • Metadata
  • Gambar kontainer
  • Gumpalan data (gumpalan)

Semua tipe data ini didukung dengan sangat baik pada platform penyimpanan data modern, dan ada beberapa platform berbasis cloud yang diadaptasi untuk mengirimkan data dalam masing-masing format spesifik ini. Misalnya, data transaksi dan metadata dapat berada di database berbasis cloud modern seperti CockroachDB, YugaByte, dll. Gambar kontainer atau gumpalan data dapat disimpan dalam register buruh pelabuhan berdasarkan MinIO. Data cap waktu dapat disimpan dalam database deret waktu, seperti InfluxDB, dll. Kami tidak akan membahas detail setiap jenis data dan aplikasi terkait, tetapi ide umumnya adalah untuk menghindari penyimpanan data yang persisten berdasarkan pemasangan disk lokal.



Selain itu, seringkali efektif untuk menyediakan lapisan caching sementara, yang berfungsi sebagai semacam penyimpanan file sementara untuk aplikasi, tetapi aplikasi tidak boleh bergantung pada level ini sebagai sumber kebenaran.

Penyimpanan Aplikasi Stateful


Sementara dalam banyak kasus berguna untuk menjaga agar aplikasi tidak memiliki kewarganegaraan, aplikasi yang dirancang untuk menyimpan data - misalnya, basis data, penyimpanan objek, penyimpanan nilai dan toko - harus menjaga keadaan. Mari kita lihat mengapa aplikasi ini digunakan untuk Kubernetes. Ambil MinIO sebagai contoh, tetapi prinsip serupa berlaku untuk sistem penyimpanan besar berbasis cloud lainnya.

Aplikasi cloud-centric dirancang untuk memaksimalkan penggunaan fleksibilitas yang melekat dalam wadah. Ini berarti bahwa mereka tidak membuat asumsi tentang lingkungan di mana mereka akan ditempatkan. Misalnya, MinIO menggunakan mekanisme pengkodean penghapusan internal, yang menyediakan sistem dengan stabilitas yang cukup sehingga tetap beroperasi bahkan jika setengah dari drive gagal. MinIO juga mengelola integritas dan keamanan data menggunakan hashing dan enkripsi sisi server sendiri.

Untuk aplikasi berbasis cloud seperti itu, volume persisten lokal (PV) paling nyaman sebagai penyimpanan cadangan. PV lokal menyediakan kemampuan untuk menyimpan data mentah, sementara aplikasi yang berjalan di atas PV ini secara independen mengumpulkan informasi untuk menskala data dan mengelola kebutuhan data yang berkembang.

Pendekatan ini jauh lebih sederhana dan terukur secara signifikan lebih baik dibandingkan dengan PV berbasis CSI, yang membawa tingkat manajemen data dan redundansi mereka sendiri ke sistem; kenyataannya adalah bahwa level ini biasanya bertentangan dengan aplikasi yang dirancang sesuai dengan prinsip pelestarian negara.

Pergerakan Percaya Diri untuk Melepas Sematan Data dari Komputer


Dalam artikel ini, kita berbicara tentang bagaimana aplikasi diorientasikan untuk bekerja tanpa menyimpan keadaan, atau, dengan kata lain, penyimpanan data dibatasi dari komputasi pada aplikasi tersebut. Sebagai kesimpulan, kami mempertimbangkan beberapa contoh dunia nyata dari tren semacam itu.

Spark , platform analisis data yang terkenal, secara tradisional telah digunakan dengan penyebaran dan penyebaran status ke sistem file HDFS. Namun, saat transisi Spark ke dunia berbasis cloud, platform ini semakin banyak digunakan tanpa pelestarian negara menggunakan `s3a`. Spark menggunakan s3a untuk mentransfer status ke sistem lain, sementara wadah Spark sendiri bekerja sepenuhnya tanpa pelestarian negara. Pemain perusahaan besar lainnya di bidang analitik data besar, khususnya, Vertica , Teradata, Greenplum juga pergi bekerja dengan pembagian penyimpanan data dan komputasi atas mereka.

Pola serupa juga dapat dilihat pada platform analitik besar lainnya, termasuk Presto, Tensorflow hingga R, Jupyter. Status mengunggah ke sistem penyimpanan cloud jarak jauh membuatnya lebih mudah untuk mengelola dan mengatur skala aplikasi Anda. Selain itu, ini membantu portabilitas aplikasi ke berbagai lingkungan.

All Articles