Apa perbedaan antara pod dan penyebaran?

241

Saya telah membuat pod dengan type:deploymenttetapi saya melihat bahwa beberapa penggunaan dokumentasi type:pod, lebih khusus dokumentasi untuk pod multi-kontainer :

apiVersion: v1
kind: Pod
metadata:
  name: ""
  labels:
    name: ""
  namespace: ""
  annotations: []
  generateName: ""
spec:
  ? "// See 'The spec schema' for details."
  : ~

Tetapi untuk membuat pod, saya hanya bisa menggunakan tipe penempatan :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ""
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: ""
    spec:
      containers:
        etc

Saya perhatikan dokumentasi pod mengatakan:

Perintah create dapat digunakan untuk membuat pod secara langsung, atau dapat membuat pod atau pod melalui Deployment. Sangat disarankan agar Anda menggunakan Penempatan untuk membuat pod Anda. Ini menonton untuk pod gagal dan akan memulai pod baru seperti yang diperlukan untuk mempertahankan nomor yang ditentukan. Jika Anda tidak ingin Penyebaran memantau pod Anda (mis. Pod Anda menulis data yang tidak persisten yang tidak akan bertahan hidup restart, atau pod Anda dimaksudkan untuk berumur pendek), Anda dapat membuat pod langsung dengan perintah create.

Catatan: Sebaiknya gunakan Penempatan untuk membuat pod. Anda harus menggunakan petunjuk di bawah ini hanya jika Anda tidak ingin membuat Penempatan.

Tapi ini menimbulkan pertanyaan apa kind:podgunanya? Bisakah Anda, entah bagaimana, merujuk pod dalam penerapan? Saya tidak melihat jalan. Sepertinya yang Anda dapatkan dengan pod adalah beberapa metadata tambahan tetapi tidak ada opsi penyebaran seperti replicaatau kebijakan mulai ulang. Apa gunanya pod yang tidak bertahan data, bertahan restart? Saya pikir saya bisa membuat pod multi-kontainer dengan penyebaran juga.

Bjorn
sumber

Jawaban:

191

Pod dan Deployment adalah objek penuh di API Kubernetes. Deployment mengelola pembuatan Pods melalui ReplicaSets. Intinya adalah bahwa Deployment akan membuat Pods dengan spec yang diambil dari template. Agak tidak mungkin Anda perlu membuat Pods langsung untuk case use produksi.

Radek 'Goblin' Pieczonka
sumber
7
Terima kasih, tetapi kapan Anda akan langsung membuat pod?
Bjorn
11
Memiliki pengontrol khusus adalah salah satu kasus di mana Anda mungkin ingin membuat dan mengelola pod secara langsung, daripada menggunakan salah satu abstraksi tingkat yang lebih tinggi.
Anirudh Ramanathan
24
@BjornTipling Saya membuat pod tanpa penyebaran ketika saya tidak perlu kubernet untuk membuat kembali pod saat dihapus. Satu use case adalah menguji berbagai hal dengan membuat pod terlebih dahulu.
user2526795
243

Jawaban Radek sangat baik, tetapi saya ingin menarik dari pengalaman saya, Anda hampir tidak akan pernah menggunakan objek dengan pod jenis , karena itu tidak masuk akal dalam praktek.

Karena Anda memerlukan objek penyebaran - atau objek API Kubernetes lainnya seperti pengontrol replikasi atau replicaset - yang perlu menjaga replika (polong) tetap hidup (itulah titik menggunakan kubernetes).

Apa yang akan Anda gunakan dalam praktik untuk aplikasi tipikal adalah:

  1. Objek penyebaran (tempat Anda akan menentukan wadah aplikasi Anda) yang akan menampung wadah aplikasi Anda dengan beberapa spesifikasi lainnya.

  2. Objek layanan (yang seperti objek pengelompokan dan memberinya apa yang disebut IP virtual (cluster IP) untuk podsyang memiliki label tertentu - dan itu podspada dasarnya adalah wadah aplikasi yang Anda gunakan dengan objek penempatan sebelumnya .

Anda harus memiliki objek layanan karena objek podspenyebaran bisa dimatikan, ditingkatkan dan diturunkan, dan Anda tidak dapat mengandalkan alamat IP mereka karena mereka tidak akan bertahan lama.

Jadi Anda memerlukan objek seperti layanan , yang memberikan mereka podsIP yang stabil.

Hanya ingin memberi Anda beberapa konteks di sekitar pods, sehingga Anda tahu bagaimana segala sesuatu bekerja bersama.

Semoga itu membersihkan beberapa hal untuk Anda, belum lama ini saya berada di posisi Anda :)

