kubectl uygulamak vs kubectl oluşturmak?


266

Belgelerle anladığım şey şudur:

  • kubectl create = Kümede yeni bir k8s kaynağı oluşturur
  • kubectl replace = Canlı kümedeki bir kaynağı günceller
  • kubectl uygula = create + replace yapmak istersem ( Referans )

Sorularım

  1. Aynı görevi bir kümede yapmak için neden üç işlem var?
  2. Bu operasyonlar için kullanım durumları nelerdir?
  3. Kaputun altında birbirlerinden nasıl farklıdırlar?

Yanıtlar:


315

Bunlar iki farklı yaklaşımdır:

Zorunlu Yönetim

kubectl createbizim Emir Yönetimi diyoruz . Bu yaklaşımda Kubernetes API'sine K8s küme dünyasının nasıl görünmesini istediğinizi değil, oluşturmak, değiştirmek veya silmek istediğinizi söylersiniz.

Beyan Yönetimi

kubectl apply, canlı bir nesneye uygulayabileceğiniz (yani içinden ) yaptığınız değişikliklerin, nesnede başka değişiklikler yapsanız bile " korunduğu " Deklaratif Yönetim yaklaşımının bir parçasıdır .scaleapply

Zorunlu ve bildirimsel yönetim hakkında daha fazla bilgiyi Kubernetes Nesne Yönetimi belgelerinde okuyabilirsiniz .


24
O zaman hangisi üretimde kullanılacak?
Yogesh Jilhawar

11
@YogeshJilhawar, üretimde çalışmanın geçerli yollarıdır.
guival

2
Yani özünde, kısmi bir yamaya karşı tüm nesne modifikasyonu gibi mi?
Ryall

12
Bu cevap, bu iki operasyonlar olmadığını teyit etmedi kubectl createve kubectl applyaynı etkiyi veya yok.
Nawaz

61
@Nawaz - Farklı şeyler yapıyorlar. kubectl createkaynak zaten mevcutsa bir hata atar. kubectl applyalışkanlık. Aradaki fark kubectl createözellikle "bu şeyi yarat" kubectl applyderken "bunun gibi görünmesi için ne gerekiyorsa yap (oluştur, güncelle, vb.)" Der.
Bay Llama

44

Bir CI komut dosyasında çalışırken , kaynak zaten varsa create komutu bir hata oluşturduğundan , zorunlu komutlarda sorun yaşarsınız.

Yapabileceğiniz şey, ve komutlarını kullanarak zorunlu komutunuzun çıktısını uygulamaktır (bildirim deseni) :--dry-run=true-o yaml

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

Yukarıdaki komut, kaynak zaten varsa bir hata oluşturmaz (ve gerekirse kaynağı günceller).

Bu, bildirim desenini kullanamayacağınız bazı durumlarda çok yararlıdır (örneğin, bir docker-kayıt defteri sırrı oluştururken).


Alternatif olarak, kaynağı oluşturmadan önce --ignore-not found bayrağı ile silin . Bu AlreadyExists hatasını yükseltmez . Örneğin:kubectl delete deployment nginx --ignore-not-found; kubectl create deployment nginx --image=nginx
Noam Manos

33

Anladığım kadarıyla daha doğrudan bir cevap vermek için:

apply- mevcut bir nesnede artımlı değişiklikler yapar
create- tamamen yeni bir nesne oluşturur (önceden var olmayan / silinmiş)


Bunu Kubernetes web sitesi tarafından bağlanan bir DigitalOcean makalesinden almak :

Gelecekte Ingress Controller nesnelerine tamamen üzerine yazmak yerine kademeli olarak değişiklikler uygulayabilmemiz için create (oluştur) yerine replace kullanıyoruz.


Bu mu? docker-compose kullandığımız applygibi : + like docker-compose up -d+ use createlike docker-compose up -d --build?
Whoiskp

8

Bunlar zorunlu komutlardır :

kubectl run = kubectl create deployment

Avantajları:

  • Basit, öğrenmesi kolay ve hatırlaması kolay.
  • Kümede değişiklik yapmak için yalnızca tek bir adım gerekir.

