Information in this document may be out of date
This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Declarative Management of Kubernetes Objects Using Configuration Files
Objetos en Kubernetes pueden ser creados, actualizados y eliminados utilizando archivos de configuración almacenados en un directorio. Usando el comando kubectl apply
podrá crearlos o actualizarlos de manera recursiva según sea necesario. Este método retiene cualquier escritura realizada contra objetos activos en el sistema sin unirlos de regreso a los archivos de configuración. kubectl diff
le permite visualizar de manera previa los cambios que apply
realizará.
Instale kubectl
.
Debes tener un cluster Kubernetes a tu dispocición, y la herramienta de línea de comandos kubectl
debe estar configurada. Si no tienes un cluster, puedes crear uno utilizando Minikube, o puedes utilizar una de las siguientes herramientas en línea:
Para comprobar la versión, introduzca kubectl version
.
La herramienta kubectl
soporta tres modos distintos para la administración de objetos:
Acceda Administración de objetos de Kubernetes para una discusión de las ventajas y desventajas de cada modo distinto de administración.
La configuración de objetos declarativa requiere una comprensión firme de la definición y configuración de objetos de Kubernetes. Si aún no lo ha hecho, lea y complete los siguientes documentos:
A continuación la definición de términos usados en este documento:
kubectl apply
. Los archivos de configuración por lo general se almacenan en un sistema de control de versiones, como Git.kubectl apply
para aplicarlos.Utilice kubectl apply
para crear todos los objetos definidos en los archivos de configuración existentes en un directorio específico, con excepción de aquellos que ya existen:
kubectl apply -f <directorio>/
Esto definirá la anotación kubectl.kubernetes.io/last-applied-configuration: '{...}'
en cada objeto. Esta anotación contiene el contenido del archivo de configuración utilizado para la creación del objeto.
-R
para procesar un directorio de manera recursiva.El siguiente es un ejemplo de archivo de configuración para un objeto:
apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:selector:matchLabels:app:nginxminReadySeconds:5template:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.14.2ports:- containerPort:80
Ejecute kubectl diff
para visualizar el objeto que será creado:
kubectl diff -f https://k8s.io/examples/application/simple_deployment.yaml
diff
utiliza server-side dry-run, que debe estar habilitado en el kube-apiserver
.
Dado que diff
ejecuta una solicitud de apply
en el servidor en modo de simulacro (dry-run), requiere obtener permisos de PATCH
, CREATE
, y UPDATE
. Vea Autorización Dry-Run para más detalles.
Cree el objeto usando kubectl apply
:
kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml
Despliegue la configuración activa usando kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
La salida le mostrará que la anotación kubectl.kubernetes.io/last-applied-configuration
fue escrita a la configuración activa, y es consistente con los contenidos del archivo de configuración:
kind:Deploymentmetadata:annotations:# ...# Esta es la representación JSON de simple_deployment.yaml# Fue escrita por kubectl apply cuando el objeto fue creadokubectl.kubernetes.io/last-applied-configuration:| {"apiVersion":"apps/v1","kind":"Deployment", "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"}, "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}}, "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx", "ports":[{"containerPort":80}]}]}}}}# ...spec:# ...minReadySeconds:5selector:matchLabels:# ...app:nginxtemplate:metadata:# ...labels:app:nginxspec:containers:- image:nginx:1.14.2# ...name:nginxports:- containerPort:80# ...# ...# ...# ...
También puede usar kubectl apply
para actualizar los objetos definidos en un directorio, aún cuando esos objetos ya existan en la configuración activa. Con este enfoque logrará lo siguiente:
kubectl diff -f <directorio>/ kubectl apply -f <directorio>/
-R
para procesar directorios de manera recursiva.Este es un ejemplo de archivo de configuración:
apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:selector:matchLabels:app:nginxminReadySeconds:5template:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.14.2ports:- containerPort:80
Cree el objeto usando kubectl apply
:
kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml
Despliegue la configuración activa usando kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
La salida le mostrará que la anotación kubectl.kubernetes.io/last-applied-configuration
fue escrita a la configuración activa, y es consistente con los contenidos del archivo de configuración:
kind:Deploymentmetadata:annotations:# ...# Esta es la representación JSON de simple_deployment.yaml# Fue escrita por kubectl apply cuando el objeto fue creadokubectl.kubernetes.io/last-applied-configuration:| {"apiVersion":"apps/v1","kind":"Deployment", "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"}, "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}}, "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx", "ports":[{"containerPort":80}]}]}}}}# ...spec:# ...minReadySeconds:5selector:matchLabels:# ...app:nginxtemplate:metadata:# ...labels:app:nginxspec:containers:- image:nginx:1.14.2# ...name:nginxports:- containerPort:80# ...# ...# ...# ...
De manera directa, actualice el campo replicas
en la configuración activa usando kubectl scale
. En este caso no se usa kubectl apply
:
kubectl scale deployment/nginx-deployment --replicas=2
Despliegue la configuración activa usando kubectl get
:
kubectl get deployment nginx-deployment -o yaml
La salida le muestra que el campo replicas
ha sido definido en 2, y que la anotación last-applied-configuration
no contiene el campo replicas
:
apiVersion:apps/v1kind:Deploymentmetadata:annotations:# ...# note que la anotación no contiene replicas# debido a que el objeto no fue actualizado usando applykubectl.kubernetes.io/last-applied-configuration:| {"apiVersion":"apps/v1","kind":"Deployment", "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"}, "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}}, "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx", "ports":[{"containerPort":80}]}]}}}}# ...spec:replicas:2# definido por scale# ...minReadySeconds:5selector:matchLabels:# ...app:nginxtemplate:metadata:# ...labels:app:nginxspec:containers:- image:nginx:1.14.2# ...name:nginxports:- containerPort:80# ...
Actualice el archivo de configuración simple_deployment.yaml
para cambiar el campo image
de nginx:1.14.2
a nginx:1.16.1
, y elimine el campo minReadySeconds
:
apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.16.1# actualice el valor de imageports:- containerPort:80
Aplique los cambios realizados al archivo de configuración:
kubectl diff -f https://k8s.io/examples/application/update_deployment.yaml kubectl apply -f https://k8s.io/examples/application/update_deployment.yaml
Despliegue la configuración activa usando kubectl get
:
kubectl get -f https://k8s.io/examples/application/update_deployment.yaml -o yaml
La salida le mostrará los siguientes cambios hechos a la configuración activa:
replicas
retiene el valor de 2 definido por kubectl scale
. Esto es posible ya que el campo fue omitido en el archivo de configuración.image
ha sido actualizado de nginx:1.16.1
a nginx:1.14.2
.last-applied-configuration
ha sido actualizada con la nueva imagen.minReadySeconds
ha sido despejado.last-applied-configuration
ya no contiene el campo minReadySeconds
apiVersion:apps/v1kind:Deploymentmetadata:annotations:# ...# La anotación contiene la imagen acutalizada a nginx 1.11.9,# pero no contiene la actualización de las replicas a 2kubectl.kubernetes.io/last-applied-configuration:| {"apiVersion":"apps/v1","kind":"Deployment", "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"}, "spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}}, "spec":{"containers":[{"image":"nginx:1.16.1","name":"nginx", "ports":[{"containerPort":80}]}]}}}}# ...spec:replicas:2# Definido por `kubectl scale`. Ignorado por `kubectl apply`.# minReadySeconds fue despejado por `kubectl apply`# ...selector:matchLabels:# ...app:nginxtemplate:metadata:# ...labels:app:nginxspec:containers:- image:nginx:1.16.1# Definido `kubectl apply`# ...name:nginxports:- containerPort:80# ...# ...# ...# ...
kubectl apply
con comandos de configuración imperativa de objetos como create
y replace
. Esto se debe a que create
y replace
no retienen la anotación kubectl.kubernetes.io/last-applied-configuration
que kubectl apply
utiliza para calcular los cambios por realizar.Hay dos opciones diferentes para eliminar objetos gestionados por kubectl apply
.
kubectl delete -f <archivo>
La manera recomendada de eliminar objetos de manera manual es utilizando el comando imperativo, ya que es más explícito en relación a lo que será eliminado, y es menos probable que resulte en algo siendo eliminado sin la intención del usuario.
kubectl delete -f <archivo>
kubectl apply -f <directorio/> --prune -l etiqueta=deseada
Únicamente utilice esta opción si está seguro de saber lo que está haciendo.
kubectl apply --prune
se encuentra aún en alpha, y cambios incompatibles con versiones previas podrían ser introducidos en lanzamientos futuros.Como una alternativa a kubectl delete
, puede usar kubectl apply
para identificar objetos a ser eliminados, luego de que sus archivos de configuración han sido eliminados del directorio. El commando apply
con --prune
consulta a la API del servidor por todos los objetos que coincidan con un grupo de etiquetas, e intenta relacionar la configuración obtenida de los objetos activos contra los objetos según sus archivos de configuración. Si un objeto coincide con la consulta, y no tiene un archivo de configuración en el directorio, pero si tiene una anotación last-applied-configuration
, entonces será eliminado.
kubectl apply -f <directorio/> --prune -l <etiquetas>
apply
con --prune
debería de ser ejecutado únicamente en contra del directorio raíz que contiene los archivos de configuración. Ejecutarlo en contra de sub-directorios podría causar que objetos sean eliminados no intencionalmente, si son retornados en la consulta por selección de etiqueta usando -l <etiquetas>
y no existen en el subdirectorio.Puede usar kubectl get
con -o yaml
para ver la configuración de objetos activos:
kubectl get -f <archivo|url> -o yaml
Cuando kubectl apply
actualiza la configuración activa para un objeto, lo hace enviando una solicitud de patch al servidor de API. El patch define actualizaciones para campos específicos en la configuración del objeto activo. El comando kubectl apply
calcula esta solicitud de patch usando el archivo de configuración, la configuración activa, y la anotación last-applied-configuration
almacenada en la configuración activa.
El comando kubectl apply
escribe los contenidos de la configuración a la anotación kubectl.kubernetes.io/last-applied-configuration
. Esto es usado para identificar aquellos campos que han sido eliminados de la configuración y deben ser limpiados. Los siguientes pasos son usados para calcular que campos deben ser eliminados o definidos:
last-applied-configuration
pero ausentes en el archivo de configuración.A continuación un ejemplo. Suponga que este es el archivo de configuración para un objeto de tipo Deployment:
apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.16.1# actualice el valor de imageports:- containerPort:80
También, suponga que esta es la configuración activa para ese mismo objeto de tipo Deployment:
apiVersion:apps/v1kind:Deploymentmetadata:annotations:# ...# tome nota de que la anotación no contiene un valor para replicas# dado que no fue actualizado usando el comando applykubectl.kubernetes.io/last-applied-configuration:| {"apiVersion":"apps/v1","kind":"Deployment", "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"}, "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}}, "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx", "ports":[{"containerPort":80}]}]}}}}# ...spec:replicas:2# definidas por scale# ...minReadySeconds:5selector:matchLabels:# ...app:nginxtemplate:metadata:# ...labels:app:nginxspec:containers:- image:nginx:1.14.2# ...name:nginxports:- containerPort:80# ...
Estos son los cálculos de unión que serían realizados por kubectl apply
:
last-applied-configuration
y comparándolos con los valores en el archivo de configuración. Limpiar los campos definidos en null de manera explícita en el archivo de configuración sin tomar en cuenta si se encuentran presentes en la anotación last-applied-configuration
. En este ejemplo, minReadySeconds
aparece en la anotación last-applied-configuration
pero no aparece en el archivo de configuración. Acción: Limpiar minReadySeconds
de la configuración activa.image
en el archivo de configuración, no coincide con el valor en la configuración activa. Acción: Definir el campo image
en la configuración activa.last-applied-configuration
para que sea consistente con el archivo de configuración.Esta es la configuración activa como resultado de esta unión:
apiVersion:apps/v1kind:Deploymentmetadata:annotations:# ...# La anotación contiene la imágen actualizada a nginx 1.11.9,# pero no contiene la actualización a 2 replicaskubectl.kubernetes.io/last-applied-configuration:| {"apiVersion":"apps/v1","kind":"Deployment", "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"}, "spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}}, "spec":{"containers":[{"image":"nginx:1.16.1","name":"nginx", "ports":[{"containerPort":80}]}]}}}}# ...spec:selector:matchLabels:# ...app:nginxreplicas:2# Definido por `kubectl scale`. Ignorado por `kubectl apply`.# minReadySeconds eliminado por `kubectl apply`# ...template:metadata:# ...labels:app:nginxspec:containers:- image:nginx:1.16.1# Definido por `kubectl apply`# ...name:nginxports:- containerPort:80# ...# ...# ...# ...
La manera en la que los campos en un archivo de configuración son unidos con la configuración activa depende del tipo de campo. Existen varios tipos de campos:
primitivo: Campos de cadena de texto (string), enteros (integer), o lógicos (boolean). Por ejemplo, image
y replicas
son campos de tipo primitivo. Acción: Reemplazarlos.
mapa, también llamados objeto: Campo de tipo mapa o un tipo complejo que contiene sub-campos. Por ejemplo, labels
, annotations
,spec
y metadata
son todos mapas. Acción: Unir los elementos o sub-campos.
lista: Campos que contienen una lista de elementos que pueden ser de tipo primitivo o mapa. Como ejemplos, containers
, ports
, y args
son listas. Acción: Varía.
Cuando kubectl apply
actualiza un campo de tipo mapa o lista, típicamente no reemplaza el campo completo, sino actualiza los sub-elementos individuales. Por ejemplo, cuando se hace una unión del campo spec
en un Deployment, el spec
completo no es reemplazado, por el contrario, únicamente los sub-campos de spec
como replica
son comparados y unidos.
Campos primitivos son limpiados o reemplazados.
-
determina que "no aplica" debido a que el valor no es utilizado.Campo en el archivo de configuración | Campo en la configuración activa | Campo en last-applied-configuration | Acción |
---|---|---|---|
Si | Si | - | Define el valor en el archivo de configuración como activo. |
Si | No | - | Define el valor a la configuración local. |
No | - | Si | Elimina de la configuración activa. |
No | - | No | No hacer nada. Mantiene el valor activo. |
Los campos que conjuntamente representan un mapa, son unidos al comparar cada uno de los subcampos o elementos del mapa:
-
determina que "no aplica" debido a que el valor no es utilizado.Propiedad en archivo de configuración | Propiedad en configuración activa | Campo en last-applied-configuration | Acción |
---|---|---|---|
Si | Si | - | Comparar valores de sub-propiedades. |
Si | No | - | Usar configuración local. |
No | - | Si | Eliminar de la configuración activa. |
No | - | No | No hacer nada. Mantener el valor activo. |
El unir cambios en una lista utiliza una de tres posibles estrategias:
Se define la estrategia elegida con base en cada campo.
Trata la lista como si fuese un campo primitivo. Reemplaza o elimina la lista completa. Esto preserva el orden de los elementos.
Ejemplo: Usando kubectl apply
para actualizar el campo args
de un Contenedor en un Pod. Esto define el valor de args
en la configuración activa, al valor en el archivo de configuración. Cualquier elemento de args
que haya sido previamente agregado a la configuración activa se perderá. El orden de los elementos definidos en args
en el archivo de configuración, serán conservados en la configuración activa.
# valor en last-applied-configurationargs:["a","b"]# valores en archivo de configuraciónargs:["a","c"]# configuración activaargs:["a","b","d"]# resultado posterior a la uniónargs:["a","c"]
Explicación: La unión utilizó los valores del archivo de configuración para definir los nuevos valores de la lista.
Trata la lista como un mapa, y trata cada campo específico de cada elemento como una llave. Agrega, elimina o actualiza elementos individuales. Esta operación no conserva el orden.
Esta estrategia de unión utiliza una etiqueta especial en cada campo llamada patchMergeKey
. La etiqueta patchMergeKey
es definida para cada campo en el código fuente de Kubernetes: types.go Al unir una lista de mapas, el campo especificado en patchMergeKey
para el elemento dado se utiliza como un mapa de llaves para ese elemento.
Ejemplo: Utilice kubectl apply
para actualizar el campo containers
de un PodSpec. Esto une la lista como si fuese un mapa donde cada elemento utiliza name
por llave.
# valor en last-applied-configurationcontainers:- name:nginximage:nginx:1.16- name: nginx-helper-a # llave:nginx-helper-a; será eliminado en resultadoimage:helper:1.3- name: nginx-helper-b # llave:nginx-helper-b; será conservadoimage:helper:1.3# valor en archivo de configuracióncontainers:- name:nginximage:nginx:1.16- name:nginx-helper-bimage:helper:1.3- name: nginx-helper-c # llavel:nginx-helper-c; será agregado en el resultadoimage:helper:1.3# configuración activacontainers:- name:nginximage:nginx:1.16- name:nginx-helper-aimage:helper:1.3- name:nginx-helper-bimage:helper:1.3args:["run"]# Campo será conservado- name: nginx-helper-d # llave:nginx-helper-d; será conservadoimage:helper:1.3# resultado posterior a la unióncontainers:- name:nginximage:nginx:1.16# Elemento nginx-helper-a fue eliminado- name:nginx-helper-bimage:helper:1.3args:["run"]# Campo fue conservado- name:nginx-helper-c# Elemento fue agregadoimage:helper:1.3- name:nginx-helper-d# Elemento fue ignoradoimage:helper:1.3
Explicación:
args
en la configuración activa. kubectl apply
pudo identificar que el contenedor "nginx-helper-b" en la configuración activa es el mismo "nginx-helper-b" que aparece en el archivo de configuración, aún teniendo diferentes valores en los campos (no existe args
en el archivo de configuración). Esto sucede debido a que el valor del campo patchMergeKey
(name) es idéntico en ambos.A partir de Kubernetes 1.5, el unir listas de elementos primitivos no es soportado.
patchStrategy
en types.go es la que determina cual de las estrategias aplica para cualquier campo en particular. Para campos de tipo lista, el campo será reemplazado cuando no exista una especificación de patchStrategy
.El Servidor de API define algunos campos a sus valores por defecto si no son especificados al momento de crear un objeto.
Aquí puede ver un archivo de configuración para un Deployment. Este archivo no especifica el campo strategy
:
apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:selector:matchLabels:app:nginxminReadySeconds:5template:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.14.2ports:- containerPort:80
Cree un nuevo objeto kubectl apply
:
kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml
Despliegue la configuración activa usando kubectl get
:
kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml
La salida muestra que el servidor de API definió varios campos con los valores por defecto en la configuración activa. Estos campos no fueron especificados en el archivo de configuración.
apiVersion:apps/v1kind:Deployment# ...spec:selector:matchLabels:app:nginxminReadySeconds:5replicas:1# valor por defecto definido por apiserverstrategy:rollingUpdate:# valor por defecto definido por apiserver - derivado de strategy.typemaxSurge:1maxUnavailable:1type:RollingUpdate# valor por defecto definido por apiservertemplate:metadata:creationTimestamp:nulllabels:app:nginxspec:containers:- image:nginx:1.14.2imagePullPolicy:IfNotPresent# valor por defecto definido por apiservername:nginxports:- containerPort:80protocol:TCP# valor por defecto definido por apiserverresources:{}# valor por defecto definido por apiserverterminationMessagePath:/dev/termination-log# valor por defecto definido por apiserverdnsPolicy:ClústerFirst# valor por defecto definido por apiserverrestartPolicy:Always# valor por defecto definido por apiserversecurityContext:{}# valor por defecto definido por apiserverterminationGracePeriodSeconds:30# valor por defecto definido por apiserver# ...
En una solicitud de patch, los campos definidos a valores por defecto no son redefinidos a excepción de cuando hayan sido limpiados de manera explícita como parte de la solicitud de patch. Esto puede causar comportamientos no esperados para campos cuyo valor por defecto es basado en los valores de otros campos. Cuando el otro campo ha cambiado, el valor por defecto de ellos no será actualizado de no ser que sean limpiados de manera explícita.
Por esta razón, se recomienda que algunos campos que reciben un valor por defecto del servidor sean definidos de manera explícita en los archivos de configuración, aun cuando el valor definido sea idéntico al valor por defecto. Esto facilita la identificación de valores conflictivos que podrían no ser revertidos a valores por defecto por parte del servidor.
Ejemplo:
# last-applied-configurationspec:template:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.14.2ports:- containerPort:80# archivo de configuraciónspec:strategy:type:Recreate# valor actualizadotemplate:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.14.2ports:- containerPort:80# configuración activaspec:strategy:type:RollingUpdate# valor por defectorollingUpdate:# valor por defecto derivado del campo typemaxSurge :1maxUnavailable:1template:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.14.2ports:- containerPort:80# resultado posterior a la unión - ERROR!spec:strategy:type: Recreate # valor actualizado:incompatible con RollingUpdaterollingUpdate: # valor por defecto:incompatible con "type: Recreate"maxSurge :1maxUnavailable:1template:metadata:labels:app:nginxspec:containers:- name:nginximage:nginx:1.14.2ports:- containerPort:80
Explicación:
strategy.type
.strategy.type
a su valor por defecto de RollingUpdate
y agrega los valores por defecto a strategy.rollingUpdate
.strategy.type
a Recreate
. Los valores de strategy.rollingUpdate
se mantienen en su configuración por defecto, sin embargo el servidor espera que se limpien. Si los valores de strategy.rollingUpdate
hubiesen sido definidos inicialmente en el archivo de configuración, hubiese sido más claro que requerían ser eliminados.strategy.rollingUpdate
no fue eliminado. El campo strategy.rollingupdate
no puede estar definido, si el valor de strategy.type
es Recreate
.Recomendación: Estos campos deberían de ser definidos de manera explícita en el archivo de configuración:
Campos que no aparecen en el archivo de configuración pueden ser limpiados si se define su valor a null
y luego se aplica el archivo de configuración. Para los campos definidos a valores por defecto por el servidor, esto provoca que se reestablezca a sus valores por defecto.
Estos son los únicos métodos que debe usar para cambiar un campo individual de un objeto:
kubectl apply
.kubectl scale
.Añada el campo al archivo de configuración, y no realice nuevas actualizaciones a la configuración activa que no sucedan por medio de kubectl apply
.
A partir de Kubernetes 1.5, el cambiar un campo que ha sido definido por medio de un archivo de configuración para que sea modificado por un escritor imperativo requiere pasos manuales:
kubectl.kubernetes.io/last-applied-configuration
en el objeto activo.Los objetos en Kubernetes deberían de ser gestionados utilizando únicamente un método a la vez. El alternar de un método a otro es posible, pero es un proceso manual.
El migrar de gestión imperativa utilizando comandos a la gestión declarativa de objetos requiere varios pasos manuales:
Exporte el objeto activo a un archivo local de configuración:
kubectl get <tipo>/<nombre> -o yaml > <tipo>_<nombre>.yaml
Elimine de manera manual el campo status
del archivo de configuración.
Este paso es opcional, ya que `kubectl apply` no actualiza el campo `status`
aunque este presente en el archivo de configuración.
Defina la anotación kubectl.kubernetes.io/last-applied-configuration
en el objeto:
kubectl replace --save-config -f <tipo>_<nombre>.yaml
Modifique el proceso para usar kubectl apply
para gestionar el objeto de manera exclusiva.
Defina la anotación kubectl.kubernetes.io/last-applied-configuration
en el objeto:
kubectl replace --save-config -f <tipo>_<nombre>.yaml
Modifique el proceso para usar kubectl apply
para gestionar el objeto de manera exclusiva.
La forma recomendada es definir una etiqueta única e inmutable para PodTemplate usada únicamente por el selector del controlador sin tener ningún otro significado semántico.
Ejemplo:
selector:matchLabels:controller-selector:"apps/v1/deployment/nginx"template:metadata:labels:controller-selector:"apps/v1/deployment/nginx"