Deployments Kubernetes vs StatefulSets

110

Saya telah melakukan banyak penggalian di Kubernetes, dan saya sangat menyukai apa yang saya lihat! Satu hal yang tidak dapat saya ketahui dengan jelas adalah apa perbedaan persisnya antara sumber daya Deployment dan StatefulSet dan di skenario mana Anda akan menggunakan masing-masing (atau yang umumnya lebih disukai daripada yang lain).

Pengalaman apa pun yang dapat dibagikan orang akan luar biasa !!

SS781
sumber

Jawaban:

114

Deployments dan ReplicationControllers dimaksudkan untuk penggunaan tanpa kewarganegaraan dan lebih ringan. StatefulSets digunakan ketika status harus dipertahankan. Oleh karena itu, penggunaan volumeClaimTemplates/ klaim terakhir pada volume persisten untuk memastikan mereka dapat mempertahankan status di seluruh komponen dimulai ulang.

Jadi, jika aplikasi Anda stateful atau jika Anda ingin menerapkan penyimpanan stateful di atas Kubernetes, gunakan StatefulSet.

Jika aplikasi Anda stateless atau jika status dapat dibangun dari sistem backend selama awal, gunakan Deployments.

Rincian lebih lanjut tentang menjalankan aplikasi stateful dapat ditemukan di entri blog kubernetes 2016 tentang aplikasi stateful

pagid
sumber
16
Saya juga dapat menghubungkan pod penerapan dengan klaim volume yang persisten dan aman.
Torsten Bronger
9
@TorstenBronger Saya setuju - pada titik mana kita kembali ke pertanyaan awal tentang apa gunanya StatefulSets?
HDave
6
@HDave Dengan volume persisten dinamis dan penyedia penyimpanan yang berkembang pesat (seperti Portworx, OpenEBS), masalah persistensi data dapat diatasi tetapi penamaan dan urutan startup / peningkatan masih berbeda dengan StatefulSets, memungkinkan aplikasi yang memerlukan master / slave atau pengaturan lain untuk membentuk cluster dengan benar. Meskipun saya setuju bahwa mungkin semua ini dapat dilipat menjadi satu deploymentkonfigurasi dengan spesifikasi sederhana untuk mengatur 1-per-node (daemonset), replika, atau pengurutan stateful.
Mani Gandham
4
Penting untuk diketahui bahwa "urutan startup / upgrade" adalah tentang replika Pod (mis. 1, 2, 3 ...) - bukan pod yang berbeda (yaitu web, srv, db, dll.). Dengan kata lain, ini bukan substitusi untuk dependensi docker-compose.
HDave
72
  • Deployment - Anda menentukan PersistentVolumeClaim yang digunakan bersama oleh semua replika pod. Dengan kata lain, volume bersama.

    Penyimpanan pendukung jelas harus memiliki akses ReadWriteMany atau ReadOnlyMany jika Anda memiliki lebih dari satu replika pod.

  • StatefulSet - Anda menentukan volumeClaimTemplates sehingga setiap pod replika mendapatkan PersistentVolumeClaim unik yang terkait dengannya. Dengan kata lain, tidak ada volume bersama.

    Di sini, penyimpanan cadangan dapat memiliki AccessMode ReadWriteOnce .

    StatefulSet berguna untuk menjalankan sesuatu dalam cluster misalnya cluster Hadoop, cluster MySQL, di mana setiap node memiliki penyimpanannya sendiri.

Emmanuel Osimosu
sumber
23

TL; DR

Deployment adalah resource untuk menerapkan aplikasi stateless, jika menggunakan PVC, semua replika akan menggunakan Volume yang sama dan tidak ada replika yang memiliki statusnya sendiri.

Statefulsets digunakan untuk aplikasi Stateful, setiap replika pod akan memiliki statusnya sendiri, dan akan menggunakan Volume-nya sendiri.