Tomislav Mikulin
sumber
1
Jawaban yang bagus, apakah kita memerlukan replicaSet atau ReplicationController karena saya pikir objek Deployment membungkus objek-objek ini mengendalikan replika?
user_mda
3
ya, objek Deployment menangani replaset, tetapi Anda juga bisa menggunakan objek dengan jenis: ReplicationController atau sejenis: ReplicaSet pada itu sendiri jika Anda benar-benar ingin, tetapi saya belum melihat banyak dari itu dalam praktek ...
Tomislav Mikulin
2
Mengapa beberapa dokumen kubernet memberikan kind: Podcontoh? Misalnya, Cara mengonsumsi Rahasia sebagai env vars: kubernetes.io/docs/concepts/configuration/secret/…
rm.rf.etc
1
Saya tidak begitu yakin, mungkin karena lebih mudah untuk menjelaskan konsep dalam k8..tanpa memberikan bobot controller, penyebaran dll ...
Tomislav Mikulin
1
Ada beberapa kasus ketika Anda ingin membuat pod, misalnya jika Anda menjalankan tes sespan (contoh helm test) di mana Anda tidak perlu menjalankan aplikasi selamanya, dan kami tidak perlu beberapa replika, dalam hal itu pod cocok.
Balkrishna
61

Kubernetes memiliki tiga Jenis Objek yang harus Anda ketahui:

  • Pod - menjalankan satu atau lebih kontainer yang terkait erat
  • Layanan - mengatur jaringan di kluster Kubernetes
  • Deployment - Mempertahankan serangkaian pod identik, memastikan bahwa mereka memiliki konfigurasi yang benar dan jumlah yang tepat ada.

Pod:

  • Menjalankan satu set wadah
  • Bagus untuk tujuan dev sekali saja
  • Jarang digunakan langsung dalam produksi

Penyebaran:

  • Menjalankan serangkaian pod identik
  • Monitor keadaan masing-masing pod, perbarui seperlunya
  • Bagus untuk dev
  • Bagus untuk produksi

Dan saya akan setuju dengan jawaban lain, lupakan Pods dan gunakan Deployment saja. Mengapa? Lihatlah poin kedua, ia memonitor keadaan masing-masing pod, memperbarui seperlunya.

Jadi, alih-alih berjuang dengan pesan kesalahan seperti ini:

Dilarang: pembaruan pod tidak boleh mengubah bidang selain spec.containers[*].image

Jadi cukup refactor atau buat ulang sepenuhnya Pod Anda menjadi Deployment yang membuat pod untuk melakukan apa yang perlu Anda lakukan. Dengan Deployment Anda dapat mengubah konfigurasi apa pun yang Anda inginkan dan Anda tidak perlu khawatir melihat pesan kesalahan itu.

Daniel
sumber
9

Pod adalah contoh wadah.

masukkan deskripsi gambar di sini

Itu adalah output dari replicas: 3

Pikirkan seseorang deploymentdapat memiliki banyak instance berjalan (replika).

//deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: tomcat-deployment222
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 3
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0
        ports:
        - containerPort: 8080
serkan
sumber
Jawaban terbaik sejauh ini. Jawaban lain fokus pada menunjukkan bagaimana Penerapan adalah konsep yang lebih penting dan Anda jarang menggunakan Pods pada produksi, tetapi tidak memiliki informasi yang jelas tentang bagaimana mereka berhubungan satu sama lain.
Diego Queiroz
Jadi bisakah kita menamai pod itu dari replika penyebaran?
kioria
@kioria, apa yang Anda maksud dengan "replika penyebaran"?
serkan
@serkan maksud saya replika ini: 3 dari spesifikasi penempatan.
kioria
@kioria, replicas: 3referensi ke bagian atas gambar, Ini berarti "hei, ketika Anda menjalankan proses ini, buat 3 komputer virtual / nyata - instance.". "penyebaran" seperti itu adalah rumah dan "pod" adalah orang. Satu rumah dan tiga orang di dalamnya yang melakukan pekerjaan. Apa yang ingin Anda lakukan khusus untuk ini?
serkan
6

Pod adalah kumpulan wadah dan objek dasar Kuberntes. Semua wadah pod berada di simpul yang sama.

  • Tidak cocok untuk produksi
  • Tidak ada pembaruan yang bergulir

Deployment adalah sejenis pengontrol di Kubernetes.

Controllers use a Pod Template that you provide to create the Pods for which it is responsible.

Penerapan membuat ReplicaSet yang pada gilirannya memastikan bahwa CurrentReplicas selalu sama dengan Replika yang diinginkan.

