kubectl apply
y kubectl create
ambos son dos enfoques diferentes para crear recursos en el entorno de clúster de Kubernetes.
Ambos crean recursos desde un archivo o desde STDIN.
kubectl apply and create:dos enfoques para crear recursos
Ahora entremos en algunos detalles y entendamos cómo kubectl se aplica y se diferencia entre sí durante la implementación.
kubectl create:gestión imperativa
kubectl create
es lo que llamamos gestión imperativa. En este enfoque, le indica a la API de Kubernetes lo que desea crear, reemplazar o eliminar.
En palabras más simples, create
crea un objeto completamente nuevo (anteriormente inexistente o eliminado).
kubectl apply:gestión declarativa
kubectl apply
es parte del enfoque de administración declarativa, donde los cambios que puede haber aplicado a un objeto vivo (es decir, a través de scale
) será "mantenida " incluso si apply
otros cambios en el objeto.
En palabras más simples, apply
- realiza cambios incrementales en un objeto existente definiendo lo que necesitamos.
Comprender la diferencia entre kubectl create y apply con ejemplo
Usaré el siguiente archivo YAML para crear un pod de Kubernetes.
[email protected]:~/pod-create# cat mypod.yml
apiVersion: v1
kind: Pod
metadata:
name: create-vs-apply-demo
labels:
app: front-end
rel: dev
spec:
containers:
- name: httpd
image: docker.io/httpd
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
Vamos a crear el Pod de manera imperativa, es decir, usando kubectl create
comando:
[email protected]:~/pod-create# kubectl create -f mypod.yml
pod/create-vs-apply-demo created
Enumere el estado del pod junto con las etiquetas:
[email protected]:~/pod-create# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
create-vs-apply-demo 1/1 Running 0 8s app=front-end,rel=dev
Ahora editaré el archivo YAML y le agregaré una etiqueta adicional (demostración:applyVscreate).
[email protected]:~/pod-create# cat mypod.yml
apiVersion: v1
kind: Pod
metadata:
name: create-vs-apply-demo
labels:
app: front-end
rel: dev
demo: applyVscreate
spec:
containers:
- name: httpd
image: docker.io/httpd
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
Ahora utilicemos de nuevo el enfoque imperativo para aplicar los cambios.
[email protected]:~/pod-create# kubectl create -f mypod.yml
Error from server (AlreadyExists): error when creating "mypod.yml": pods "create-vs-apply-demo" already exists
Lanza un error y dice que el recurso ya existe.
Ahora hagamos la misma operación usando un enfoque declarativo, es decir, kubectl apply
comando.
[email protected]:~/pod-create# kubectl apply -f mypod.yml
pod/create-vs-apply-demo configured
Entonces, el recurso se configuró esta vez. Verifica los cambios realizados.
[email protected]:~/pod-create# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
create-vs-apply-demo 1/1 Running 0 3m19s app=front-end,demo=applyVscreate,rel=dev
Puede ver que la nueva etiqueta se ha aplicado al pod.
Creo que ahora debería tener una comprensión clara de los dos enfoques.
¿Kubectl crear o aplicar? ¿Cuál usar?
Depende del caso de uso cómo desea utilizar estos conceptos o metodología. No se trata de cuál es bueno o cuál es malo.
Si desea control de versiones el objeto k8s entonces es mejor usar declarative (kubectl apply) que ayuda a determinar la precisión de los datos en los objetos k8s.
Y si solo desea crear algún recurso para resolución de problemas, aprendizaje o experimentación interactiva ir con imperativo enfoque (kubectl create).
¿Sigo confundido? Deja un comentario e intentaré resolver tus dudas.
Rakesh Jain
Profesional DevOps | RHCA | Jenkins | Git | ventana acoplable | Kubernetes | Ansible | Prometeo | Grafana | Nube de AWS