Kubernetes generalmente se describe como un sistema declarativo. La mayor parte del tiempo trabaja con YAML que define cómo debería ser el estado final del sistema. Sin embargo, Kubernetes también admite API imperativas, donde emite un comando y obtiene un resultado inmediato.
En este artículo, exploraremos las diferencias entre estas dos formas de administración de objetos. Lo más probable es que ya haya usado ambos, incluso si no reconoce los términos.
Declarativo vs Imperativo: Definiciones
En primer lugar, es útil examinar la terminología.
algo que es declarativo hace una declaración del resultado final, indicando la intención pero no el proceso para lograrlo. En Kubernetes, esto dice "Debe haber un ReplicaSet con tres pods".
Un imperativo actúa como un comando. Mientras que un declarativo es pasivo, los imperativos son activos e inmediatos: "Crear un ReplicaSet con tres Pods".
El ecosistema de Kubernetes proporciona mecanismos para interactuar con su clúster en cualquiera de estas formas. Los enfoques imperativos son atendidos por comandos CLI y archivos YAML individuales. La configuración declarativa se facilita utilizando directorios de archivos que se combinan en la representación final del recurso.
Administrar objetos de forma imperativa
Aquí hay un ejemplo de cómo crear una implementación de manera imperativa:
kubectl create deployment my-deployment --image my-image:latest
Está instruyendo a Kubernetes para que agregue inmediatamente una nueva implementación a su clúster. El comando incluye un solo verbo (create
) y el nombre del tipo de recurso con el que está trabajando (deployment
).
También puede escribir un archivo YAML y aplicarlo imperativamente usando el create
mando:
apiVersion: apps/v1 kind: Deployment spec: replicas: 3 selector: matchLabels: app: example template: metadata: labels: app: example spec: # ...
kubectl create -f deployment.yml
Como antes, está emitiendo un comando inmediato a través de un verbo activo. Kubernetes tomará la configuración de su archivo y creará los recursos correspondientes en el clúster. Si necesita actualizar un recurso, debe modificar su YAML y usar el replace
Comando para efectuar el cambio:
kubectl replace -f deployment.yml
Esta operación se retirar la especificación de cualquier recurso existente y reemplácelo con la versión en su archivo de configuración. Esto se transmite por el nombre de la replace
mando. Significa que perderá cualquier cambio realizado en sus objetos en vivo que no estén presentes en su YAML.
Cuando Kubernetes consume comandos imperativos, se le debe indicar exactamente qué hacer. En consecuencia, no hay forma de aplicar selectivamente solo las partes modificadas de su YAML. Para eso, deberá cambiar a operaciones declarativas.
Probar la gestión declarativa
La administración declarativa solo está disponible cuando usa archivos de configuración YAML. No existe tal cosa como un comando declarativo. Cuando usa operaciones declarativas, no le dice a Kubernetes qué hacer al proporcionar un verbo (create
/replace
). En su lugar, utiliza el único apply
ordene y confíe en Kubernetes para determinar las acciones a realizar.
kubectl apply -f deployment.yml
Continuando con el ejemplo de implementación de arriba, aplicar el YAML anterior a su clúster inicialmente actuaría igual que un imperativo create
mando. Para empezar, no existirá ningún recurso coincidente, por lo que Kubernetes debe crear uno nuevo.
A continuación, podría cambiar el replicas
campo a 5
y repite el apply
mando. Esta vez, Kubernetes coincidirá con el recurso existente, detectará el cambio en su YAML y escalará la implementación sin afectar ningún otro campo.
Usando el enfoque imperativo, necesitaría usar el kubectl scale
Comando para cambiar el recuento de réplicas de una implementación existente. Si modificaste el YAML que usaste con kubectl create
, necesitarías correr kubectl replace
- pero esto reemplazaría todo el despliegue spec
, en lugar de simplemente escalar su recuento de réplicas.
Declarativo vs Imperativo: Comparando las compensaciones
Las operaciones imperativas son fáciles de entender y razonar. Cada acción se expresa como un verbo con una consecuencia claramente definida. Por esta razón, la mayoría de las personas comenzarán sus primeras interacciones con Kubernetes utilizando comandos imperativos que pueden asignarse libremente a otras tecnologías como Docker.
La gestión declarativa expone el poder real de Kubernetes. Usted declara cómo debería ser el estado final y luego deja que Kubernetes haga el resto. Cada comando tiene la misma acción imperativa: apply
este conjunto de archivos YAML y el progreso del clúster al estado que definen.
La gestión declarativa es ideal para implementaciones automatizadas. No es necesario que dedique tiempo a crear un conjunto de instrucciones de migración cada vez que actualice un recurso. En su lugar, ajuste su YAML para que produzca objetos configurados correctamente si se crearan de nuevo en este momento. Kubernetes manejará las actualizaciones de los objetos existentes para que también coincidan con el nuevo estado.
Los archivos YAML declarativos son fáciles de versionar, revisar y fusionar como parte de su sistema de control de código fuente. Si usa comandos imperativos, no tiene forma de rastrear cómo ha evolucionado su clúster y será más complicado volver a un estado anterior. A diferencia de las operaciones imperativas, las actualizaciones declarativas no sobrescriben todo el objeto, por lo que conservará los cambios realizados a través de otros mecanismos, independientemente de sus archivos YAML.
Sin embargo, la gestión imperativa conserva algunas ventajas. La configuración declarativa agrega capas de complejidad y puede ser más difícil de depurar, particularmente cuando Kubernetes selecciona un curso de acción inesperado. Cada cambio da como resultado una operación de combinación y parche para alinear sus objetos con el estado deseado. Con el modelo imperativo, lo que pides es lo que obtienes, a menos que ocurra un error.
Como siempre, cuando se ofrecen dos enfoques, ambas estrategias son útiles y la que elija dependerá del contexto. Para los clústeres de producción que alojan aplicaciones en vivo con cambios frecuentes, probablemente desee archivos YAML declarativos versionados. Si está creando rápidamente nuevos contenedores en un clúster de desarrollo, los comandos imperativos ahorrarán tiempo y será más fácil trabajar con ellos.
Conclusión
La gestión declarativa e imperativa son dos formas de interactuar con su clúster de Kubernetes y sus recursos. Kubectl tiene soporte integrado para ambas estrategias, pero las técnicas no deben mezclarse por objeto. Si crea un objeto de forma declarativa, debe administrarse de esa manera durante toda su vida; el uso de comandos imperativos con él puede provocar un comportamiento inesperado.
Las operaciones imperativas afectan a los objetos vivos dentro de su clúster. Usted define un verbo, un recurso y una configuración a través de indicadores y argumentos de comando. La gestión declarativa se basa en cambios en los archivos de configuración locales que Kubectl diferencia y aplica al clúster a través de parches cuando usa el kubectl diff
y kubectl apply
comandos
Descubre más contenido