kubectl berlaku vs kubectl buat?

266

Apa yang saya pahami dari dokumentasi adalah:

  • kubectl create = Membuat sumber daya k8 baru di cluster
  • kubectl replace = Memperbarui sumber daya di live cluster
  • kubectl apply = Jika saya ingin membuat buat + ganti ( Referensi )

Pertanyaan saya adalah

  1. Mengapa ada tiga operasi untuk melakukan tugas yang sama dalam sebuah cluster?
  2. Apa kasus penggunaan untuk operasi ini?
  3. Bagaimana mereka berbeda satu sama lain di bawah tenda?
Suresh Vishnoi
sumber

Jawaban:

315

Itu adalah dua pendekatan yang berbeda:

Manajemen Imperatif

kubectl createadalah apa yang kita sebut Manajemen Imperatif . Pada pendekatan ini Anda memberi tahu Kubernetes API apa yang ingin Anda buat, ganti atau hapus, bukan seperti yang Anda inginkan dari dunia cluster K8s Anda.

Manajemen Deklaratif

kubectl applyadalah bagian dari pendekatan Manajemen Deklaratif , di mana perubahan yang mungkin Anda terapkan ke objek hidup (yaitu melalui scale) adalah " dipertahankan " bahkan jika Anda applymengubah objek lain.

Anda dapat membaca lebih lanjut tentang manajemen imperatif dan deklaratif dalam dokumentasi Manajemen Objek Kubernetes .

Ara Pulido
sumber
24
Yang mana yang akan digunakan dalam produksi?
Yogesh Jilhawar
11
@YogeshJilhawar keduanya adalah cara yang valid untuk bekerja dalam produksi.
Persaingan
2
Jadi pada intinya, itu seperti seluruh modifikasi objek vs tambalan parsial?
Ryall
12
Jawaban ini tidak mengkonfirmasi apakah kedua operasi ini kubectl createdan kubectl applymemiliki efek yang sama atau tidak.
Nawaz
61
@Nawaz - Mereka melakukan hal yang berbeda. kubectl createakan melempar kesalahan jika sumber daya sudah ada. kubectl applybiasa. Perbedaannya adalah bahwa kubectl createsecara khusus mengatakan "buat hal ini" sedangkan kubectl applymengatakan "lakukan apa pun yang diperlukan (buat, perbarui, dll) agar terlihat seperti ini".
Tn. Llama
44

Saat menjalankan skrip CI, Anda akan mengalami masalah dengan perintah imperatif karena membuat menimbulkan kesalahan jika sumber daya sudah ada.

Yang bisa Anda lakukan adalah menerapkan (pola deklaratif) output dari perintah imperatif Anda, dengan menggunakan --dry-run=truedan -o yamlopsi:

kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -

Perintah di atas tidak akan menimbulkan kesalahan jika sumber daya sudah ada (dan akan memperbarui sumber daya jika diperlukan).

Ini sangat berguna dalam beberapa kasus di mana Anda tidak dapat menggunakan pola deklaratif (misalnya ketika membuat rahasia buruh pelabuhan-registri).

Sébastien Dan
sumber
Atau, hapus sumber daya sebelum membuatnya, dengan flag --ignore-not-found . Ini tidak akan meningkatkan kesalahan AlreadyExists . Misalnya:kubectl delete deployment nginx --ignore-not-found; kubectl create deployment nginx --image=nginx
Noam Manos
33

Hanya untuk memberikan jawaban yang lebih lurus, dari pemahaman saya:

apply- membuat perubahan tambahan ke objek yang ada
create- membuat objek baru (sebelumnya tidak ada / dihapus)


Mengambil ini dari artikel DigitalOcean yang ditautkan oleh situs web Kubernetes:

Kami menggunakan apply alih-alih membuat di sini sehingga di masa mendatang kami dapat secara bertahap menerapkan perubahan pada objek Pengontrol Ingress alih-alih menimpa mereka sepenuhnya.

Pengguna9123
sumber
Apakah itu? seperti ketika kita menggunakan docker-compose: + gunakan applylike docker-compose up -d+ use createlike docker-compose up -d --build?
Whoiskp
8

Ini adalah perintah penting :

