Memahami Antarmuka Penyimpanan Kontainer (dalam Kubernetes dan lainnya)

Catatan perev. : Kami pertama kali berbicara tentang apa yang disebut plug-in penyimpanan Kubernetes (Out-of-Tree CSI Volume) dalam ulasan kami tentang rilis K8s 1.9 , di mana fitur ini muncul dalam status versi alfa. Penulis materi baru, Anoop Vijayan Maniankara (insinyur DevOps terkemuka dari perusahaan Finlandia Tuxera), mengumpulkan informasi penting tentang ide-ide dan perangkat CSI, yang membantu untuk dengan cepat berkenalan dengan konsep baru, yang, menurut beberapa karyawan kami, "akan menjadi hal besar berikutnya". Untuk studi CSI yang lebih rinci dan teknis, tautan yang bermanfaat disediakan di akhir artikel, di antaranya saya akan secara khusus menyoroti presentasi dari salah satu penulis spesifikasi ini (Jie Yu). Tapi ada baiknya memulai dengan "gambaran besar" ...



Container Storage Interface (CSI) adalah inisiatif untuk menyatukan antarmuka penyimpanan, seperti Ceph, Portworx, NetApp, dll., Dalam sistem orkestrasi wadah: Kubernetes, Mesos, Docker Swarm, Cloud Foundry dan lainnya. Idenya adalah bahwa implementasi satu CSI oleh produsen penyimpanan dijamin untuk bekerja dengan semua sistem ini.


Sumber gambar: Laporan Jie Yu CSI di CloudNativeCon EU 2018

Harap dicatat : artikel ini hanya akan berbicara tentang penyediaan dinamis. Volume yang telah dikonfigurasikan sebelumnya dan volume fleksibel melampaui ruang lingkupnya. Jika Anda ingin lebih memahami apa yang akan dibahas, Anda harus terlebih dahulu membaca dokumentasi Kubernetes . Selain itu, artikel ini tidak akan masuk jauh ke rincian implementasi CSI. Saya akan memberikan ikhtisar tingkat tinggi CSI dan meletakkan dasar untuk membuat volume CSI. Terakhir, informasi Kubernetes digunakan untuk contoh dan tautan ke detail.

Sebelum terjun ke topik, penting juga untuk mengetahui wadah sespan apa yang ada di Kubernet. Mereka memperluas kemampuan wadah utama ( utama ), yang ada di perapian yang sama, berbagi penyimpanan dan jaringan.

Pada saat penulisan ini (13 Agustus 2018), komponen CSI memiliki versi berikut:



Sebelum CSI


Rilis pertama CSI - v0.1 - berlangsung pada Desember 2017. Tentu saja, penyediaan dapat dilakukan untuk penyimpanan eksternal dalam sistem orkestra bahkan sebelum itu muncul. Dalam kasus Kubernetes, plugins volume - plugins volume bertanggung jawab atas kebutuhan penyimpanan:



Seperti yang dapat Anda lihat dari gambar di atas, plugin semacam itu adalah bagian dari inti sistem orkestrasi. Karena itu, masalah berikut terjadi yang disebutkan dalam dokumen arsitektur CSI :

  • Pengembangan plugin volume terkait erat dengan dan bergantung pada rilis Kubernetes.
  • Pengembang / komunitas Kubernetes bertanggung jawab untuk menguji dan mendukung semua plugin alih-alih hanya menguji dan memelihara API plugin yang stabil;
  • bug dalam plugin volume dapat menjatuhkan tidak hanya plugin itu sendiri, tetapi juga komponen penting Kubernetes;
  • plugin mendapatkan hak istimewa penuh komponen Kubernetes (kubelet dan kube-controller-manager);
  • pengembang plugin dipaksa untuk mempublikasikan kode sumber plugin dan tidak dapat memilih jalur binari.

Memahami CSI


Memperkenalkan CSI, tim Kubernetes merilis komponen eksternal yang bukan bagian dari kernel dan dirancang untuk berinteraksi dengan komponen eksternal lain yang disediakan oleh produsen. Mereka berkomunikasi satu sama lain melalui soket domain (soket domain UNIX - sekitar Terjemahan). Menggunakan gRPC .



Komponen eksternal Kubernet


Mereka sepenuhnya dilaksanakan dan didukung oleh tim Kubernetes dan memperluas kegiatan Kubernetes di luar Kubernetes. Pabrikan tidak bisa khawatir sama sekali tentang fitur implementasi mereka. Terdiri dari tiga bagian:

  • Registrar driver adalah wadah sespan yang mendaftarkan driver CSI di kubelet dan menambahkan driver NodeId ke label objek node di API Kubernetes. Untuk melakukan ini, ini berinteraksi dengan layanan driver Identitas CSI (untuk lebih jelasnya, lihat di bawah ini - kira-kira Terjemahkan.) Dan panggilan GetNodeId pada CSI;
  • Penyedia eksternal - wadah sespan yang memantau objek PersistentVolumeClaim di API Kubernetes dan memanggil perintah CreateVolume dan DeleteVolume untuk titik akhir driver;
  • External attacher adalah wadah sespan yang memantau objek VolumeAttachment di API Kubernetes dan memanggil perintah ControllerPublish dan ControllerUnpublish untuk driver titik akhir.