Dezavantajları:

  • Değişiklik inceleme süreçlerine entegre olmayın.
  • Değişikliklerle ilişkili bir denetim izi sunmayın.
  • Canlı olanlar dışında bir kayıt kaynağı sunmayın.
  • Yeni nesneler oluşturmak için şablon sunmayın.

Bunlar zorunlu nesne yapılandırmasıdır :

kubectl create -f your-object-config.yaml

kubectl delete -f your-object-config.yaml

kubectl replace -f your-object-config.yaml

Zorunlu komutlarla karşılaştırıldığında avantajları:

  • Git gibi bir kaynak kontrol sisteminde depolanabilir.
  • Zorlama ve denetim izlerinden önce değişiklikleri gözden geçirme gibi süreçlerle entegre olabilir.
  • Yeni nesneler oluşturmak için bir şablon sağlar.

Zorunlu komutlarla karşılaştırıldığında dezavantajlar:

  • Nesne şemasının temel olarak anlaşılmasını gerektirir.
  • YAML dosyası yazmanın ek adımını gerektirir.

Bildirici nesne yapılandırmasına kıyasla avantajları:

  • Daha basit ve anlaşılması daha kolay.
  • Kubernetes 1.5 sürümünden sonra daha olgun.

Bildirici nesne yapılandırmasına kıyasla dezavantajlar:

  • Dizinlerde değil, dosyalarda en iyi şekilde çalışır.
  • Canlı nesnelerde yapılan güncellemeler yapılandırma dosyalarına yansıtılmalıdır, aksi takdirde bir sonraki değiştirme sırasında kaybolacaktır.

Bunlar bildirim amaçlı nesne yapılandırmasıdır

kubectl diff -f configs/

kubectl apply -f configs/

Zorunlu nesne yapılandırmasına kıyasla avantajları:

  • Canlı nesnelere doğrudan yapılan değişiklikler, yapılandırma dosyalarıyla yeniden birleştirilmeseler bile korunur.
  • Dizinler üzerinde çalışma ve nesne başına işlem türlerini (oluşturma, düzeltme eki, silme) otomatik olarak algılama için daha iyi destek.

Zorunlu nesne yapılandırmasına kıyasla dezavantajlar:

  • Beklenmedik olduğunda sonuçları ayıklamak ve anlamak daha zordur.
  • Diffs kullanan kısmi güncellemeler karmaşık birleştirme ve yama işlemleri oluşturur.

3

Resmi belgelerden aşağıdaki açıklama anlamama yardımcı oldu kubectl apply.

Bu komut, zorladığınız yapılandırmanın sürümünü önceki sürümle karşılaştırır ve belirtmediğiniz özelliklerde otomatik değişikliklerin üzerine yazmadan yaptığınız değişiklikleri uygular.

kubectl create Öte yandan kaynaklar yaratacaktır (mevcut olmamalıdır).


1

kubectl create bir kerede bir nesne yapılandırma dosyası ile çalışabilir. Bu zorunlu yönetim olarak da bilinir

kubectl create -f dosya adı | url

kubectl uygula , nesne yapılandırması yaml dosyalarını içeren dizinler ve alt dizinleriyle çalışır. Buna bildirimsel yönetim de denir. Dizinlerden birden fazla nesne yapılandırma dosyası alınabilir. kubectl uygula -f dizini /

Ayrıntılar:
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/ https://kubernetes.io/docs/tasks/manage-kubernetes-objects/imperative-config/


0

Kubernetes'i seviyoruz çünkü onlara istediğimizi verdikten sonra, herhangi bir katılımımız olmadan bunu nasıl başaracağımızı anlamaya devam ediyor.

“yarat” şeyleri kendi ellerimize alarak Tanrı'yı ​​oynamak gibidir. Sadece POD ile çalışmak ve Dağıtım / Çoğaltma Denetleyicisini önemsememek istediğinizde yerel hata ayıklama için iyidir.

"uygulamak" kurallara göre oynuyor. "uygulamak", oluşturmanıza ve değiştirmenize yardımcı olan ve bölmeleri yönetmek için sizden hiçbir şey gerektirmeyen bir ana araç gibidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.