kubectl run = kubectl create deployment

Keuntungan:

  • Sederhana, mudah dipelajari dan mudah diingat.
  • Hanya perlu satu langkah untuk membuat perubahan pada kluster.

Kekurangan:

  • Jangan berintegrasi dengan proses peninjauan perubahan.
  • Jangan berikan jejak audit yang terkait dengan perubahan.
  • Jangan memberikan sumber catatan kecuali untuk apa yang hidup.
  • Jangan berikan templat untuk membuat objek baru.

Ini adalah konfigurasi objek imperatif :

kubectl create -f your-object-config.yaml

kubectl delete -f your-object-config.yaml

kubectl replace -f your-object-config.yaml

Keuntungan dibandingkan dengan perintah imperatif:

  • Dapat disimpan dalam sistem kontrol sumber seperti Git.
  • Dapat diintegrasikan dengan proses seperti meninjau perubahan sebelum mendorong dan mengaudit jejak.
  • Menyediakan template untuk membuat objek baru.

Kerugian dibandingkan dengan perintah imperatif:

  • Membutuhkan pemahaman dasar tentang skema objek.
  • Membutuhkan langkah tambahan untuk menulis file YAML.

Keuntungan dibandingkan dengan konfigurasi objek deklaratif:

  • Lebih sederhana dan mudah dimengerti.
  • Lebih dewasa setelah Kubernetes versi 1.5.

Kerugian dibandingkan dengan konfigurasi objek deklaratif:

  • Berfungsi paling baik pada file, bukan direktori.
  • Pembaruan untuk objek hidup harus tercermin dalam file konfigurasi, atau mereka akan hilang selama penggantian berikutnya.

Ini adalah konfigurasi objek deklaratif

kubectl diff -f configs/

kubectl apply -f configs/

Keuntungan dibandingkan dengan konfigurasi objek imperatif:

  • Perubahan yang dibuat langsung ke objek langsung dipertahankan, meskipun tidak digabungkan kembali ke file konfigurasi.
  • Dukungan yang lebih baik untuk beroperasi pada direktori dan secara otomatis mendeteksi jenis operasi (buat, tambal, hapus) per-objek.

Kerugian dibandingkan dengan konfigurasi objek imperatif:

  • Sulit untuk di-debug dan memahami hasil ketika itu tidak terduga.
  • Pembaruan sebagian menggunakan diff membuat operasi gabungan dan tambalan yang kompleks.
Zoe Paranoid
sumber
3

Penjelasan di bawah ini dari dokumentasi resmi membantu saya mengerti kubectl apply.

Perintah ini akan membandingkan versi konfigurasi yang Anda dorong dengan versi sebelumnya dan menerapkan perubahan yang Anda buat, tanpa menimpa perubahan otomatis apa pun untuk properti yang belum Anda tentukan.

kubectl create di sisi lain akan menciptakan sumber daya (harus tidak ada).

f01
sumber
1

kubectl create dapat bekerja dengan satu file konfigurasi objek sekaligus. Ini juga dikenal sebagai manajemen imperatif

kubectl buat -f nama file | url

kubectl menerapkan karya dengan direktori dan sub direktori yang berisi file konfigurasi objek yaml. Ini juga dikenal sebagai manajemen deklaratif. Beberapa file konfigurasi objek dari direktori dapat diambil. kubectl terapkan direktori -f /

Detail:
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/ https://kubernetes.io/docs/tugas/manage-kubernetes-objects/imperative-config/

Noman Khan
sumber
0

Kami mencintai Kubernetes karena sekali kita memberi mereka apa yang kita inginkan, ia akan mencari cara untuk mencapainya tanpa keterlibatan kita.

"menciptakan" itu seperti memainkan TUHAN dengan mengambil segala sesuatu ke tangan kita sendiri. Ini bagus untuk debugging lokal ketika Anda hanya ingin bekerja dengan POD dan tidak peduli dengan Deployment / Controller Replikasi.

"apply" dimainkan sesuai aturan. "apply" seperti alat utama yang membantu Anda membuat dan memodifikasi dan tidak memerlukan apa pun dari Anda untuk mengelola pod.

Ankur Kothari
sumber