Keuntungan :

  • Anda dapat meluncurkan dan mengembalikan perubahan Anda menggunakan penerapan
  • Memantau kondisi setiap pod
  • Paling cocok untuk produksi
  • Mendukung pembaruan yang bergulir
Nikhil Kumar
sumber
4

Saya ingin menambahkan beberapa informasi dari buku Kubernetes In Action , sehingga Anda dapat melihat semua gambar dan menghubungkan hubungan antara sumber daya Kubernetes seperti Pod, Deployment, dan ReplicationController (ReplicaSet)

Polong

adalah unit dasar yang dapat digunakan di Kubernetes. Tetapi dalam kasus penggunaan dunia nyata, Anda ingin penyebaran Anda tetap terjaga dan berjalan secara otomatis dan tetap sehat tanpa intervensi manual. Untuk ini, pendekatan yang disarankan adalah menggunakan Deployment , yang di bawah tenda membuat ReplicaSet .

Sebuah ReplicaSet , seperti namanya, adalah satu set replika (Pod) yang dipelihara dengan riwayat Revisi mereka .

(ReplicaSet memperluas objek lama yang disebut ReplicationController - yang persis sama tetapi tanpa riwayat Revisi.)

ReplicaSet secara konstan memonitor daftar pod yang sedang berjalan dan memastikan jumlah pod yang cocok dengan spesifikasi tertentu selalu cocok dengan nomor yang diinginkan.

masukkan deskripsi gambar di sini

Removing a pod from the scope of the ReplicationController comes in handy
when you want to perform actions on a specific pod. For example, you might 
have a bug that causes your pod to start behaving badly after a specific amount 
of time or a specific event.

A Deployment

adalah sumber daya tingkat yang lebih tinggi yang dimaksudkan untuk menyebarkan aplikasi dan memperbarui secara deklaratif.

Saat Anda membuat Penempatan , sumber daya ReplicaSet dibuat di bawahnya (akhirnya lebih banyak dari mereka). ReplicaSets juga mereplikasi dan mengelola pod. Bila menggunakan Deployment, polong sebenarnya dibuat dan dikelola oleh Deployment ‘s ReplicaSets , bukan oleh Deployment langsung masukkan deskripsi gambar di sini

Mari kita pikirkan apa yang terjadi. Dengan mengubah templat pod di sumber daya Penerapan Anda, Anda telah memperbarui aplikasi Anda ke versi yang lebih baru — dengan mengubah satu bidang!

masukkan deskripsi gambar di sini

Akhirnya, kembalikan Penyebaran baik ke revisi sebelumnya atau ke revisi sebelumnya sehingga mudah dengan sumber daya Penyebaran.

Gambar-gambar ini juga dari buku Kubernetes In Action .

fgul
sumber
2

Cobalah untuk menghindari Pods dan mengimplementasikan Deployments sebagai gantinya untuk mengelola kontainer karena objek-objek sejenis Pod tidak akan dijadwal ulang (atau disembuhkan sendiri) jika terjadi kegagalan simpul atau terminasi pod.

Penempatan secara umum lebih disukai karena mendefinisikan ReplicaSet untuk memastikan bahwa jumlah Pod yang diinginkan selalu tersedia dan menetapkan strategi untuk mengganti Pod, seperti RollingUpdate.

maelga
sumber
1

Di kubernetes, Pod adalah unit terkecil yang dapat digunakan. Setiap kali ketika kita membuat objek kubernetes seperti Penyebaran, replika-set, set statefuls, daemonset itu membuat pod.

Seperti disebutkan di atas, penyebaran membuat pod berdasarkan keadaan yang diinginkan yang disebutkan dalam objek penempatan Anda. Jadi misalnya Anda ingin 5 replika aplikasi, Anda sebutkanreplicas: 5 dalam manifes penyebaran Anda. Sekarang pengendali penyebaran bertanggung jawab untuk membuat 5 replika identik (tidak kurang, tidak lebih) dari aplikasi yang diberikan dengan semua metadata seperti kebijakan RBAC, kebijakan jaringan, label, anotasi, pemeriksaan kesehatan, kuota sumber daya, noda / toleransi dan lain-lain dan bergaul dengan masing-masing pod itu menciptakan.

Ada beberapa kasus ketika Anda ingin membuat pod, misalnya jika Anda menjalankan tes sespan di mana Anda tidak perlu menjalankan aplikasi selamanya, Anda tidak perlu beberapa replika, dan Anda menjalankan aplikasi ketika Anda ingin mengeksekusi di dalamnya case pod cocok. Misalnya helm test, yang merupakan definisi pod yang menentukan wadah dengan perintah yang diberikan untuk dijalankan.

Balkrishna
sumber