Komponen eksternal dari pabrikan penyimpanan / pihak ketiga


Implementasi khusus vendor. Setiap pabrikan mengimplementasikan API yang diperlukan sebagai bagian dari fungsi layanan gRPC. Misalnya, implementasi GCE PD atau Ceph , dll. Mereka juga terdiri dari tiga komponen:

  • CSI Identity - terutama untuk mengidentifikasi plugin: pastikan itu berfungsi, kembalikan informasi dasar tentang plugin;

     service Identity { //      rpc GetPluginInfo(GetPluginInfoRequest) returns (GetPluginInfoResponse) {} // ,       Controller rpc GetPluginCapabilities(GetPluginCapabilitiesRequest) returns (GetPluginCapabilitiesResponse) {} //   ,  ,    rpc Probe (ProbeRequest) returns (ProbeResponse) {} } 

    ( kubernetes-csi-identity.proto )
  • CSI Controller bertanggung jawab untuk mengendalikan dan mengelola volume: membuat, menghapus, melampirkan / memutuskan sambungan, snapshot, dll.

     service Controller { //  provisioning  rpc CreateVolume (CreateVolumeRequest) returns (CreateVolumeResponse) {} //     rpc DeleteVolume (DeleteVolumeRequest) returns (DeleteVolumeResponse) {} //       rpc ControllerPublishVolume (ControllerPublishVolumeRequest) returns (ControllerPublishVolumeResponse) {} //       rpc ControllerUnpublishVolume (ControllerUnpublishVolumeRequest) returns (ControllerUnpublishVolumeResponse) {} // ,     /    rpc ValidateVolumeCapabilities (ValidateVolumeCapabilitiesRequest) returns (ValidateVolumeCapabilitiesResponse) {} //     rpc ListVolumes (ListVolumesRequest) returns (ListVolumesResponse) {} //       rpc GetCapacity (GetCapacityRequest) returns (GetCapacityResponse) {} // ,      GetCapacity  Snapshotting rpc ControllerGetCapabilities (ControllerGetCapabilitiesRequest) returns (ControllerGetCapabilitiesResponse) {} //   rpc CreateSnapshot (CreateSnapshotRequest) returns (CreateSnapshotResponse) {} //   rpc DeleteSnapshot (DeleteSnapshotRequest) returns (DeleteSnapshotResponse) {} //    rpc ListSnapshots (ListSnapshotsRequest) returns (ListSnapshotsResponse) {} } 

    ( kubernetes-csi-controller.proto )
  • CSI Node bertanggung jawab untuk memantau aktivitas volume pada host Kubernetes.

     service Node { //     staging- rpc NodeStageVolume (NodeStageVolumeRequest) returns (NodeStageVolumeResponse) {} //    staging- rpc NodeUnstageVolume (NodeUnstageVolumeRequest) returns (NodeUnstageVolumeResponse) {} //    staging    rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} //      rpc NodeUnpublishVolume (NodeUnpublishVolumeRequest) returns (NodeUnpublishVolumeResponse) {} //    rpc NodeGetVolumeStats (NodeGetVolumeStatsRequest) returns (NodeGetVolumeStatsResponse) {} //   ID  rpc NodeGetId (NodeGetIdRequest) returns (NodeGetIdResponse) { option deprecated = true; } //   (capabilities)  rpc NodeGetCapabilities (NodeGetCapabilitiesRequest) returns (NodeGetCapabilitiesResponse) {} //   NodeGetId rpc NodeGetInfo (NodeGetInfoRequest) returns (NodeGetInfoResponse) {} } 

    ( kubernetes-csi-node.proto )

Kesimpulan


Munculnya CSI membawa nilai tambah yang jelas untuk sistem orkestrasi dan produsen penyimpanan. Selain itu, antarmuka yang terdefinisi dengan baik membantu implementasi sederhana dan pengujian CSI untuk pengembang dan sistem orkestrasi di masa depan. Jika Anda memutuskan untuk mulai menerapkan CSI setelah membaca artikel ini, plugin Cara menulis Wadah Penyimpanan Antarmuka Kontainer (CSI) Fatih Arslan adalah titik awal yang baik.

Referensi


  1. Spesifikasi CSI ;
  2. Wadah sespan di Kubernetes ;
  3. Jie Yu CSI melaporkan di KubeCon EU: CloudNativeCon EU 2018 (dan ini adalah video dari presentasi ini - sekitar Terjemahan.) ;
  4. Dokumen Arsitektur CSI
  5. Dokumentasi terkini tentang CSI dari Kubernetes ;
  6. Dokumentasi CSI Kubernet yang sudah tidak digunakan lagi .

PS dari penerjemah


Baca juga di blog kami:

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


All Articles