Tengo el siguiente manifiesto que creó el pod en ejecución llamado 'prueba'
apiVersion: v1 kind: Pod metadata: name: hello-world labels: app: blue spec: containers: - name: funskies image: busybox command: ["/bin/sh", "-c", "echo 'Hello World'"]Quiero actualizar el pod para incluir el comando adicional
apiVersion: v1 kind: Pod metadata: name: hello-world labels: app: blue spec: containers: restartPolicy: Never - name: funskies image: busybox command: ["/bin/sh", "-c", "echo 'Hello World' > /home/my_user/logging.txt"]lo que probé
kubectl edit pod testque resulto
# Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # # pods "test" was not valid: # * spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`...Otras cosas que probé:
Se actualizó el manifiesto y luego se ejecutó aplicar - mismo problema
kubectl apply -f test.yamlPregunta: ¿Cuál es la forma correcta de actualizar un pod en ejecución?
No puede modificar la mayoría de las propiedades de un Pod. Por lo general, no desea crear pods directamente; use un controlador de nivel superior como una implementación.
La documentación de Kubernetes para notas de PodSpec (énfasis mío):
containers: Lista de contenedores pertenecientes al pod. Actualmente no se pueden agregar ni eliminar contenedores. Debe haber al menos un contenedor en un Pod. No se puede actualizar.
En todos los casos, pase lo que pase, un contenedor ejecuta un único comando y, si desea cambiar el comando, debe eliminar y volver a crear el contenedor. En Kubernetes, esto siempre significa eliminar y volver a crear el Pod que lo contiene. Por lo general, no debe usar Pods desnudos, pero si lo hace, puede crear un nuevo Pod con el nuevo comando y eliminar el antiguo. La eliminación de pods es extremadamente rutinaria y todo tipo de cosas comunes hacen que suceda (actualización de implementaciones, reducción de escala de HorizontalPodAutoscaler, ...).
Si tiene una implementación en lugar de un pod simple, puede cambiar libremente la template: para los pods que crea. Esto incluye cambiar su command: . Esto dará como resultado que la implementación cree un nuevo pod con el nuevo comando y, una vez que se esté ejecutando, elimine el antiguo pod.
Los tipos de contenedores de un solo comando de muy corta duración que muestra en la pregunta no son necesariamente adecuados para ejecutarse en Kubernetes. Si el pod no se va a seguir ejecutando y atendiendo solicitudes, un trabajo podría ser una mejor opción; pero un trabajo cree que solo se ejecutará una vez, y si cambia la especificación del módulo para un trabajo completo, no creo que inicie un nuevo módulo. Debería crear un nuevo trabajo para este caso.
No estoy seguro de cuál es el requisito completo.
pero puede ejecutar el pod y actualizar los detalles
$ kubectl exec <pod-name> -it -n <namespace> -- <command to execute> like, $ kubectl exec pod/hello-world-xxxx-xx -it -- /bin/bashsi tty admite shell, utilice "/bin/sh" para actualizar el contenido o el comando.
La edición del pod en ejecución no retendrá los cambios en el archivo de manifiesto. entonces, en ese caso, debe ejecutar un nuevo pod con los cambios.