DaemonSet adalah pengontrol yang memastikan bahwa pod berjalan di semua node cluster. Jika sebuah node ditambahkan / dihapus dari sebuah cluster, DaemonSet secara otomatis menambahkan / menghapus pod tersebut.

Saya telah menulis tentang perbedaan mendetail antara Deployments, StatefulSets & Daemonsets, dan cara menerapkan aplikasi sampel menggunakan Resources K8s ini: Deployments vs StatefulSets vs DaemonSets .

Ali Kahoot
sumber
4
Untuk menindaklanjuti komentar Anda, menurut saya perbedaan antara keduanya adalah, yang satu memiliki kemampuan untuk menentukan penyimpanan khusus pod (dan dengan demikian mempertahankan status khusus pod), sedangkan yang lain tidak (dan karenanya hanya dapat mempertahankan layanan -seluruh negara bagian). Dalam hal ini, pada tingkat layanan, keduanya dapat dipandang sebagai stateful. Tetapi pada level pod, hanya Statefulsets yang stateful.
scabbage
14

StatefulSet

Gunakan 'StatefulSet' dengan Stateful Distributed Applications, yang mengharuskan setiap node memiliki status persisten . StatefulSet menyediakan kemampuan untuk mengonfigurasi sejumlah node yang berubah-ubah, untuk aplikasi / komponen berstatus, melalui konfigurasi (replika = N).

Ada dua jenis aplikasi terdistribusi berstatus: Master-Master dan Master-Slave. Semua node dalam konfigurasi Master-Master dan node Slave dalam konfigurasi Master-Slave dapat menggunakan StatefulSet.
Contoh:
Master-Slave -> Datanodes (slave) dalam cluster Hadoop
Master-Master -> Node database (master-master) dalam cluster Cassandra

Setiap Pod (replika / node) dalam StatefulSet memiliki identitas jaringan yang Unik dan Stabil. Misalnya dalam Cassandra StatefulSet dengan nama 'cassandra' dan jumlah node replika sebagai N, setiap pod Cassandra (node) memiliki:

  • Indeks Ordinal untuk setiap pod: 0,1, .., N-1
  • ID jaringan stabil: cassandra-0, cassandra-1, .., cassandra-N-1
  • Volume persisten terpisah untuk setiap pod terhadap template klaim volume, yaitu penyimpanan terpisah untuk setiap pod (node)
  • Pod dibuat dengan urutan 0 hingga N-1 dan diakhiri dengan urutan terbalik N-1 hingga 0

Lihat: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Penyebaran

'Deployment' di sisi lain cocok untuk aplikasi / layanan stateless di mana node tidak memerlukan identitas khusus. Penyeimbang beban dapat menjangkau node mana pun yang dipilihnya. Semua node sama. Deployment berguna untuk membuat sejumlah node arbitrer, melalui konfigurasi (replicas = N).

Anurag
sumber
7

Perbedaan antara StatefulSet dan penyebaran

StatefulSet setara dengan penerapan khusus. Setiap pod di StatefulSet memiliki pengenal jaringan unik yang stabil yang dapat digunakan untuk menemukan anggota lain di cluster. Jika nama StatefulSet adalah Kafka, maka pod pertama disebut Kafka-0, Kafka-1 kedua, dan seterusnya; urutan mulai dan berhenti dari salinan pod yang dikontrol oleh StatefulSet dikontrol. Ketika pod ke-n dioperasikan, N-1 pod pertama sudah berjalan dan siap dalam keadaan Baik; pod di StatefulSet menggunakan volume penyimpanan persisten yang stabil, yang diimplementasikan oleh PV atau PVC. Saat menghapus pod, volume penyimpanan yang terkait dengan StatefulSet tidak dihapus secara default (untuk keamanan data); StatefulSet terikat untuk terikat ke volume PV. Digunakan untuk menyimpan data status pod, dan juga digunakan bersama dengan layanan headless, yang dideklarasikan sebagai milik layanan headless tersebut;

Adler.Liu
sumber