kubectl aplicar vs kubectl crear?
Lo que entendí por la documentación es que:
-
Crea un nuevo recurso k8s en el clúster.kubectl create
-
Actualiza un recurso en el clúster en vivo.kubectl replace
-
Si quiero crear + reemplazar ( Referencia )kubectl apply
mis preguntas son
- ¿Por qué hay tres operaciones para realizar la misma tarea en un clúster?
- ¿Cuáles son los casos de uso para estas operaciones?
- ¿En qué se diferencian entre sí bajo el capó?
Esos son dos enfoques diferentes:
Gestión imperativa
kubectl create
Es lo que llamamos Gestión Imperativa . En este enfoque, le dice a la API de Kubernetes lo que desea crear, reemplazar o eliminar, no cómo desea que se vea su mundo de clústeres K8.
Gestión declarativa
kubectl apply
es parte del enfoque de Gestión Declarativa , donde los cambios que haya aplicado a un objeto activo (es decir, a través de scale
) se " mantienen " incluso si realiza apply
otros cambios en el objeto.
Puede leer más sobre la gestión imperativa y declarativa en la documentación de Kubernetes Object Management .
En laicos hacen cosas diferentes. Si el recurso existe, kubectl create
se producirá un error y kubectl apply
no se producirá un error.
Cuando se ejecuta en un script de CI, tendrá problemas con los comandos imperativos, ya que la creación genera un error si el recurso ya existe.
Lo que puedes hacer es aplicar (patrón declarativo) la salida de tu comando imperativo, usando --dry-run=true
y -o yaml
las opciones:
kubectl create whatever --dry-run=client -o yaml | kubectl apply -f -
El comando anterior no generará un error si el recurso ya existe (y lo actualizará si es necesario).
Esto es muy útil en algunos casos en los que no se puede utilizar el patrón declarativo (por ejemplo, al crear un secreto de registro de Docker).
Una de las mejores formas de comprender la diferencia entre patrones imperativos y declarativos para principiantes.
Ref: https://www.digitalocean.com/community/tutorials/imperative-vs-declarative-kubernetes-management-a-digitalocean-comic
EDITAR
Hay un error, es el ejemplo mencionado en la imagen. Consulte los comentarios para una mejor comprensión.
También puede consultar el siguiente ejemplo.
Imperativo :
- toma una sartén.
- enciende la estufa.
- agregue agua, azúcar, café en polvo, leche en la cacerola
- esperar hasta la preparación del café
- servir café en taza.
Declarativo:
- Dile al camarero que necesitas una taza de café. Él te sirve café.
Desde la perspectiva de K8:
Imperativo: debe administrar diferentes recursos como pods, servicios, conjuntos de réplicas, etc. por su cuenta.
Declarativo: K8 se encargará de todos los recursos, todo lo que necesita es especificar cuál es su requisito real.
Solo para dar una respuesta más sencilla, según tengo entendido:
apply
- realiza cambios incrementales en un objeto existente
create
- crea un objeto completamente nuevo (anteriormente no existente/eliminado)
Tomando esto de un artículo de DigitalOcean vinculado al sitio web de Kubernetes:
Usamos aplicar en lugar de crear aquí para que en el futuro podamos aplicar cambios de forma incremental a los objetos del controlador de ingreso en lugar de sobrescribirlos por completo.