From 8cd4e60cb2437e3bff1ddd22bd3fcb9bd4b7e4a6 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 19 Jul 2024 09:40:50 +0200 Subject: [PATCH 01/34] docs: Localize pod lifecycle to Spanish solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 748 ++++++++++++++++++ 1 file changed, 748 insertions(+) create mode 100644 content/es/docs/concepts/workloads/pods/pod-lifecycle.md diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md new file mode 100644 index 0000000000000..5a0e7dfb1709d --- /dev/null +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -0,0 +1,748 @@ +--- +title: Ciclo de vida de un Pod +content_type: concept +weight: 30 +--- + + +Esta página describe el ciclo de vida de un Pod. +Los Pods siguen un ciclo de vida definido, comenzando en la fase [`Pending`]( +#pod-phase), +y luego pasando a "en ejecución" `Running` si al menos uno de sus contenedores primarios se +inicia correctamente, +y luego pasando a "exitoso"(`Succeeded`) o "fallido" (`Failed`) si uno de los contenedores de un Pod +termina en error. + +Mientras un Pod está en `Running`, +el kubelet puede reiniciar sus contenedores para manejar algunos errores. +Dentro de un Pod, +Kubernetes rastrea diferentes [estados](#container-states) de contenedores y +decide qué acción tomar para que el Pod esté sano otra vez. + +En la API de Kubernetes, los Pods tienen una especificación y un estado actual. +El estado de un Pod consiste en un conjunto +de [condiciones de un Pod](#pod-conditions). +También puedes +inyectar [información de estado personalizada](#pod-readiness-gate) en los datos +de condiciones de un Pod, si es útil para tu aplicación. + +Los Pods se [programan](/docs/concepts/scheduling-eviction/) únicamente una vez +en su tiempo de vida. +Una vez que un Pod se programa (asigna) a un Nodo, el Pod se ejecuta en ese Nodo +hasta que se termine o se [elimina](#pod-termination). + + + +## Ciclo de vida de un Pod + +Igual que contenedores de aplicación individuales, +se considera que los Pods son entidades relativamente efímeras +(en lugar de durables). +Los Pods se crean y se les +asigna un identificador único +([UID](/docs/concepts/overview/working-with-objects/names/#uids)), +y se programan para ejecutarse en nodos donde se mantienen hasta que se terminan +(de acuerdo con las políticas de reinicio) o se eliminan. + +Si un {{< glossary_tooltip term_id="node" text="nodo" >}} muere, +los Pods programados para ejecutarse en ese Nodo +se [programan para eliminarse](#pod-garbage-collection) luego de un periodo de +tiempo. + +Los Pods, por sí mismos, no se curan automáticamente. +Si un Pod está programado para un {{< glossary_tooltip text="node" +term_id="node" >}} y luego falla, +el Pod se elimina; de la misma manera, +un Pod no sobrevivirá a un desalojo debido a falta de recursos o mantenimiento +del Nodo. +Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id=" +controller" +text="controlador" >}}, que maneja el trabajo de administrar las instancias de +Pod relativamente desechables. + +Un Pod dado (definido por un UID) nunca se reprograma a un Nodo diferente; en su +lugar, ese Pod se puede reemplazar por un Pod nuevo, casi idéntico, incluso con +el mismo nombre si se desea, pero con un UID diferente. + +{{< figure src="/images/docs/pod.svg" title="Diagrama de un Pod" class=" +diagram-medium" >}} + +Un Pod con múltiples contenedores que contiene un extractor de ficheros y un +servidor web que usa un volumen persistente para compartir datos entre los +contenedores. + +## Fase del Pod + +El campo `status` de un Pod es un objeto [PodStatus]( +/docs/reference/generated/kubernetes-api/{{< param "version" > +}}/#podstatus-v1-core) de Kubernetes que tiene un campo `phase`. + +La fase de un Pod es un resumen simple y de alto nivel de dónde se encuentra el +Pod en su ciclo de vida. La fase no pretende ser un resumen completo de +observaciones del estado del contenedor o Pod, ni tampoco pretende ser una +máquina de estado completa. + +El número y los significados de los valores de fase de un Pod están +estrechamente guardados. +Aparte de lo que se documenta aquí, no se debe asumir nada acerca de los Pods +que tienen un valor de `phase` determinado. + +Aquí están los posibles valores de `phase`: + +| Valor | Descripción | +|:------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `Pending` | El clúster de Kubernetes aceptó el pod, pero uno o más contenedores no se configuraron ni prepararon para ejecutarse. Esto incluye el tiempo que pasa un Pod esperando ser programado, así como el tiempo dedicado a descargar imágenes de contenedores a través de la red. | +| `Running` | El Pod se vinculó a un nodo y se crearon todos los contenedores. Al menos un contenedor todavía se está ejecutando o está en proceso de iniciarse o reiniciarse. | +| `Succeeded` | Todos los contenedores del Pod finalizaron con éxito y no se reiniciarán. | +| `Failed` | Todos los contenedores del Pod han finalizado y al menos un contenedor ha finalizado con error. Es decir, el contenedor salió con un estado distinto de cero o el sistema lo canceló. | +| `Unknown` | Por alguna razón no se pudo obtener el estado del Pod. Esta fase generalmente ocurre debido a un error en la comunicación con el nodo donde debería ejecutarse el Pod. | + +{{< note >}} +Cuando se está borrando un Pod, se muestra como `Terminating` por algunos +comandos de kubectl. +Este estado `Terminating` no es una de las fases del Pod. +A un Pod se le garantiza un tiempo para terminar con gracia, +cuyo valor por defecto es 30 segundos. +Puedes utilizar el flag `--force` +para [terminar un Pod por la fuerza](#pod-termination-forced). +{{< /note >}} + +A partir de la versión 1.27 de Kubernetes, el kubelet aplica una transición de +los Pods borrados, excepto +por [Pods estáticos](/docs/tasks/configure-pod-container/static-pod/) +y [Pods borrados por la fuerza](#pod-termination-forced) sin un finalizador, a +una fase terminal +(`Failed` o `Succeeded` dependiendo de los códigos de salida de los contenedores +del Pod) antes de su eliminación del servidor API. + +Si un Nodo muere o se desconecta del resto del clúster, +Kubernetes aplica una política para establecer la `phase` de todos los Pods +en `Failed`. + +## Estados del contenedor + +Así como la fase del Pod en general, Kubernetes rastrea el estado de cada +contenedor dentro de un Pod. +Puedes +usar [hooks del ciclo de vida de un contenedor](/docs/concepts/containers/container-lifecycle-hooks/) +para lanzar eventos en ciertos puntos en el ciclo de vida de un +contenedor. + +Una vez que el {{< glossary_tooltip text="programador" +term_id="kube-scheduler" >}} asigna un Pod a un Nodo, +el kubelet inicia creando los contenedores para ese Pod usando un {{< +glossary_tooltip text="espacio de ejecución del contenedor" +term_id="container-runtime" >}}. +Hay 3 estados posibles para un contenedor: `Waiting`, `Running`, y `Terminated`. + +Para revisar el estado de los contenedores de un Pod, +puedes usar `kubectl describe pod `. +La salida muestra el estado de cada contenedor dentro del Pod. + +Cada estado tiene un significado específico: + +### `Waiting` {#container-state-waiting} + +Si un contenedor no está en el estado `Running` o `Terminated`, está `Waiting`. +Un contenedor en el estado `Waiting` aún está ejecutando las operaciones que +requiere para completar su arranque: +por ejemplo, +descargar la imagen del contenedor de un registro de imágenes de un contenedor, +o aplicando datos {{< glossary_tooltip text="secretos" term_id="secret" >}}. + +### `Running` {#container-state-running} + +El estado `Running` indica que el contenedor se está ejecutando sin problemas. +Si hay un hook `postStart` configurado, ya se ha ejecutado y finalizado. +Cuando utilizas el comando `kubectl` para consultar un Pod con un contenedor que +está `Running`, +también puedes ver información sobre cuando el contenedor entró en +estado `Running`. + +### `Terminated` {#container-state-terminated} + +Un contenedor en el estado `Terminated` comenzó su ejecución y luego se terminó +con éxito o falló por alguna razón. +Cuando usas `kubectl` para consultar un Pod con un contenedor que +está `Terminated`, puedes ver un motivo, y un código de salida, y la hora de +inicio y de finalización del contenedor. + +Si un contenedor tiene un hook `preStop` configurado, el hook se ejecuta antes +de que el contenedor entre en estado `Terminated`. + +## Política de reinicio del contenedor {#restart-policy} + +La especificación (`spec` en inglés) de un Pod tiene un campo `restartPolicy` con los posibles +valores `Always`, `OnFailure`, y `Never`. +El valor por defecto es `Always`. + +La política de reinicio (`restartPolicy` en inglés) para un Pod aplica a {{< glossary_tooltip text="contenedores +de apps" term_id="app-container" >}} en el Pod +para [contenedores de inicialización](/docs/concepts/workloads/pods/init-containers/) regulares. +Los [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/) +ignoran el campo `restartPolicy`: en Kubernetes, un sidecar se define como una +entrada dentro de `initContainers` que tiene su `restartPolicy` a nivel del contenedor +establecido en `Always`. Para contenedores de inicio que finalizan con un error, el kubelet reinicia el +contenedor de inicio if el nivel del Pod `restartPolicy` es `OnFailure` +o `Always`. + +Cuando el kubelet está manejando el contenedor se reinicia de acuerdo con la política de reinicio configurada, que solo se aplica a los reinicios que realizan contenedores de +reemplazo dentro del +mismo Pod y ejecutándose en el mismo nodo. +Después de que los contenedores en un Pod terminan, el kubelet +los reinicia con un retraso de retroceso exponencial (10 s, 20 s, 40 s,...), que +está limitado a +cinco minutos. Una vez que un contenedor se ha ejecutado durante 10 minutos sin +ningún problema, el +kubelet restablece el temporizador de reinicio para ese contenedor. +[Ciclo de vida de contenedores Sidecar y el Pod](#sidecar-containers-and-pod-lifecycle) +explica el comportamiento de `init containers` cuando +especifica una `restartPolicy`. + +## Condiciones del Pod {#pod-conditions} + +Un Pod tiene un `PodStatus`, que tiene un listado de [PodConditions]( +/docs/reference/generated/kubernetes-api/{{< param "version" > +}}/#podcondition-v1-core) a través de los cuales el Pod ha pasado o no. +El kubelet administra las siguientes condiciones del Pod: + +* `PodScheduled`: El Pod está programado para un nodo. +* `PodReadyToStartContainers`: (característica beta; habilitada + por [defecto](#pod-has-network)) La zona de pruebas del Pod se creó + correctamente y se configuró la red. +* `ContainersReady`: todos los contenedores en el Pod están listos. +* `Initialized`: todos + los [contenedores de inicio](/docs/concepts/workloads/pods/init-containers/) + han terminado exitosamente. +* `Ready`: el Pod es capaz de recibir peticiones y debería ser agregado a los + grupos de equilibrio de carga de todos los Services que coincidan. + +| Nombre del campo | Descripción | +|:---------------------|:------------------------------------------------------------------------------------------------------| +| `type` | Nombre de esta condición del Pod. | +| `status` | Indica si la condición es aplicable, con valores posibles "`True`", "`False`", ó "`Unknown`". | +| `lastProbeTime` | Marca de tiempo de cuando se probó por última vez la condición del Pod. | +| `lastTransitionTime` | Marca de tiempo de cuando el Pod hizo transición de un estado a otro. | +| `reason` | Texto legible por máquina que indica el motivo de la última transición de la condición. | +| `message` | Mensaje legible por humanos indicando detalles acerca ade la última transición de estado. | + +### Preparación del Pod {#pod-readiness-gate} + +{{< feature-state for_k8s_version="v1.14" state="stable" >}} + +Tu aplicación puede inyectar retroalimentación adicional o señales +al `PodStatus`: +_Pod readiness_. +Para usar esto, establece `readinessGates` en la `spec` del Pod para especificar una +lista de condiciones adicionales que el kubelet evalúa para la preparación del +Pod. + +Las condiciones de preparación están determinadas por el estado actual de los +campos `status.conditions` de un Pod. +Si Kubernetes no puede encontrar una condición en el campo `status.conditions` +de un Pod, el estado de la condición se establece en "`False`". + +Aquí hay un ejemplo: + +```yaml +kind: Pod +... +spec: + readinessGates: + - conditionType: "www.example.com/feature-1" +status: + conditions: + - type: Ready # una PodCondition construida + status: "False" + lastProbeTime: null + lastTransitionTime: 2018-01-01T00:00:00Z + - type: "www.example.com/feature-1" # una PodCondition extra + status: "False" + lastProbeTime: null + lastTransitionTime: 2018-01-01T00:00:00Z + containerStatuses: + - containerID: docker://abcd... + ready: true +... +``` + +Las condiciones del Pod que incluyas deben tener nombres que sean válidos para +los [formatos de etiqueta](/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set) +de Kubernetes. + +### Estado de preparación del Pod {#pod-readiness-status} + +El comando `kubectl patch` no admite actualizar el estado del objeto. +Para establecer estas `status.conditions` para el Pod, las aplicaciones y +los {{< glossary_tooltip term_id="operator-pattern" text="operadores">}} +deberían utilizar la acción `Patch`. + +Puedes utilizar +una [librería cliente de Kubernetes](/docs/reference/using-api/client-libraries/) +para escribir código que establece condiciones personalizadas de un Pod para su +preparación. + +Para los Pods que utilizan condiciones personalizadas, ese Pod es evaluado para +estar listo **solamente** cuando ambas afirmaciones aplican: + +* Todos los contenedores del Pod están listos. +* Todas las condiciones personalizadas especificadas en `readinessGates` + están `True`. + +Cuando los contenedores de un Pod están listos, pero al menos una condición +personalizada está ausente o `False`, +el kubelet establece la [condición](#pod-conditions) del Pod +en `ContainersReady`. + +### Preparación de la red del Pod {#pod-has-network} + +{{< feature-state for_k8s_version="v1.29" state="beta" >}} + +{{< note >}} +Durante su desarrollo temprano, esta condición se llamaba `PodhasNetwork`. +{{< /note >}} + +Luego que un Pod es programado en un nodo, el kubelet debe admitirlo y tener los +volúmenes de almacenamiento necesarios montados. +Una vez que estas fases están completadas, el kubelet trabaja con un tiempo de ejecución del +contenedor para crear un espacio de ejecución (usando {{< glossary_tooltip +term_id="cri" >}})y configurar la red para el Pod. +Si +la [condición](/docs/reference/command-line-tools-reference/feature-gates/) `PodReadyToStartContainersCondition` +está habilitada (está habilitada por defecto para Kubernetes {{< skew +currentVersion >}}), la condición `PodReadyToStartContainers` se agrega al +campo `status.conditions` del Pod. + +La condición `PodReadyToStartContainers` se establece a `False` por el kubelet +cuando detecta que un Pod no tiene un entorno de pruebas en tiempo de ejecución +con red configurada. +Esto ocurre en los siguientes escenarios: + +- Temprano en el ciclo de vida del Pod, cuando el kubelet no ha comenzado a + configurar un entorno de pruebas para que el Pod que utiliza el contenedor en + tiempo de ejecución. +- Luego durante el ciclo de vida del Pod, cuando el entorno de pruebas del Pod + ha sido destruido debido a: + - El nodo ha reiniciado, sin desalojar el Pod. + - Para los tiempos de ejecución de contenedores que utilizan máquinas virtuales para el aislamiento, la máquina virtual de la zona de pruebas del Pod se reinicia, lo que luego requiere la creación de una nueva zona de pruebas y una nueva configuración de red de contenedores. + +La condición `PodReadyToStartContainers` se establece a `True` por el kubelet +luego de completar exitosamente la creación del espacio de pruebas y la +configuración de red para el Pod por el complemento de tiempo de ejecución. +El kubelet puede comenzar a descargar las imágenes del contenedor y crear +contenedores luego que la condición `PodReadyToStartContainers` se establece +a `True`. + +Para un Pod con contenedores de inicio, el kubelet establece la +condición `Initialized` a `True` luego que los contenedores de inicio se +completaron con éxito (esto ocurre luego de la creación exitosa del espacio de +pruebas y la configuración de red por el complemento de tiempo de ejecución). +Para un Pod sin contenedores de inicio, el kubelet establece la +condición `Initialized` a `False` antes que inicie la creación del espacio de +pruebas y la configuración de red. + +### Preparación de la programación del Pod {#pod-scheduling-readiness-gate} + +{{< feature-state for_k8s_version="v1.26" state="alpha" >}} + +Revisa [Preparación de la programación del Pod](/docs/concepts/scheduling-eviction/pod-scheduling-readiness/) +para más información. + +## Sondeos del contenedor + +Una _sonda_ es un diagnóstico realizado periódicamente por +el [kubelet](/docs/reference/command-line-tools-reference/kubelet/) en un +contenedor. +Para ejecutar este diagnóstico, el kubelet ejecuta código dentro del contenedor +o realiza una solicitud de red. + +### Mecanismos de revisión {#probe-check-methods} + +Existen cuatro maneras diferentes de revisar un contenedor usando una sonda. +Cada sonda debe definir exactamente una de estas cuatro maneras: + +`exec`: Ejecuta un comando especificado dentro del contenedor. +El diagnóstico se considera exitoso si el comando termina con un código de +estado 0. + +`grpc` +: Realiza una llamada de procedimiento remoto usando [gRPC](https://grpc.io/). +El destino debe +implementar [revisión de estado de gRPC](https://grpc.io/grpc/core/md_doc_health-checking.html). +El diagnóstico se considera exitoso si el `status` de la respuesta es `SERVING`. + +`httpGet` +: Realiza una petición HTTP `GET` contra la dirección IP en la ruta y puerto +especificado. +El diagnóstico se considera exitoso si la respuesta tiene un código de estado +mayor o igual que 200 y menor que 400. + +`tcpSocket` +: Realiza una revisión TCP contra la dirección IP del Pod en un puerto +específico. +El diagnóstico se considera exitoso si el puerto está abierto. +Si el sistema remoto (el contenedor) cierra la conexión inmediatamente después +de abrir la conexión, el diagnóstico se considera exitoso. + + +{{< caution >}} +A diferencia de otros mecanismos, la implementación de la sonda `exec` involucra +la creación/bifuración de múltiples procesos cada vez que se ejecuta. +Como resultado, en caso de clústers con mayor densidad de Pods, intérvalos más +bajos de `initialDelaySeconds`, `periodSeconds`, configurando un sondeo +con `exec` puede introducir una sobrecarga en el uso de la CPU del nodo. + +En tales escenarios, considere la utilización de los mecanismos alternativos de +sondeo para evitar la sobrecarga. +{{< /caution >}} + +### Resultados de sondeos + +Cada sondeo puede tener uno de tres resultados: + +`Success` +: El contenedor ha pasado el diagnóstico. + +`Failure` +: El contenedor ha fallado el diagnóstico. + +`Unknown` +: El diagnóstico ha fallado (no se debe tomar ninguna acción, y el kubelet hará +más revisiones adicionales). + +### Tipos de sondeo + +Opcionalmente, +el kubelet puede ejecutar y reaccionar a tres tipos de sondeos en contenedores +en ejecución: + +`livenessProbe` +: Indica si el contenedor se está ejecutando. +Si el sondeo falla, el kubelet mata el contenedor, +y el contenedor está sujeto a su [política de reinicio](#restart-policy). +Si un contenedor no tiene un sondeo de liveness, el estado por defecto +es `Success`. + +`readinessProbe` +: Indica si un contenedor está preparado para responder a peticiones. +Si el sondeo falla, +el controlador de endpoints elimina las direcciones IP del Pod de los endpoints +de todos los Services que coinciden con el Pod. +El estado por defecto de readiness antes del retraso inicial es `Failure`. +Si un contenedor no tiene un sondeo de readiness, el estado por defecto +es `Success`. + +`startupProbe` +: Indica si la aplicación dentro del contenedor ha iniciado. El resto de los +sondeos están deshabilitados si un sondeo de inicio se proporciona, hasta que se +complete. Si el sondeo falla, el kubelet mata el contenedor, y el contenedor +está sujeto a su [política de reinicio](#restart-policy). Si un contenedor no +tiene un sondeo de inicio, el estado por defecto es `Success`. + +Para mayor información sobre como configurar un sondeo liveness, +readiness o de startup, mire la +sección [Configurar una sonda Liveness, Readiness y Startup](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/). + +#### ¿Cuándo debería utilizar un sondeo liveness? + +Si el proceso en tu contenedor es capaz de terminar por sí mismo cuando +encuentra un error o deja de estar sano, no necesitas un sondeo liveness; el +kubelet automáticamente realizará la acción adecuada de acuerdo con la política +de reinicio `restartPolicy` del Pod. + +Si te gustaría que tu contenedor fuese destruido y reiniciado si falla un +sondeo, especifica un sondeo liveness, y especifica una `restartPolicy` +de `Always` o `OnFailure`. + +#### ¿Cuándo debería utilizar un sondeo readiness? + +Se te gustaría enviar tráfico al Pod solo cuando una sonda sea exitosa, +especifica un sondeo readiness. +En este caso, +el sondeo readiness podría ser el mismo que el liveness, +pero la existencia del sondeo readines en la especificación significa que el Pod +iniciará sin recibir ningún tráfico y solo iniciará cuando el sondeo readiness +sea exitoso. + +Si quieres que tu contenedor sea capaz de darse de baja por mantenimiento por sí +mismo, +puedes especificar un sondeo de readiness que revisa un endpoint específico de +readiness que es distinto del sondeo liveness. + +Si tu aplicación tiene una dependencia estricta con servicios de trasfondo, +puedes implementar ambos sondeos de liveness y readiness. +El sondeo de liveness pasa cuando la aplicación por sí misma está sana, pero el +sondeo de readiness revisa adicionalmente que cada servicio de trasfondo está +disponible. +Esto ayuda a evitar enviar a Pods que solo pueden responder con errores. + +Si tu contenedor necesita trabajar cargando grandes datos, ficheros de +configuración, o migraciones durante el inicio, puedes usar +un [sondeo de inicio](#when-should-you-use-a-startup-probe). +Sin embargo, si quieres detectar la diferencia entre una aplicación que ha +fallado y una aplicación que todavía está procesando datos de inicialización, +puedes usar un sondeo de readiness. + +{{< note >}} +Si quieres ser capaz de drenar peticiones cuando se elimina el Pod, +no necesitas un sondeo readiness; +cuando se elimina el Pod, +automáticamente se cambia al estado `unready` sin importar si existe el sondeo +readiness. +El Pod permanece en el estado `unready` mientras espera que los contenedores en +el Pod se paren. +{{< /note >}} + +#### ¿Cuándo debería utilizar un sondeo de inicialización? + +Los sondeos de inicialización son útiles para Pods que tienen contenedores que +se toman un largo tiempo para estar en servicio. +En lugar de especificar un intérvalo largo de liveness, puedes crear una +configuración separada para sondear el contenedor en el inicio, permitiendo un +tiempo mayor que el intervalo de liveness. + +Si tu contenedor usualmente inicia en más +de `initialDelaySeconds + failureThreshold × periodSeconds`, deberías +especificar un sondeo de inicialización que revise el mismo endpoint que la +sonda liveness. +El periodo por defecto `periodSeconds` es de 10 segundos. +Deberías especificar el campo `failureThreshold` lo suficientemente alto para +permitir al contenedor arrancar, sin cambiar los valores por defecto de la sonda +liveness. +Esto ayuda a proteger contra puntos muertos. + +## Finalización de Pods {#pod-termination} + +Ya que los Pods representan procesos ejecutándose en nodos de un clúster, es +importante permitir que esos procesos terminen con gracia cuando no se +necesitan (en lugar de detenerse abruptamente con una señal `Kill` y sin +oportunidad de limpiarse). + +El diseño está orientado a permitir que puedas solicitar la eliminación de un +Pod y saber cuándo finalizan los procesos, pero también para asegurar que la +eliminación se completa eventualmente. +Cuando solicitas la eliminación de un Pod, el clúster registra y rastrea el +periodo de gracia antes de que el Pod se elimine por la fuerza. +Con este rastreo de detención forzada en marcha, el {{< glossary_tooltip text=" +kubelet" term_id="kubelet" >}} intenta pararlo con gracia. + +Típicamente, con esta finalización con gracia del Pod, el kubelet hace +peticiones al tiempo de ejecución del contenedor para intentar detener los +contenedores en el Pod, primeramente enviando una señal `Term` (ej. SIGTERM), +con un período de tiempo de gracia, al proceso principal de cada contenedor. +Las peticiones para parar los contenedores se procesan de forma asíncrona en el +tiempo de ejecución del contenedor. +No hay garantía del orden de procesamiento de estas peticiones. +Muchos contenedores respetan el valor `STOPSIGNAL` definido en la imagen del +contenedor y, si es diferente, envían el valor de `STOPSIGNAL` en lugar de +SIGTERM. + +Una vez que el período de gracia ha acabado, +se envía la señal KILL a cualquier processo restante, y luego el Pod se elimina +del {{< glossary_tooltip text="Servidor API" term_id="kube-apiserver" >}}. +Si el kubelet o el tiempo de ejecución del contenedor del servicio que lo +administra se reinicia mientras espera que los procesos terminen, el kubelet +reintenta de nuevo el proceso incluyendo el periodo original de gracia. + +Un flujo de ejemplo: + +1. Utilizas la herramienta `kubectl` para eliminar manualmente un Pod + específico, con un periodo de gracia por defecto (30 segundos). + +1. El Pod en el servidor API se actualiza con el tiempo más allá del cual el Pod + se considera "muerto" + junto con el periodo de gracia. + Si utilizas `kubectl describe` para revisar el Pod que estás borrando, + ese Pod se mostrará como `Terminating`. + En el nodo donde se ejecuta el Pod: tan pronto como el kubelet observa que el + Pod se ha marcado como terminando (se ha definido una duración de parada con + gracia), el kubelet comienza el proceso local de parar el Pod. + +1. Si uno de los contenedores del Pod tiene definido + un [hook](/docs/concepts/containers/container-lifecycle-hooks) `preStop` y + el `terminationGracePeriodSeconds` en la especificación del Pod no está + definido en 0, el kubelet ejecuta ese hook dentro del contenedor. + El `terminationGracePeriodSeconds` por defecto es 30 segundos. + + Si el hook `preStop` todavía se está ejecutando luego de la expiración del + período de gracia, el kubelet solicita una extensión 2 segundos del periodo + de gracia. + + {{< note >}} + Si el hook `preStop` necesita más tiempo para completar que el tiempo + permitido por defecto, + debes modificar el `terminationGracePeriodSeconds` para adaptarlo. + {{< /note >}} + +1. El kubelet lanza el tiempo de ejecución del contenedor para enviar una + señal TERM al proceso 1 dentro de cada contenedor. + {{< note >}} + Los contenedores en el Pod reciben la señal TERM en tiempos diferentes y en + orden arbitrario. + Si el orden de finalización importa, considera utilizar un hook `preStop` + para sincronizarlos. + {{< /note >}} + +1. Al mismo tiempo que el kubelet inicia la finalización con gracia del Pod, el + panel de control evalúa si quitar este Pod en finalización de los + objetos `EndpointSlice` (y `Endpoints`), donde aquellos objetos representan + un {{< glossary_tooltip term_id="service" text=" Service" >}} con un {{< + glossary_tooltip text="selector" term_id="selector" >}} configurado. + + Los {{< glossary_tooltip text="ReplicaSets" term_id="replica-set" >}} y otros + recursos de carga de trabajo ya no consideran al Pod como réplica válida, en + servicio. + + Los Pods que finalizan lentamente no servirían tráfico regular y debería + iniciar la finalización de procesamiento de conexiones abiertas. + Algunas aplicaciones necesitan ir más allá de finalizar las conexiones + abiertas y necesitan finalización aún con más gracia, por ejemplo, drenar y + completar una sesión. + + Cualquier endpoint que representa los Pods en finalización no son removidos + inmediatamente de `EndpointSlices` y se expone un estatus indicando + el [estado de terminación](/docs/concepts/services-networking/endpoint-slices/#conditions) + de la API de EndpointSlice + (y la API de Endpoint legada). + Los endpoints que están terminando siempre tienen su estatus `ready` + como `false` (para compatibilidad con versiones anteriores a 1.26), por lo + que los balanceadores de carga no los usarán para tráfico regular. + + Si se necesita drenar el tráfico en un Pod que está terminando, + el readiness se puede revisar con la condición `serving`. + Puedes encontrar más detalles en cómo implementar drenado de conexiones en el + tutorial [Pods y flujo de terminación de Endpoints](/docs/tutorials/services/pods-and-endpoint-termination-flow/) + +{{}} +Si no tienes la `EndpointSliceTerminatingCondition` habilitada en tu clúster (la +característica está habilitada por defecto desde Kubernetes 1.22, y se bloquea en +1.26), entonces el plano de control de Kubernetes elimina un Pod de cualquier +EndpointSlices relevante tan pronto como inicia el período de gracia terminación +del Pod. +El comportamiento descrito arriba aplica para cuando la característica `EndpointSliceTerminatingCondition` está habilitada. +{{}} + +{{}} +A partir de Kubernetes 1.29, si tu Pod incluye uno o más contenedores sidecars +(contenedores de inicialización con política de reinicio `AlwaysRestart`), el +kubelet retrasará enviar la señal TERM a estos contenedores sidecar hasta que el +último contenedor principal del Pod haya finalizado. + +Los contenedores sidecar terminarán en el orden inverso del que están definidos +en la especificación del Pod. +Esto asegura que los contenedores sidecar continúen sirviendo a los demás +contenedores en el Pod mientras no se necesitan más. + +Ten en cuenta que la terminación lenta de un controlador principal también +retrasará la terminación de los contenedores sidecar. +Si el período de gracia expira antes que acabe el proceso de terminación, el Pod +entrará en terminación de emergencia. +En este caso, todos los contenedores restantes en el Pod se terminarán +simultáneamente con un período de gracia corto. + +Igualmente, si el Pod tiene un hook `PreStop` que excede el périodo de gracia de +finalización, puede ocurrir una terminación de emergencia. +En general, si has usado hooks de `preStop` para controlar el orden de +terminación sin contenedores sidecar, puedes quitarlos y permitir que el kubelet +los administre automáticamente. +{{}} + +1. Cuando expira el tiempo de gracia, + el kubelet lanza un apagado forzado. + El tiempo de ejecución del contenedor envía una señal `SIGKILL`a cualquier + proceso que se esté ejecutando en cualquier contenedor en el Pod. + El kubelet también limpia un contenedor `pause` escondido si ese tiempo de + ejecución del contenedor usa uno. +1. El kubelet hace una transición del Pod a fase terminal + (`Failed` o `Succeeded`, dependiendo del estado de sus contenedores). + Este paso está garantizado desde la versión 1.27. +1. El kubelet lanza la eliminación forzada del objeto Pod del servidor API, + estableciendo el período de gracia a 0 (detención inmediata). +1. El servidor API borra el objeto API del Pod, + que ya no es visible desde ningún cliente. + +### Terminación Forzada del Pod {#pod-termination-forced} + +{{< caution >}} +Eliminaciones forzadas pueden ser potencialmente disruptivas para algunas cargas +de trabajo y sus Pods. +{{< /caution >}} + +Por defecto, todas las eliminaciones tienen un tiempo de gracia de 30 segundos. +El comando `kubelet delete` soporta la opción `--grace-period=` que +permite sobreescribir el valor por defecto y especificar tu propio valor. + +Establecer el período de gracia a `0` elimina de forma forzada e inmediata el +Pod del servidor API. +Si el Pod aún se está ejecutando en un nodo, esa eliminación forzada hace que +el kubelet inicie una limpieza inmediata. + +{{< note >}} +Debes especificar una opción adicional `--force` junto con `--grace-period=0` +para realizar eliminaciones forzadas. +{{< /note >}} + +Cuando se realiza una eliminación forzada, +el servidor API no espera la confirmación del kubelet de que el Pod ha terminado +en el nodo en que se está ejecutando. +Este elimina el Pod en la API inmediatamente para que se pueda crear un Pod con +el mismo nombre. +En el nodo, los Pods que están por terminar inmediatamente aún pueden tener un +pequeño período de gracia antes de ser eliminados de forma forzada. + +{{< caution >}} +La eliminación inmediata no espera la confirmación de que el recurso en ejecución +ha terminado. +El recurso puede continuar ejecutándose en el clúster de forma indefinida. +{{< /caution >}} + +Si necesitas eliminar Pods por la fuerza y son parte de un `StatefulSet`, +mira la documentación +para [borrar Pods de un StatefulSet](/docs/tasks/run-application/force-delete-stateful-set-pod/). + +### Recolección de elementos no utilizados de los Pods {#pod-garbage-collection} + +Cuando los Pods fallan, +los objetos API permanecen en el clúster hasta que un humano o el proceso de {{< +glossary_tooltip term_id="controller" text="controlador" >}} los elimina +explícitamente. + +El recolector de elementos no utilizados (PodGC en inglés) es un controlador en +el plano de control que elimina los Pods que se han terminado (con una fase +de `Succeeded` o `Failed`), cuando el número de Pods excede el umbral +configurado (determinado por `terminated-pod-gc-threshold` en el controlador de +kube-controller-manager). +Esto evita la fuga de recursos mientras que los Pods se crean y se eliminan en +el tiempo. + +Adicionalmente, +el PodGC limpia cualquier Pod que satisfaga cualquiera de las siguiente +condiciones: + +1. Pods huérfanos - asociados a un Nodo que ya no existe, +1. Pods que están finalizando y no están programados, +1. Pods que están finalizando, + asociados a un nodo que no está listo, contaminado + con [`node.kubernetes.io/out-of-service`](/docs/reference/labels-annotations-taints/#node-kubernetes-io-out-of-service), + cuando la condición `NodeOutOfServiceVolumeDetach` está habilitada. + +Cuando la condición `PodDisruptionCondition` está habilitada, +además de limpiar los Pods, +el PodGC también los marcará como fallidos si están en una fase no terminal. +También, el PodGC agrega una condición de disrupción del Pod cuando realiza la limpieza de un Pod huérfano. +Mira [condiciones de disrupción del Pod](/docs/concepts/workloads/pods/disruptions#pod-disruption-conditions) para más detalles. + +## {{% heading "whatsnext" %}} + +* Obtén experiencia práctica + [agregar controladores a los eventos del ciclo de vida del contenedor](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). + +* Obtén experiencia práctica + [configurar sondas de Liveness, Readiness y Startup](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/). + +* Aprende más sobre [hooks del ciclo de vida del contenedor](/docs/concepts/containers/container-lifecycle-hooks/). + +* Aprende más sobre [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/). + +* Para información detallada sobre el estatus del contenedor del Pod en la API, + mira la documentación de referencia de la API que cubre el [`status`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#PodStatus) del Pod. \ No newline at end of file From 5540f0a77dfeb8ae71802144876a59010e7c0ee2 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 19 Jul 2024 10:18:44 +0200 Subject: [PATCH 02/34] chore: Localize pod lifecycle to Spanish solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 48 ++++++++----------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 5a0e7dfb1709d..8283fd34dc36f 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -50,22 +50,18 @@ se [programan para eliminarse](#pod-garbage-collection) luego de un periodo de tiempo. Los Pods, por sí mismos, no se curan automáticamente. -Si un Pod está programado para un {{< glossary_tooltip text="node" -term_id="node" >}} y luego falla, +Si un Pod está programado para un {{< glossary_tooltip text="nodo" term_id="node" >}} y luego falla, el Pod se elimina; de la misma manera, un Pod no sobrevivirá a un desalojo debido a falta de recursos o mantenimiento del Nodo. -Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id=" -controller" -text="controlador" >}}, que maneja el trabajo de administrar las instancias de +Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id=" controller" text="controlador" >}}, que maneja el trabajo de administrar las instancias de Pod relativamente desechables. Un Pod dado (definido por un UID) nunca se reprograma a un Nodo diferente; en su lugar, ese Pod se puede reemplazar por un Pod nuevo, casi idéntico, incluso con el mismo nombre si se desea, pero con un UID diferente. -{{< figure src="/images/docs/pod.svg" title="Diagrama de un Pod" class=" -diagram-medium" >}} +{{< figure src="/images/docs/pod.svg" title="Diagrama de un Pod" class=" diagram-medium" >}} Un Pod con múltiples contenedores que contiene un extractor de ficheros y un servidor web que usa un volumen persistente para compartir datos entre los @@ -74,8 +70,7 @@ contenedores. ## Fase del Pod El campo `status` de un Pod es un objeto [PodStatus]( -/docs/reference/generated/kubernetes-api/{{< param "version" > -}}/#podstatus-v1-core) de Kubernetes que tiene un campo `phase`. +/docs/reference/generated/kubernetes-api/{{< param "version" > }}/#podstatus-v1-core) de Kubernetes que tiene un campo `phase`. La fase de un Pod es un resumen simple y de alto nivel de dónde se encuentra el Pod en su ciclo de vida. La fase no pretende ser un resumen completo de @@ -128,11 +123,10 @@ usar [hooks del ciclo de vida de un contenedor](/docs/concepts/containers/contai para lanzar eventos en ciertos puntos en el ciclo de vida de un contenedor. -Una vez que el {{< glossary_tooltip text="programador" -term_id="kube-scheduler" >}} asigna un Pod a un Nodo, -el kubelet inicia creando los contenedores para ese Pod usando un {{< -glossary_tooltip text="espacio de ejecución del contenedor" -term_id="container-runtime" >}}. +Una vez que el {{< glossary_tooltip text="programador" term_id="kube-scheduler" >}} +asigna un Pod a un Nodo, +el kubelet inicia creando los contenedores para ese Pod usando un +{{< glossary_tooltip text="espacio de ejecución del contenedor" term_id="container-runtime" >}}. Hay 3 estados posibles para un contenedor: `Waiting`, `Running`, y `Terminated`. Para revisar el estado de los contenedores de un Pod, @@ -176,8 +170,8 @@ La especificación (`spec` en inglés) de un Pod tiene un campo `restartPolicy` valores `Always`, `OnFailure`, y `Never`. El valor por defecto es `Always`. -La política de reinicio (`restartPolicy` en inglés) para un Pod aplica a {{< glossary_tooltip text="contenedores -de apps" term_id="app-container" >}} en el Pod +La política de reinicio (`restartPolicy` en inglés) para un Pod aplica a +{{< glossary_tooltip text="contenedores de apps" term_id="app-container" >}} en el Pod para [contenedores de inicialización](/docs/concepts/workloads/pods/init-containers/) regulares. Los [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/) ignoran el campo `restartPolicy`: en Kubernetes, un sidecar se define como una @@ -202,8 +196,8 @@ especifica una `restartPolicy`. ## Condiciones del Pod {#pod-conditions} Un Pod tiene un `PodStatus`, que tiene un listado de [PodConditions]( -/docs/reference/generated/kubernetes-api/{{< param "version" > -}}/#podcondition-v1-core) a través de los cuales el Pod ha pasado o no. +/docs/reference/generated/kubernetes-api/{{< param "version" > }}/#podcondition-v1-core) +a través de los cuales el Pod ha pasado o no. El kubelet administra las siguientes condiciones del Pod: * `PodScheduled`: El Pod está programado para un nodo. @@ -305,12 +299,11 @@ Durante su desarrollo temprano, esta condición se llamaba `PodhasNetwork`. Luego que un Pod es programado en un nodo, el kubelet debe admitirlo y tener los volúmenes de almacenamiento necesarios montados. Una vez que estas fases están completadas, el kubelet trabaja con un tiempo de ejecución del -contenedor para crear un espacio de ejecución (usando {{< glossary_tooltip -term_id="cri" >}})y configurar la red para el Pod. +contenedor para crear un espacio de ejecución (usando {{< glossary_tooltip¯ term_id="cri" >}}) +y configurar la red para el Pod. Si la [condición](/docs/reference/command-line-tools-reference/feature-gates/) `PodReadyToStartContainersCondition` -está habilitada (está habilitada por defecto para Kubernetes {{< skew -currentVersion >}}), la condición `PodReadyToStartContainers` se agrega al +está habilitada (está habilitada por defecto para Kubernetes {{< skew currentVersion >}}), la condición `PodReadyToStartContainers` se agrega al campo `status.conditions` del Pod. La condición `PodReadyToStartContainers` se establece a `False` por el kubelet @@ -523,8 +516,8 @@ Pod y saber cuándo finalizan los procesos, pero también para asegurar que la eliminación se completa eventualmente. Cuando solicitas la eliminación de un Pod, el clúster registra y rastrea el periodo de gracia antes de que el Pod se elimine por la fuerza. -Con este rastreo de detención forzada en marcha, el {{< glossary_tooltip text=" -kubelet" term_id="kubelet" >}} intenta pararlo con gracia. +Con este rastreo de detención forzada en marcha, +el {{< glossary_tooltip text=" kubelet" term_id="kubelet" >}} intenta pararlo con gracia. Típicamente, con esta finalización con gracia del Pod, el kubelet hace peticiones al tiempo de ejecución del contenedor para intentar detener los @@ -586,8 +579,7 @@ Un flujo de ejemplo: 1. Al mismo tiempo que el kubelet inicia la finalización con gracia del Pod, el panel de control evalúa si quitar este Pod en finalización de los objetos `EndpointSlice` (y `Endpoints`), donde aquellos objetos representan - un {{< glossary_tooltip term_id="service" text=" Service" >}} con un {{< - glossary_tooltip text="selector" term_id="selector" >}} configurado. + un {{< glossary_tooltip term_id="service" text=" Service" >}} con un {{< glossary_tooltip text="selector" term_id="selector" >}} configurado. Los {{< glossary_tooltip text="ReplicaSets" term_id="replica-set" >}} y otros recursos de carga de trabajo ya no consideran al Pod como réplica válida, en @@ -703,8 +695,8 @@ para [borrar Pods de un StatefulSet](/docs/tasks/run-application/force-delete-st ### Recolección de elementos no utilizados de los Pods {#pod-garbage-collection} Cuando los Pods fallan, -los objetos API permanecen en el clúster hasta que un humano o el proceso de {{< -glossary_tooltip term_id="controller" text="controlador" >}} los elimina +los objetos API permanecen en el clúster hasta que un humano o el proceso de +{{< glossary_tooltip term_id="controller" text="controlador" >}} los elimina explícitamente. El recolector de elementos no utilizados (PodGC en inglés) es un controlador en From 251c93ed7f0557b5d27afbaca69a3b7853a6dd97 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 19 Jul 2024 15:27:17 +0200 Subject: [PATCH 03/34] fix: Localize pod lifecycle to Spanish Fix rendering solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 141 +++++++++++------- 1 file changed, 87 insertions(+), 54 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 8283fd34dc36f..8e7205865d4c1 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -10,7 +10,7 @@ Los Pods siguen un ciclo de vida definido, comenzando en la fase [`Pending`]( #pod-phase), y luego pasando a "en ejecución" `Running` si al menos uno de sus contenedores primarios se inicia correctamente, -y luego pasando a "exitoso"(`Succeeded`) o "fallido" (`Failed`) si uno de los contenedores de un Pod +y luego pasando a "exitoso" (`Succeeded`) o "fallido" (`Failed`) si uno de los contenedores de un Pod termina en error. Mientras un Pod está en `Running`, @@ -54,10 +54,7 @@ Si un Pod está programado para un {{< glossary_tooltip text="nodo" term_id="nod el Pod se elimina; de la misma manera, un Pod no sobrevivirá a un desalojo debido a falta de recursos o mantenimiento del Nodo. -Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id=" controller" text="controlador" >}}, que maneja el trabajo de administrar las instancias de -Pod relativamente desechables. - -Un Pod dado (definido por un UID) nunca se reprograma a un Nodo diferente; en su +Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id="controller" text="controlador" >}}, que maneja el trabajo de administrar las instancias de lugar, ese Pod se puede reemplazar por un Pod nuevo, casi idéntico, incluso con el mismo nombre si se desea, pero con un UID diferente. @@ -69,8 +66,9 @@ contenedores. ## Fase del Pod -El campo `status` de un Pod es un objeto [PodStatus]( -/docs/reference/generated/kubernetes-api/{{< param "version" > }}/#podstatus-v1-core) de Kubernetes que tiene un campo `phase`. +El campo `status` de un Pod es un objeto +[PodStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podstatus-v1-core) +de Kubernetes que tiene un campo `phase`. La fase de un Pod es un resumen simple y de alto nivel de dónde se encuentra el Pod en su ciclo de vida. La fase no pretende ser un resumen completo de @@ -123,9 +121,9 @@ usar [hooks del ciclo de vida de un contenedor](/docs/concepts/containers/contai para lanzar eventos en ciertos puntos en el ciclo de vida de un contenedor. -Una vez que el {{< glossary_tooltip text="programador" term_id="kube-scheduler" >}} +Una vez que el {{< glossary_tooltip text="programador" term_id="kube-scheduler" >}} asigna un Pod a un Nodo, -el kubelet inicia creando los contenedores para ese Pod usando un +el kubelet inicia creando los contenedores para ese Pod usando un {{< glossary_tooltip text="espacio de ejecución del contenedor" term_id="container-runtime" >}}. Hay 3 estados posibles para un contenedor: `Waiting`, `Running`, y `Terminated`. @@ -170,7 +168,7 @@ La especificación (`spec` en inglés) de un Pod tiene un campo `restartPolicy` valores `Always`, `OnFailure`, y `Never`. El valor por defecto es `Always`. -La política de reinicio (`restartPolicy` en inglés) para un Pod aplica a +La política de reinicio (`restartPolicy` en inglés) para un Pod aplica a {{< glossary_tooltip text="contenedores de apps" term_id="app-container" >}} en el Pod para [contenedores de inicialización](/docs/concepts/workloads/pods/init-containers/) regulares. Los [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/) @@ -193,10 +191,11 @@ kubelet restablece el temporizador de reinicio para ese contenedor. explica el comportamiento de `init containers` cuando especifica una `restartPolicy`. + ## Condiciones del Pod {#pod-conditions} -Un Pod tiene un `PodStatus`, que tiene un listado de [PodConditions]( -/docs/reference/generated/kubernetes-api/{{< param "version" > }}/#podcondition-v1-core) +Un Pod tiene un `PodStatus`, que tiene un listado de +[PodConditions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podcondition-v1-core) a través de los cuales el Pod ha pasado o no. El kubelet administra las siguientes condiciones del Pod: @@ -296,43 +295,79 @@ en `ContainersReady`. Durante su desarrollo temprano, esta condición se llamaba `PodhasNetwork`. {{< /note >}} -Luego que un Pod es programado en un nodo, el kubelet debe admitirlo y tener los -volúmenes de almacenamiento necesarios montados. -Una vez que estas fases están completadas, el kubelet trabaja con un tiempo de ejecución del -contenedor para crear un espacio de ejecución (usando {{< glossary_tooltip¯ term_id="cri" >}}) -y configurar la red para el Pod. -Si -la [condición](/docs/reference/command-line-tools-reference/feature-gates/) `PodReadyToStartContainersCondition` -está habilitada (está habilitada por defecto para Kubernetes {{< skew currentVersion >}}), la condición `PodReadyToStartContainers` se agrega al -campo `status.conditions` del Pod. - -La condición `PodReadyToStartContainers` se establece a `False` por el kubelet -cuando detecta que un Pod no tiene un entorno de pruebas en tiempo de ejecución -con red configurada. -Esto ocurre en los siguientes escenarios: - -- Temprano en el ciclo de vida del Pod, cuando el kubelet no ha comenzado a - configurar un entorno de pruebas para que el Pod que utiliza el contenedor en - tiempo de ejecución. -- Luego durante el ciclo de vida del Pod, cuando el entorno de pruebas del Pod - ha sido destruido debido a: - - El nodo ha reiniciado, sin desalojar el Pod. - - Para los tiempos de ejecución de contenedores que utilizan máquinas virtuales para el aislamiento, la máquina virtual de la zona de pruebas del Pod se reinicia, lo que luego requiere la creación de una nueva zona de pruebas y una nueva configuración de red de contenedores. - -La condición `PodReadyToStartContainers` se establece a `True` por el kubelet -luego de completar exitosamente la creación del espacio de pruebas y la -configuración de red para el Pod por el complemento de tiempo de ejecución. -El kubelet puede comenzar a descargar las imágenes del contenedor y crear -contenedores luego que la condición `PodReadyToStartContainers` se establece -a `True`. - -Para un Pod con contenedores de inicio, el kubelet establece la -condición `Initialized` a `True` luego que los contenedores de inicio se -completaron con éxito (esto ocurre luego de la creación exitosa del espacio de -pruebas y la configuración de red por el complemento de tiempo de ejecución). -Para un Pod sin contenedores de inicio, el kubelet establece la -condición `Initialized` a `False` antes que inicie la creación del espacio de -pruebas y la configuración de red. +{{< feature-state for_k8s_version="v1.14" state="stable" >}} + +Tu aplicación puede inyectar retroalimentación adicional o señales +al `PodStatus`: +_Pod readiness_. +Para usar esto, establece `readinessGates` en la `spec` del Pod para especificar una +lista de condiciones adicionales que el kubelet evalúa para la preparación del +Pod. + +Las condiciones de preparación están determinadas por el estado actual de los +campos `status.conditions` de un Pod. +Si Kubernetes no puede encontrar una condición en el campo `status.conditions` +de un Pod, el estado de la condición se establece en "`False`". + +Aquí hay un ejemplo: + +```yaml +kind: Pod +... +spec: + readinessGates: + - conditionType: "www.example.com/feature-1" +status: + conditions: + - type: Ready # una PodCondition construida + status: "False" + lastProbeTime: null + lastTransitionTime: 2018-01-01T00:00:00Z + - type: "www.example.com/feature-1" # una PodCondition extra + status: "False" + lastProbeTime: null + lastTransitionTime: 2018-01-01T00:00:00Z + containerStatuses: + - containerID: docker://abcd... + ready: true +... +``` + +Las condiciones del Pod que incluyas deben tener nombres que sean válidos para +los [formatos de etiqueta](/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set) +de Kubernetes. + +### Estado de preparación del Pod {#pod-readiness-status} + +El comando `kubectl patch` no admite actualizar el estado del objeto. +Para establecer estas `status.conditions` para el Pod, las aplicaciones y +los {{< glossary_tooltip term_id="operator-pattern" text="operadores">}} +deberían utilizar la acción `Patch`. + +Puedes utilizar +una [librería cliente de Kubernetes](/docs/reference/using-api/client-libraries/) +para escribir código que establece condiciones personalizadas de un Pod para su +preparación. + +Para los Pods que utilizan condiciones personalizadas, ese Pod es evaluado para +estar listo **solamente** cuando ambas afirmaciones aplican: + +* Todos los contenedores del Pod están listos. +* Todas las condiciones personalizadas especificadas en `readinessGates` + están `True`. + +Cuando los contenedores de un Pod están listos, pero al menos una condición +personalizada está ausente o `False`, +el kubelet establece la [condición](#pod-conditions) del Pod +en `ContainersReady`. + +### Preparación de la red del Pod {#pod-has-network} + +{{< feature-state for_k8s_version="v1.29" state="beta" >}} + +{{< note >}} +Durante su desarrollo temprano, esta condición se llamaba `PodhasNetwork`. +{{< /note >}} ### Preparación de la programación del Pod {#pod-scheduling-readiness-gate} @@ -377,7 +412,6 @@ El diagnóstico se considera exitoso si el puerto está abierto. Si el sistema remoto (el contenedor) cierra la conexión inmediatamente después de abrir la conexión, el diagnóstico se considera exitoso. - {{< caution >}} A diferencia de otros mecanismos, la implementación de la sonda `exec` involucra la creación/bifuración de múltiples procesos cada vez que se ejecuta. @@ -516,7 +550,7 @@ Pod y saber cuándo finalizan los procesos, pero también para asegurar que la eliminación se completa eventualmente. Cuando solicitas la eliminación de un Pod, el clúster registra y rastrea el periodo de gracia antes de que el Pod se elimine por la fuerza. -Con este rastreo de detención forzada en marcha, +Con este rastreo de detención forzada en marcha, el {{< glossary_tooltip text=" kubelet" term_id="kubelet" >}} intenta pararlo con gracia. Típicamente, con esta finalización con gracia del Pod, el kubelet hace @@ -691,11 +725,10 @@ El recurso puede continuar ejecutándose en el clúster de forma indefinida. Si necesitas eliminar Pods por la fuerza y son parte de un `StatefulSet`, mira la documentación para [borrar Pods de un StatefulSet](/docs/tasks/run-application/force-delete-stateful-set-pod/). - ### Recolección de elementos no utilizados de los Pods {#pod-garbage-collection} Cuando los Pods fallan, -los objetos API permanecen en el clúster hasta que un humano o el proceso de +los objetos API permanecen en el clúster hasta que un humano o el proceso de {{< glossary_tooltip term_id="controller" text="controlador" >}} los elimina explícitamente. @@ -726,7 +759,7 @@ Mira [condiciones de disrupción del Pod](/docs/concepts/workloads/pods/disrupti ## {{% heading "whatsnext" %}} -* Obtén experiencia práctica +* Obtén experiencia práctica [agregar controladores a los eventos del ciclo de vida del contenedor](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). * Obtén experiencia práctica From c0f001dd1884f512549bfcad01949fb3701e1665 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Mon, 29 Jul 2024 15:33:05 +0200 Subject: [PATCH 04/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md Co-authored-by: Dipesh Rawat --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 8e7205865d4c1..dcd08049d55a0 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -6,8 +6,7 @@ weight: 30 Esta página describe el ciclo de vida de un Pod. -Los Pods siguen un ciclo de vida definido, comenzando en la fase [`Pending`]( -#pod-phase), +Los Pods siguen un ciclo de vida definido, comenzando en la fase [`Pending`](#pod-phase), y luego pasando a "en ejecución" `Running` si al menos uno de sus contenedores primarios se inicia correctamente, y luego pasando a "exitoso" (`Succeeded`) o "fallido" (`Failed`) si uno de los contenedores de un Pod From 2a7b40332f6e5782a4a4047a366549b9b1893f52 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Mon, 29 Jul 2024 15:35:41 +0200 Subject: [PATCH 05/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index dcd08049d55a0..3dd90d0fa17fa 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -39,7 +39,7 @@ se considera que los Pods son entidades relativamente efímeras (en lugar de durables). Los Pods se crean y se les asigna un identificador único -([UID](/docs/concepts/overview/working-with-objects/names/#uids)), +([UID](/es/docs/concepts/overview/working-with-objects/names/#uids)), y se programan para ejecutarse en nodos donde se mantienen hasta que se terminan (de acuerdo con las políticas de reinicio) o se eliminan. From 67444e07b143e0e9854f9baeef211ebc2da8efe3 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Mon, 29 Jul 2024 15:36:10 +0200 Subject: [PATCH 06/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- .../docs/concepts/workloads/pods/pod-lifecycle.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 3dd90d0fa17fa..779a3be0f9dc5 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -53,9 +53,18 @@ Si un Pod está programado para un {{< glossary_tooltip text="nodo" term_id="nod el Pod se elimina; de la misma manera, un Pod no sobrevivirá a un desalojo debido a falta de recursos o mantenimiento del Nodo. -Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id="controller" text="controlador" >}}, que maneja el trabajo de administrar las instancias de -lugar, ese Pod se puede reemplazar por un Pod nuevo, casi idéntico, incluso con -el mismo nombre si se desea, pero con un UID diferente. +Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id="controller" text="controlador" >}}, que se encarga del trabajo de gestionar las instancias de Pod relativamente desechables. + +Un Pod determinado (según lo definido por un UID) nunca se "reprograma" a un nodo diferente; en cambio, +ese Pod puede ser reemplazado por un Pod nuevo, casi idéntico, incluso con el mismo nombre si +deseado, pero con un UID diferente. + +Cuando se dice que algo tiene la misma vida útil que un Pod, como un +{{< glosario_tooltip term_id="volume" text="volumen" >}}, +eso significa que la cosa existe mientras ese Pod específico (con ese UID exacto) +existe. Si ese Pod se elimina por cualquier motivo, e incluso si se requiere un reemplazo idéntico +se crea, el objeto relacionado (un volumen, en este ejemplo) también se destruye y +creado de nuevo. {{< figure src="/images/docs/pod.svg" title="Diagrama de un Pod" class=" diagram-medium" >}} From 899c0a8e975dd927c041eab936729bc70d5a9903 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Mon, 29 Jul 2024 16:08:25 +0200 Subject: [PATCH 07/34] fix: Localize pod lifecycle to Spanish pr reviews solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 2 +- package-lock.json | 913 ++++++++++++------ 2 files changed, 617 insertions(+), 298 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 779a3be0f9dc5..681e99456fa4c 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -120,7 +120,7 @@ Si un Nodo muere o se desconecta del resto del clúster, Kubernetes aplica una política para establecer la `phase` de todos los Pods en `Failed`. -## Estados del contenedor +## Estados del contenedor {#container-states} Así como la fase del Pod en general, Kubernetes rastrea el estado de cada contenedor dentro de un Pod. diff --git a/package-lock.json b/package-lock.json index ab0163bc23a7b..5392e8022a2db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,101 +1,132 @@ { + "name": "k8s-website", + "lockfileVersion": 3, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@babel/runtime-corejs3": { + "packages": { + "": { + "devDependencies": { + "autoprefixer": "^9.8.4", + "postcss-cli": "^7.1.1" + } + }, + "node_modules/@babel/runtime-corejs3": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz", "integrity": "sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==", "dev": true, - "requires": { + "dependencies": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" } }, - "@nodelib/fs.scandir": { + "node_modules/@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "node_modules/@nodelib/fs.walk": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@types/color-name": { + "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "anymatch": { + "node_modules/anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "argparse": { + "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { + "dependencies": { "sprintf-js": "~1.0.2" } }, - "array-union": { + "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "at-least-node": { + "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4.0.0" + } }, - "autoprefixer": { + "node_modules/autoprefixer": { "version": "9.8.4", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", "dev": true, - "requires": { + "dependencies": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001087", "colorette": "^1.2.0", @@ -103,577 +134,780 @@ "num2fraction": "^1.2.2", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { + "node_modules/browserslist": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", "dev": true, - "requires": { + "dependencies": { "caniuse-lite": "^1.0.30001088", "electron-to-chromium": "^1.3.483", "escalade": "^3.0.1", "node-releases": "^1.1.58" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" } }, - "caller-callsite": { + "node_modules/caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, - "requires": { + "dependencies": { "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "caller-path": { + "node_modules/caller-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, - "requires": { + "dependencies": { "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "callsites": { + "node_modules/callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "caniuse-lite": { + "node_modules/caniuse-lite": { "version": "1.0.30001093", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", "dev": true }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" } }, - "cliui": { + "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colorette": { + "node_modules/colorette": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==", "dev": true }, - "core-js-pure": { + "node_modules/core-js-pure": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", - "dev": true + "deprecated": "core-js-pure@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure.", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } }, - "cosmiconfig": { + "node_modules/cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "requires": { + "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "decamelize": { + "node_modules/decamelize": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", "dev": true, - "requires": { + "dependencies": { "xregexp": "^4.2.4" + }, + "engines": { + "node": ">=6" } }, - "dependency-graph": { + "node_modules/dependency-graph": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6.0" + } }, - "dir-glob": { + "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "electron-to-chromium": { + "node_modules/electron-to-chromium": { "version": "1.3.487", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.487.tgz", "integrity": "sha512-m4QS3IDShxauFfYFpnEzRCcUI55oKB9acEnHCuY/hSCZMz9Pz2KJj+UBnGHxRxS/mS1aphqOQ5wI6gc3yDZ7ew==", "dev": true }, - "emoji-regex": { + "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "escalade": { + "node_modules/escalade": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.0", "merge2": "^1.3.0", "micromatch": "^4.0.2", "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" } }, - "fastq": { + "node_modules/fastq": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-up": { + "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "fs-extra": { + "node_modules/fs-extra": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, - "requires": { + "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" } }, - "fsevents": { + "node_modules/fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-stdin": { + "node_modules/get-stdin": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "globby": { + "node_modules/globby": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.1.1", "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "has-flag": { + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "ignore": { + "node_modules/ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "import-cwd": { + "node_modules/import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dev": true, - "requires": { + "dependencies": { "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, - "import-fresh": { + "node_modules/import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, - "requires": { + "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "import-from": { + "node_modules/import-from": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-directory": { + "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "js-yaml": { + "node_modules/js-yaml": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, - "requires": { + "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "json-parse-better-errors": { + "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "jsonfile": { + "node_modules/jsonfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6", + "dependencies": { "universalify": "^1.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "locate-path": { + "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { + "dependencies": { "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "log-symbols": { + "node_modules/log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "requires": { + "dependencies": { "braces": "^3.0.1", "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" } }, - "node-releases": { + "node_modules/node-releases": { "version": "1.1.58", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", "dev": true }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "normalize-range": { + "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "num2fraction": { + "node_modules/num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, - "p-limit": { + "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "requires": { + "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "parse-json": { + "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "requires": { + "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "picomatch": { + "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pify": { + "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "postcss": { + "node_modules/postcss": { "version": "7.0.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" } }, - "postcss-cli": { + "node_modules/postcss-cli": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-7.1.1.tgz", "integrity": "sha512-bYQy5ydAQJKCMSpvaMg0ThPBeGYqhQXumjbFOmWnL4u65CYXQ16RfS6afGQpit0dGv/fNzxbdDtx8dkqOhhIbg==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "chokidar": "^3.3.0", "dependency-graph": "^0.9.0", @@ -687,280 +921,358 @@ "read-cache": "^1.0.0", "yargs": "^15.0.2" }, + "bin": { + "postcss": "bin/postcss" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-cli/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "postcss-load-config": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/postcss-cli/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/postcss-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/postcss-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/postcss-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-cli/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-load-config": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", "dev": true, - "requires": { + "dependencies": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" } }, - "postcss-reporter": { + "node_modules/postcss-reporter": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.4.1", "lodash": "^4.17.11", "log-symbols": "^2.2.0", "postcss": "^7.0.7" + }, + "engines": { + "node": ">=6" } }, - "postcss-value-parser": { + "node_modules/postcss-value-parser": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "pretty-hrtime": { + "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "read-cache": { + "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "dev": true, - "requires": { + "dependencies": { "pify": "^2.3.0" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "regenerator-runtime": { + "node_modules/regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve-from": { + "node_modules/resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string-width": { + "node_modules/string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-color": { + "node_modules/supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "universalify": { + "node_modules/universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true + "dev": true, + "engines": { + "node": ">= 10.0.0" + } }, - "which-module": { + "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "xregexp": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/xregexp": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", "dev": true, - "requires": { + "dependencies": { "@babel/runtime-corejs3": "^7.8.3" } }, - "y18n": { + "node_modules/y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "15.4.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.0.tgz", "integrity": "sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw==", "dev": true, - "requires": { + "dependencies": { "cliui": "^6.0.0", "decamelize": "^3.2.0", "find-up": "^4.1.0", @@ -972,24 +1284,31 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, - "dependencies": { - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - } + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" } } } From c2ee4383d3919b4bd6fdd7284901b3dcf12b2ed7 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Mon, 29 Jul 2024 16:17:13 +0200 Subject: [PATCH 08/34] docs: Localize pod lifecycle to Spanish solves #45708 --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 681e99456fa4c..1f7dd12eb2b81 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -60,7 +60,7 @@ ese Pod puede ser reemplazado por un Pod nuevo, casi idéntico, incluso con el m deseado, pero con un UID diferente. Cuando se dice que algo tiene la misma vida útil que un Pod, como un -{{< glosario_tooltip term_id="volume" text="volumen" >}}, +{{< glossary_tooltip term_id="volume" text="volumen" >}}, eso significa que la cosa existe mientras ese Pod específico (con ese UID exacto) existe. Si ese Pod se elimina por cualquier motivo, e incluso si se requiere un reemplazo idéntico se crea, el objeto relacionado (un volumen, en este ejemplo) también se destruye y From b5d1ee5b28e48f78082e01004b31a732e041e03e Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 30 Jul 2024 12:54:48 +0200 Subject: [PATCH 09/34] docs: Localize pod lifecycle to Spanish Update content with #46529 solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 1f7dd12eb2b81..a8ead28535b27 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -12,23 +12,13 @@ inicia correctamente, y luego pasando a "exitoso" (`Succeeded`) o "fallido" (`Failed`) si uno de los contenedores de un Pod termina en error. -Mientras un Pod está en `Running`, -el kubelet puede reiniciar sus contenedores para manejar algunos errores. -Dentro de un Pod, -Kubernetes rastrea diferentes [estados](#container-states) de contenedores y -decide qué acción tomar para que el Pod esté sano otra vez. - -En la API de Kubernetes, los Pods tienen una especificación y un estado actual. -El estado de un Pod consiste en un conjunto -de [condiciones de un Pod](#pod-conditions). -También puedes -inyectar [información de estado personalizada](#pod-readiness-gate) en los datos -de condiciones de un Pod, si es útil para tu aplicación. - -Los Pods se [programan](/docs/concepts/scheduling-eviction/) únicamente una vez -en su tiempo de vida. -Una vez que un Pod se programa (asigna) a un Nodo, el Pod se ejecuta en ese Nodo -hasta que se termine o se [elimina](#pod-termination). +Al igual que contenedores de aplicaciones, los Pods se consideran entidades relativamente efímeras. +Los Pods se crean y se les asigna un identificador único ([UID](/docs/concepts/overview/working-with-objects/names/#uids)), y se programan para ejecutarse en nodos donde se mantienen hasta que se terminan (de acuerdo con las políticas de reinicio) o se eliminan. + +Si un {{< glossary_tooltip text="nodo" term_id="node" >}} muere, +los Pods programados para ejecutarse en ese Nodo +se [programan para eliminarse](#pod-garbage-collection). +El plano de control marca los Pods para ser eliminados luego de un periodo de tiempo. From e03e2015b97e5ecc284b49ebe06d7f47449c5d30 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 30 Jul 2024 14:24:50 +0200 Subject: [PATCH 10/34] docs: Localize pod lifecycle to Spanish Update content with #46529 solves #45708 --- .../docs/concepts/workloads/pods/pod-lifecycle.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index a8ead28535b27..9effe5afc535e 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -24,6 +24,21 @@ El plano de control marca los Pods para ser eliminados luego de un periodo de ti ## Ciclo de vida de un Pod +Mientras un Pod se está ejecutando, el kubelet puede reiniciar contenedores para manejar algunos tipos de fallos. +Dentro de un Pod, Kubernetes rastrea distintos [estados](#container-states) del contenedor y determina qué acción realizar para que el Pod esté sano nuevamente. + +En la API de Kubernetes, los Pods tienen una especificación y un estatus actual. +El estatus de un objeto Pod consiste en un conjunto de [condiciones del Pod](#pod-conditions). +También puedes inyectar [información de readiness personalizada](#pod-readiness-gate) a los datos de condición de un Pod, si es útil para tu aplicación. + +Los Pods solo se [programan](/docs/concepts/scheduling-eviction/) una vez en su ciclo de vida; asignar un Pod a un nodo específico se llama _vincular_ (binding, en inglés), y el proceso de seleccionar cuál Pod usar se llama _programar_. +Una vez que un Pod está vinculado a un nodo, Kubernetes intenta ejecutar el Pod en ese nodo. +El Pod se ejecuta en ese nodo hasta que termina, o hasta que es [terminado](#pod-termination); if Kubernetes no es capaz de iniciar el Pod en el nodo seleccionado (por ejemplo, si el nodo falla antes que el Pod inicie), entonces ese Pod en particular nunca inicia. + +Puedes usar [readiness de programación del Pod](/docs/concepts/scheduling-eviction/pod-scheduling-readiness/) para retrasar la programación de un Pod hasta que todas sus _puertas de programación_ sean removidas. +Por ejemplo, podrías querer definir un conjunto de Pods, pero solo lanzar la programación una vez que todos los Pods hayan sido creados. + + Igual que contenedores de aplicación individuales, se considera que los Pods son entidades relativamente efímeras (en lugar de durables). From 7741eaea30be56fb0c32445cf5cac6279b35141b Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Wed, 7 Aug 2024 14:05:06 +0200 Subject: [PATCH 11/34] docs: Localize pod lifecycle to Spanish Update content with #46529 solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 212 ++++++++---------- 1 file changed, 99 insertions(+), 113 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 9effe5afc535e..bca40f3968de2 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -38,44 +38,43 @@ El Pod se ejecuta en ese nodo hasta que termina, o hasta que es [terminado](#pod Puedes usar [readiness de programación del Pod](/docs/concepts/scheduling-eviction/pod-scheduling-readiness/) para retrasar la programación de un Pod hasta que todas sus _puertas de programación_ sean removidas. Por ejemplo, podrías querer definir un conjunto de Pods, pero solo lanzar la programación una vez que todos los Pods hayan sido creados. +### Recuperación de fallos en los Pods {#pod-fault-recovery} -Igual que contenedores de aplicación individuales, -se considera que los Pods son entidades relativamente efímeras -(en lugar de durables). -Los Pods se crean y se les -asigna un identificador único -([UID](/es/docs/concepts/overview/working-with-objects/names/#uids)), -y se programan para ejecutarse en nodos donde se mantienen hasta que se terminan -(de acuerdo con las políticas de reinicio) o se eliminan. +Si falla uno de los contenedores en el Pod, Kubernetes puede intentar reiniciar ese contenedor en específico. +Para saber más, lea [cómo los Pods manejan los errores del contenedor](#container-restarts). -Si un {{< glossary_tooltip term_id="node" text="nodo" >}} muere, -los Pods programados para ejecutarse en ese Nodo -se [programan para eliminarse](#pod-garbage-collection) luego de un periodo de -tiempo. +Sin embargo, los Pods pueden fallar de una manera que el clúster no puede recuperar, y en ese caso +Kubernetes no intenta sanar el Pod más; en su lugar, Kubernetes elimina el +Pod y confía en otros componentes para proporcionar una curación automática. + +Si un Pod está programado para un {{< glossary_tooltip text="nodo" term_id="node" >}} y ese +nodo luego falla, el Pod se trata como no saludable y Kubernetes eventualmente elimina el Pod. +Un Pod no sobrevivirá a una {{< glossary_tooltip text="evicción" term_id="eviction" >}} debido +a la falta de recursos o al mantenimiento del Nodo. + +Kubernetes utiliza una abstracción de nivel superior, llamada +{{< glossary_tooltip term_id="controlador" text="controller" >}}, que maneja el trabajo de +gestionar las instancias de Pods relativamente desechables. -Los Pods, por sí mismos, no se curan automáticamente. -Si un Pod está programado para un {{< glossary_tooltip text="nodo" term_id="node" >}} y luego falla, -el Pod se elimina; de la misma manera, -un Pod no sobrevivirá a un desalojo debido a falta de recursos o mantenimiento -del Nodo. -Kubernetes utiliza una abstracción llamada {{< glossary_tooltip term_id="controller" text="controlador" >}}, que se encarga del trabajo de gestionar las instancias de Pod relativamente desechables. +Un Pod dado (como se define por un UID) nunca es "reprogramado" a un nodo diferente; en su lugar, +ese Pod puede ser reemplazado por un nuevo Pod casi idéntico. +Si hace un Pod de reemplazo, incluso puede +tener el mismo nombre (como en `.metadata.name`) que tenía el Pod antiguo, pero el reemplazo +tendría un `.metadata.uid` diferente del Pod antiguo. -Un Pod determinado (según lo definido por un UID) nunca se "reprograma" a un nodo diferente; en cambio, -ese Pod puede ser reemplazado por un Pod nuevo, casi idéntico, incluso con el mismo nombre si -deseado, pero con un UID diferente. +Kubernetes no garantiza que un reemplazo de un Pod existente sea programado +en el mismo nodo que el antiguo Pod que estaba siendo reemplazado. + +### Ciclo de vida asociados Cuando se dice que algo tiene la misma vida útil que un Pod, como un {{< glossary_tooltip term_id="volume" text="volumen" >}}, -eso significa que la cosa existe mientras ese Pod específico (con ese UID exacto) -existe. Si ese Pod se elimina por cualquier motivo, e incluso si se requiere un reemplazo idéntico -se crea, el objeto relacionado (un volumen, en este ejemplo) también se destruye y -creado de nuevo. - -{{< figure src="/images/docs/pod.svg" title="Diagrama de un Pod" class=" diagram-medium" >}} +eso significa que el objeto existe mientras ese Pod específico (con ese UID exacto) +exista. +Si ese Pod se elimina por cualquier razón, e incluso si se crea un reemplazo idéntico, +el objeto relacionado (un volumen, en este ejemplo) también se destruye y se crea nuevamente. -Un Pod con múltiples contenedores que contiene un extractor de ficheros y un -servidor web que usa un volumen persistente para compartir datos entre los -contenedores. +{{< figure src="/images/docs/pod.svg" title="Figura 1." class="diagram-medium" caption="Un Pod de varios contenedores que contiene un extractor de archivos sidecar y un servidor web. El Pod utiliza un volumen efímero emptyDir para almacenamiento compartido entre los contenedores." >}} ## Fase del Pod @@ -97,7 +96,7 @@ Aquí están los posibles valores de `phase`: | Valor | Descripción | |:------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `Pending` | El clúster de Kubernetes aceptó el pod, pero uno o más contenedores no se configuraron ni prepararon para ejecutarse. Esto incluye el tiempo que pasa un Pod esperando ser programado, así como el tiempo dedicado a descargar imágenes de contenedores a través de la red. | +| `Pending` | El clúster de Kubernetes aceptó el Pod, pero uno o más contenedores no se configuraron ni prepararon para ejecutarse. Esto incluye el tiempo que pasa un Pod esperando ser programado, así como el tiempo dedicado a descargar imágenes de contenedores a través de la red. | | `Running` | El Pod se vinculó a un nodo y se crearon todos los contenedores. Al menos un contenedor todavía se está ejecutando o está en proceso de iniciarse o reiniciarse. | | `Succeeded` | Todos los contenedores del Pod finalizaron con éxito y no se reiniciarán. | | `Failed` | Todos los contenedores del Pod han finalizado y al menos un contenedor ha finalizado con error. Es decir, el contenedor salió con un estado distinto de cero o el sistema lo canceló. | @@ -138,7 +137,7 @@ Una vez que el {{< glossary_tooltip text="programador" term_id="kube-scheduler" asigna un Pod a un Nodo, el kubelet inicia creando los contenedores para ese Pod usando un {{< glossary_tooltip text="espacio de ejecución del contenedor" term_id="container-runtime" >}}. -Hay 3 estados posibles para un contenedor: `Waiting`, `Running`, y `Terminated`. +Hay 3 estados posibles para un contenedor: `Waiting`(esperando), `Running`(en ejecución), y `Terminated`(terminado). Para revisar el estado de los contenedores de un Pod, puedes usar `kubectl describe pod `. @@ -175,6 +174,40 @@ inicio y de finalización del contenedor. Si un contenedor tiene un hook `preStop` configurado, el hook se ejecuta antes de que el contenedor entre en estado `Terminated`. +## Cómo los Pods manejan los problemas con los contenedores {#container-restarts} + +Kubernetes maneja los fallos de los contenedores dentro de los Pods usando una [política de reinicio, `restartPolicy` en inglés](#restart-policy) definida en la especificación `spec` del Pod. +Esta política determina cómo reacciona Kubernetes cuando los contenedores salen debido a errores u otras razones, lo que sigue la siguiente secuencia: + +1. **Fallo inicial**: Kubernetes intenta un reinicio inmediato basado en la `restartPolicy` del Pod. +1. **Fallos repetidos**: + Después del fallo inicial, Kubernetes aplica un retraso exponencial para los reinicios subsiguientes, descrito en [restartPolicy](#restart-policy). + Esto evita que los intentos de reinicio rápidos y repetidos sobrecarguen el sistema. +1. **Estado de CrashLoopBackOff**: + Esto indica que el mecanismo de retraso exponencial está actualmente en efecto para un contenedor dado que está en un bucle de fallos, fallando y reiniciando repetidamente. +1. **Reinicio del retraso**: + Si un contenedor funciona correctamente durante un cierto período (por ejemplo, 10 minutos), Kubernetes reinicia el retraso, tratando cualquier nuevo fallo como el primero. + +2. En la práctica, un `CrashLoopBackOff` es una condición o evento que podría verse como salida del comando `kubectl`, al describir o listar Pods, cuando un contenedor en el Pod no arranca correctamente y luego intenta y falla continuamente en un bucle. + +En otras palabras, cuando un contenedor entra en el bucle de fallos, Kubernetes aplica el retraso exponencial mencionado en la [Política de reinicio del contenedor](#restart-policy). +Este mecanismo evita que un contenedor defectuoso sobrecargue el sistema con intentos de inicio fallidos continuos. + +El `CrashLoopBackOff` puede ser causado por problemas como los siguientes: + +* Errores de la aplicación que hacen que el contenedor salga. +* Errores de configuración, como variables de entorno incorrectas o archivos de configuración faltantes. +* Restricciones de recursos, donde el contenedor puede no tener suficiente memoria o CPU para arrancar correctamente. +* Fallos en los chequeos de salud si la aplicación no comienza a servir dentro del tiempo esperado. +* Las sondas de liveness o de arranque del contenedor devuelven un resultado de `Failure` como se menciona en la [sección de sondas](#container-probes). +Para investigar la causa raíz de un problema de `CrashLoopBackOff`, un usuario puede: + +1. **Revisar los registros**: Use `kubectl logs ` para revisar los registros del contenedor. Esta es a menudo la forma más directa de diagnosticar el problema que causa los fallos. +1. **Inspeccionar eventos**: Use `kubectl describe pod ` para ver eventos para el Pod, lo que puede proporcionar pistas sobre problemas de configuración o recursos. +1. **Revisar la configuración**: Asegúrese de que la configuración del Pod, incluidas las variables de entorno y los volúmenes montados, sea correcta y que todos los recursos externos necesarios estén disponibles. +1. **Verificar los límites de recursos**: Asegúrese de que el contenedor tenga suficiente CPU y memoria asignada. A veces, aumentar los recursos en la definición del Pod puede resolver el problema. +1. **Depurar la aplicación**: Pueden existir errores o configuraciones incorrectas en el código de la aplicación. Ejecutar esta imagen de contenedor localmente o en un entorno de desarrollo puede ayudar a diagnosticar problemas específicos de la aplicación. + ## Política de reinicio del contenedor {#restart-policy} La especificación (`spec` en inglés) de un Pod tiene un campo `restartPolicy` con los posibles @@ -305,89 +338,42 @@ en `ContainersReady`. {{< feature-state for_k8s_version="v1.29" state="beta" >}} {{< note >}} -Durante su desarrollo temprano, esta condición se llamaba `PodhasNetwork`. -{{< /note >}} - -{{< feature-state for_k8s_version="v1.14" state="stable" >}} - -Tu aplicación puede inyectar retroalimentación adicional o señales -al `PodStatus`: -_Pod readiness_. -Para usar esto, establece `readinessGates` en la `spec` del Pod para especificar una -lista de condiciones adicionales que el kubelet evalúa para la preparación del -Pod. - -Las condiciones de preparación están determinadas por el estado actual de los -campos `status.conditions` de un Pod. -Si Kubernetes no puede encontrar una condición en el campo `status.conditions` -de un Pod, el estado de la condición se establece en "`False`". - -Aquí hay un ejemplo: - -```yaml -kind: Pod -... -spec: - readinessGates: - - conditionType: "www.example.com/feature-1" -status: - conditions: - - type: Ready # una PodCondition construida - status: "False" - lastProbeTime: null - lastTransitionTime: 2018-01-01T00:00:00Z - - type: "www.example.com/feature-1" # una PodCondition extra - status: "False" - lastProbeTime: null - lastTransitionTime: 2018-01-01T00:00:00Z - containerStatuses: - - containerID: docker://abcd... - ready: true -... -``` - -Las condiciones del Pod que incluyas deben tener nombres que sean válidos para -los [formatos de etiqueta](/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set) -de Kubernetes. - -### Estado de preparación del Pod {#pod-readiness-status} - -El comando `kubectl patch` no admite actualizar el estado del objeto. -Para establecer estas `status.conditions` para el Pod, las aplicaciones y -los {{< glossary_tooltip term_id="operator-pattern" text="operadores">}} -deberían utilizar la acción `Patch`. - -Puedes utilizar -una [librería cliente de Kubernetes](/docs/reference/using-api/client-libraries/) -para escribir código que establece condiciones personalizadas de un Pod para su -preparación. - -Para los Pods que utilizan condiciones personalizadas, ese Pod es evaluado para -estar listo **solamente** cuando ambas afirmaciones aplican: - -* Todos los contenedores del Pod están listos. -* Todas las condiciones personalizadas especificadas en `readinessGates` - están `True`. - -Cuando los contenedores de un Pod están listos, pero al menos una condición -personalizada está ausente o `False`, -el kubelet establece la [condición](#pod-conditions) del Pod -en `ContainersReady`. - -### Preparación de la red del Pod {#pod-has-network} - -{{< feature-state for_k8s_version="v1.29" state="beta" >}} - -{{< note >}} -Durante su desarrollo temprano, esta condición se llamaba `PodhasNetwork`. +Durante su desarrollo temprano, esta condición se llamó `PodHasNetwork`. {{< /note >}} -### Preparación de la programación del Pod {#pod-scheduling-readiness-gate} - -{{< feature-state for_k8s_version="v1.26" state="alpha" >}} - -Revisa [Preparación de la programación del Pod](/docs/concepts/scheduling-eviction/pod-scheduling-readiness/) -para más información. +Después de que un Pod es programado en un nodo, necesita ser admitido por el kubelet y +tener cualquier volumen de almacenamiento requerido montado. +Una vez que estas fases se completan, +el kubelet trabaja con +un runtime de contenedores (usando {{< glossary_tooltip term_id="cri" >}}) para configurar un +sandbox de runtime y configurar la red para el Pod. +Si la [puerta de características](/docs/reference/command-line-tools-reference/feature-gates/) +`PodReadyToStartContainersCondition` + está habilitada +(esta habilitada por defecto para Kubernetes {{< skew currentVersion >}}), la +condición `PodReadyToStartContainers` se agregará al campo `status.conditions` de un Pod. + +La condición `PodReadyToStartContainers` se establece en `False` por el kubelet cuando detecta que un +Pod no tiene un sandbox de runtime con red configurada. +Esto ocurre en los siguientes escenarios: + +- Al principio del ciclo de vida del Pod, cuando el kubelet aún no ha comenzado a configurar un sandbox para +el Pod usando el runtime de contenedores. +- Más adelante en el ciclo de vida del Pod, cuando el sandbox del Pod ha sido destruido debido a: + - el nodo reiniciándose, sin que el Pod sea desalojado + - para runtimes de contenedores que usan máquinas virtuales para aislamiento, la máquina virtual del sandbox del Pod reiniciándose, lo que luego requiere crear un nuevo sandbox y +una nueva configuración de red para el contenedor. + +La condición `PodReadyToStartContainers` se establece en True por el kubelet después de la +completación exitosa de la creación del sandbox y la configuración de la red para el Pod +por el plugin de runtime. El kubelet puede comenzar a extraer imágenes de contenedores y crear +contenedores después de que la condición PodReadyToStartContainers se haya establecido en True. + +Para un Pod con contenedores de inicialización, el kubelet establece la condición `Initialized` en +`True` después de que los contenedores de inicialización se hayan completado exitosamente (lo que ocurre +después de la creación exitosa del sandbox y la configuración de la red por el plugin de runtime). +Para un Pod sin contenedores de inicialización, el kubelet establece la condición `Initialized` +en `True` antes de que comience la creación del sandbox y la configuración de la red. ## Sondeos del contenedor From 7cdd65ed15e2efac77c535fdb137433e65233298 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 16 Aug 2024 11:40:59 +0200 Subject: [PATCH 12/34] docs: Localize pod lifecycle to Spanish Update content with #46529 solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 87 +++++++------------ 1 file changed, 31 insertions(+), 56 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index bca40f3968de2..df41d97438de2 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -413,7 +413,7 @@ de abrir la conexión, el diagnóstico se considera exitoso. {{< caution >}} A diferencia de otros mecanismos, la implementación de la sonda `exec` involucra -la creación/bifuración de múltiples procesos cada vez que se ejecuta. +la creación/bifurcación de múltiples procesos cada vez que se ejecuta. Como resultado, en caso de clústers con mayor densidad de Pods, intérvalos más bajos de `initialDelaySeconds`, `periodSeconds`, configurando un sondeo con `exec` puede introducir una sobrecarga en el uso de la CPU del nodo. @@ -561,16 +561,16 @@ tiempo de ejecución del contenedor. No hay garantía del orden de procesamiento de estas peticiones. Muchos contenedores respetan el valor `STOPSIGNAL` definido en la imagen del contenedor y, si es diferente, envían el valor de `STOPSIGNAL` en lugar de -SIGTERM. +TERM. Una vez que el período de gracia ha acabado, -se envía la señal KILL a cualquier processo restante, y luego el Pod se elimina +se envía la señal KILL a cualquier proceso restante, y luego el Pod se elimina del {{< glossary_tooltip text="Servidor API" term_id="kube-apiserver" >}}. Si el kubelet o el tiempo de ejecución del contenedor del servicio que lo administra se reinicia mientras espera que los procesos terminen, el kubelet reintenta de nuevo el proceso incluyendo el periodo original de gracia. -Un flujo de ejemplo: +Un flujo de finalización de un Pod, ilustrado con un ejemplo: 1. Utilizas la herramienta `kubectl` para eliminar manualmente un Pod específico, con un periodo de gracia por defecto (30 segundos). @@ -584,7 +584,7 @@ Un flujo de ejemplo: Pod se ha marcado como terminando (se ha definido una duración de parada con gracia), el kubelet comienza el proceso local de parar el Pod. -1. Si uno de los contenedores del Pod tiene definido + 1. Si uno de los contenedores del Pod tiene definido un [hook](/docs/concepts/containers/container-lifecycle-hooks) `preStop` y el `terminationGracePeriodSeconds` en la especificación del Pod no está definido en 0, el kubelet ejecuta ese hook dentro del contenedor. @@ -600,7 +600,7 @@ Un flujo de ejemplo: debes modificar el `terminationGracePeriodSeconds` para adaptarlo. {{< /note >}} -1. El kubelet lanza el tiempo de ejecución del contenedor para enviar una + 1. El kubelet lanza el tiempo de ejecución del contenedor para enviar una señal TERM al proceso 1 dentro de cada contenedor. {{< note >}} Los contenedores en el Pod reciben la señal TERM en tiempos diferentes y en @@ -638,53 +638,15 @@ Un flujo de ejemplo: Puedes encontrar más detalles en cómo implementar drenado de conexiones en el tutorial [Pods y flujo de terminación de Endpoints](/docs/tutorials/services/pods-and-endpoint-termination-flow/) -{{}} -Si no tienes la `EndpointSliceTerminatingCondition` habilitada en tu clúster (la -característica está habilitada por defecto desde Kubernetes 1.22, y se bloquea en -1.26), entonces el plano de control de Kubernetes elimina un Pod de cualquier -EndpointSlices relevante tan pronto como inicia el período de gracia terminación -del Pod. -El comportamiento descrito arriba aplica para cuando la característica `EndpointSliceTerminatingCondition` está habilitada. -{{}} - -{{}} -A partir de Kubernetes 1.29, si tu Pod incluye uno o más contenedores sidecars -(contenedores de inicialización con política de reinicio `AlwaysRestart`), el -kubelet retrasará enviar la señal TERM a estos contenedores sidecar hasta que el -último contenedor principal del Pod haya finalizado. - -Los contenedores sidecar terminarán en el orden inverso del que están definidos -en la especificación del Pod. -Esto asegura que los contenedores sidecar continúen sirviendo a los demás -contenedores en el Pod mientras no se necesitan más. - -Ten en cuenta que la terminación lenta de un controlador principal también -retrasará la terminación de los contenedores sidecar. -Si el período de gracia expira antes que acabe el proceso de terminación, el Pod -entrará en terminación de emergencia. -En este caso, todos los contenedores restantes en el Pod se terminarán -simultáneamente con un período de gracia corto. - -Igualmente, si el Pod tiene un hook `PreStop` que excede el périodo de gracia de -finalización, puede ocurrir una terminación de emergencia. -En general, si has usado hooks de `preStop` para controlar el orden de -terminación sin contenedores sidecar, puedes quitarlos y permitir que el kubelet -los administre automáticamente. -{{}} - -1. Cuando expira el tiempo de gracia, - el kubelet lanza un apagado forzado. - El tiempo de ejecución del contenedor envía una señal `SIGKILL`a cualquier - proceso que se esté ejecutando en cualquier contenedor en el Pod. - El kubelet también limpia un contenedor `pause` escondido si ese tiempo de - ejecución del contenedor usa uno. -1. El kubelet hace una transición del Pod a fase terminal - (`Failed` o `Succeeded`, dependiendo del estado de sus contenedores). - Este paso está garantizado desde la versión 1.27. -1. El kubelet lanza la eliminación forzada del objeto Pod del servidor API, - estableciendo el período de gracia a 0 (detención inmediata). -1. El servidor API borra el objeto API del Pod, - que ya no es visible desde ningún cliente. + + +1. El kubelet se asegura que el Pod se ha apagado y terminado + 1. Cuando finaliza el tiempo de gracia, si aún existe algún contenedor ejecutándose en el Pod, el kubelet lanza un apagado forzado. + El runtime del contenedor envía una señal `SIGKILL` a cualquier proceso ejecutándose en cualquier contenedor en el Pod. + El kubelet también limpia un contenedor `pause` oculto si ese contenedor usa uno. + 1. El kubelet hace la transición del Pod a una fase terminal (`Failed` ó `Succeeded` dependiendo del estado final de sus contenedores). + 1. El Kubelet lanza la eliminación forzosa de los objetos del Pod del servidor API, estableciendo el periodo de gracia a 0 (detención inmediata). + 1. El servidor API elimina el objeto API del Pod, que ya no es visible desde ningún cliente. ### Terminación Forzada del Pod {#pod-termination-forced} @@ -702,10 +664,8 @@ Pod del servidor API. Si el Pod aún se está ejecutando en un nodo, esa eliminación forzada hace que el kubelet inicie una limpieza inmediata. -{{< note >}} -Debes especificar una opción adicional `--force` junto con `--grace-period=0` +Usando kubectl, debes especificar una opción adicional `--force` junto con `--grace-period=0` para realizar eliminaciones forzadas. -{{< /note >}} Cuando se realiza una eliminación forzada, el servidor API no espera la confirmación del kubelet de que el Pod ha terminado @@ -724,6 +684,21 @@ El recurso puede continuar ejecutándose en el clúster de forma indefinida. Si necesitas eliminar Pods por la fuerza y son parte de un `StatefulSet`, mira la documentación para [borrar Pods de un StatefulSet](/docs/tasks/run-application/force-delete-stateful-set-pod/). + +### Terminación del Pod y contenedores sidecar {##termination-with-sidecars} + +Si tus Pods incluyen uno o más [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/)(contenedores de inicialización con una política de reinicio `Always`), el kubelet retrasará el envío de la señal TERM a estos contenedores sidecar hasta que el último contenedor principal se haya terminado completamente. +Los contenedores sidecar serán eliminadors en orden inverso al que se han definido en la especificación del Pod. +Esto asegura que los contenedores sidecar continúan sirviendo a los otros contenedores en el Pod hasta que ya no se necesiten. + +Esto significa que la terminación lenta de un contenedor principal también retrasará la terminación de los contenedores sidecar. + +Si el periodo de gracia expira antes que se complete el proceso de terminación, el Pod podría entrar en [terminación forzada](#pod-termination-beyond-grace-period). +En este caso, todos los contenedores restantes en el Pod serán terminados simultáneamente con un periodo de gracia corto. + +De forma similar, si el Pod tiene un hook `preStop` que excede el periodo de gracia de finalización, puede ocurrir una terminación de emergencia. +En general, si has usado hooks de `preStop` para controlar el orden de terminación sin contenedores sidecar, puedes quitarlos y permitir que el kubelet maneje la terminación de sidecars automáticamente. + ### Recolección de elementos no utilizados de los Pods {#pod-garbage-collection} Cuando los Pods fallan, From c934c15c20d5b0b1ba40b64081e08911f0fd5daa Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 16 Aug 2024 12:27:14 +0200 Subject: [PATCH 13/34] docs: Localize pod lifecycle to Spanish Update content with #46529 solves #45708 --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index df41d97438de2..c1ae1b00a826e 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -53,7 +53,7 @@ Un Pod no sobrevivirá a una {{< glossary_tooltip text="evicción" term_id="evic a la falta de recursos o al mantenimiento del Nodo. Kubernetes utiliza una abstracción de nivel superior, llamada -{{< glossary_tooltip term_id="controlador" text="controller" >}}, que maneja el trabajo de +{{< glossary_tooltip term_id="controller" text="controlador" >}}, que maneja el trabajo de gestionar las instancias de Pods relativamente desechables. Un Pod dado (como se define por un UID) nunca es "reprogramado" a un nodo diferente; en su lugar, From 8ba1d5a6831250471a8721b982826def3238ce7c Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 16 Aug 2024 13:20:41 +0200 Subject: [PATCH 14/34] docs: Localize pod lifecycle to Spanish fix pod phase link Update content with #46529 solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index c1ae1b00a826e..80dbeb7557686 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -33,7 +33,7 @@ También puedes inyectar [información de readiness personalizada](#pod-readines Los Pods solo se [programan](/docs/concepts/scheduling-eviction/) una vez en su ciclo de vida; asignar un Pod a un nodo específico se llama _vincular_ (binding, en inglés), y el proceso de seleccionar cuál Pod usar se llama _programar_. Una vez que un Pod está vinculado a un nodo, Kubernetes intenta ejecutar el Pod en ese nodo. -El Pod se ejecuta en ese nodo hasta que termina, o hasta que es [terminado](#pod-termination); if Kubernetes no es capaz de iniciar el Pod en el nodo seleccionado (por ejemplo, si el nodo falla antes que el Pod inicie), entonces ese Pod en particular nunca inicia. +El Pod se ejecuta en ese nodo hasta que termina, o hasta que es [terminado](#pod-termination); si Kubernetes no es capaz de iniciar el Pod en el nodo seleccionado (por ejemplo, si el nodo falla antes que el Pod inicie), entonces ese Pod en particular nunca inicia. Puedes usar [readiness de programación del Pod](/docs/concepts/scheduling-eviction/pod-scheduling-readiness/) para retrasar la programación de un Pod hasta que todas sus _puertas de programación_ sean removidas. Por ejemplo, podrías querer definir un conjunto de Pods, pero solo lanzar la programación una vez que todos los Pods hayan sido creados. @@ -44,12 +44,12 @@ Si falla uno de los contenedores en el Pod, Kubernetes puede intentar reiniciar Para saber más, lea [cómo los Pods manejan los errores del contenedor](#container-restarts). Sin embargo, los Pods pueden fallar de una manera que el clúster no puede recuperar, y en ese caso -Kubernetes no intenta sanar el Pod más; en su lugar, Kubernetes elimina el +Kubernetes no intenta más sanar el Pod; en su lugar, Kubernetes elimina el Pod y confía en otros componentes para proporcionar una curación automática. Si un Pod está programado para un {{< glossary_tooltip text="nodo" term_id="node" >}} y ese nodo luego falla, el Pod se trata como no saludable y Kubernetes eventualmente elimina el Pod. -Un Pod no sobrevivirá a una {{< glossary_tooltip text="evicción" term_id="eviction" >}} debido +Un Pod no sobrevivirá a una {{< glossary_tooltip text="evacuación" term_id="eviction" >}} debido a la falta de recursos o al mantenimiento del Nodo. Kubernetes utiliza una abstracción de nivel superior, llamada @@ -63,20 +63,20 @@ tener el mismo nombre (como en `.metadata.name`) que tenía el Pod antiguo, pero tendría un `.metadata.uid` diferente del Pod antiguo. Kubernetes no garantiza que un reemplazo de un Pod existente sea programado -en el mismo nodo que el antiguo Pod que estaba siendo reemplazado. +en el mismo nodo en el que el antiguo Pod estaba siendo reemplazado. ### Ciclo de vida asociados Cuando se dice que algo tiene la misma vida útil que un Pod, como un -{{< glossary_tooltip term_id="volume" text="volumen" >}}, +{{< glossary_tooltip term_id="volume" text="volúmen" >}}, eso significa que el objeto existe mientras ese Pod específico (con ese UID exacto) exista. Si ese Pod se elimina por cualquier razón, e incluso si se crea un reemplazo idéntico, el objeto relacionado (un volumen, en este ejemplo) también se destruye y se crea nuevamente. -{{< figure src="/images/docs/pod.svg" title="Figura 1." class="diagram-medium" caption="Un Pod de varios contenedores que contiene un extractor de archivos sidecar y un servidor web. El Pod utiliza un volumen efímero emptyDir para almacenamiento compartido entre los contenedores." >}} +{{< figure src="/images/docs/pod.svg" title="Figura 1." class="diagram-medium" caption="Un Pod de varios contenedores que contiene un extractor de archivos sidecar y un servidor web. El Pod utiliza un volumen efímero `emptyDir` para almacenamiento compartido entre los contenedores." >}} -## Fase del Pod +## Fase del Pod {##pod-phase } El campo `status` de un Pod es un objeto [PodStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podstatus-v1-core) @@ -136,7 +136,7 @@ contenedor. Una vez que el {{< glossary_tooltip text="programador" term_id="kube-scheduler" >}} asigna un Pod a un Nodo, el kubelet inicia creando los contenedores para ese Pod usando un -{{< glossary_tooltip text="espacio de ejecución del contenedor" term_id="container-runtime" >}}. +{{< glossary_tooltip text="runtime del contenedor" term_id="container-runtime" >}}. Hay 3 estados posibles para un contenedor: `Waiting`(esperando), `Running`(en ejecución), y `Terminated`(terminado). Para revisar el estado de los contenedores de un Pod, @@ -177,7 +177,7 @@ de que el contenedor entre en estado `Terminated`. ## Cómo los Pods manejan los problemas con los contenedores {#container-restarts} Kubernetes maneja los fallos de los contenedores dentro de los Pods usando una [política de reinicio, `restartPolicy` en inglés](#restart-policy) definida en la especificación `spec` del Pod. -Esta política determina cómo reacciona Kubernetes cuando los contenedores salen debido a errores u otras razones, lo que sigue la siguiente secuencia: +Esta política determina cómo reacciona Kubernetes cuando los contenedores salen debido a errores u otras razones, que sigue la siguiente secuencia: 1. **Fallo inicial**: Kubernetes intenta un reinicio inmediato basado en la `restartPolicy` del Pod. 1. **Fallos repetidos**: @@ -221,10 +221,10 @@ Los [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/) ignoran el campo `restartPolicy`: en Kubernetes, un sidecar se define como una entrada dentro de `initContainers` que tiene su `restartPolicy` a nivel del contenedor establecido en `Always`. Para contenedores de inicio que finalizan con un error, el kubelet reinicia el -contenedor de inicio if el nivel del Pod `restartPolicy` es `OnFailure` +contenedor de inicio si el nivel del Pod `restartPolicy` es `OnFailure` o `Always`. -Cuando el kubelet está manejando el contenedor se reinicia de acuerdo con la política de reinicio configurada, que solo se aplica a los reinicios que realizan contenedores de +Cuando el kubelet está manejando el contenedor, se reinicia de acuerdo con la política de reinicio configurada, que solo se aplica a los reinicios que realizan contenedores de reemplazo dentro del mismo Pod y ejecutándose en el mismo nodo. Después de que los contenedores en un Pod terminan, el kubelet From 91b14946411dd181d46894ccde3ab9b88aecaace Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 16 Aug 2024 13:29:25 +0200 Subject: [PATCH 15/34] docs: Localize pod lifecycle to Spanish fix pod phase link Update content with #46529 solves #45708 --- .../docs/concepts/workloads/pods/pod-lifecycle.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 80dbeb7557686..5ddf868c81b33 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -360,14 +360,14 @@ Esto ocurre en los siguientes escenarios: - Al principio del ciclo de vida del Pod, cuando el kubelet aún no ha comenzado a configurar un sandbox para el Pod usando el runtime de contenedores. - Más adelante en el ciclo de vida del Pod, cuando el sandbox del Pod ha sido destruido debido a: - - el nodo reiniciándose, sin que el Pod sea desalojado + - el nodo reiniciándose, sin que el Pod sea desalojado. - para runtimes de contenedores que usan máquinas virtuales para aislamiento, la máquina virtual del sandbox del Pod reiniciándose, lo que luego requiere crear un nuevo sandbox y una nueva configuración de red para el contenedor. -La condición `PodReadyToStartContainers` se establece en True por el kubelet después de la -completación exitosa de la creación del sandbox y la configuración de la red para el Pod +La condición `PodReadyToStartContainers` se establece en `True` por el kubelet después de la +finalización exitosa de la creación del sandbox y la configuración de la red para el Pod por el plugin de runtime. El kubelet puede comenzar a extraer imágenes de contenedores y crear -contenedores después de que la condición PodReadyToStartContainers se haya establecido en True. +contenedores después de que la condición `PodReadyToStartContainers` se haya establecido en True. Para un Pod con contenedores de inicialización, el kubelet establece la condición `Initialized` en `True` después de que los contenedores de inicialización se hayan completado exitosamente (lo que ocurre @@ -687,8 +687,8 @@ para [borrar Pods de un StatefulSet](/docs/tasks/run-application/force-delete-st ### Terminación del Pod y contenedores sidecar {##termination-with-sidecars} -Si tus Pods incluyen uno o más [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/)(contenedores de inicialización con una política de reinicio `Always`), el kubelet retrasará el envío de la señal TERM a estos contenedores sidecar hasta que el último contenedor principal se haya terminado completamente. -Los contenedores sidecar serán eliminadors en orden inverso al que se han definido en la especificación del Pod. +Si tus Pods incluyen uno o más [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/) (contenedores de inicialización con una política de reinicio `Always`), el kubelet retrasará el envío de la señal TERM a estos contenedores sidecar hasta que el último contenedor principal se haya terminado completamente. +Los contenedores sidecar serán eliminados en orden inverso al que se han definido en la especificación del Pod. Esto asegura que los contenedores sidecar continúan sirviendo a los otros contenedores en el Pod hasta que ya no se necesiten. Esto significa que la terminación lenta de un contenedor principal también retrasará la terminación de los contenedores sidecar. @@ -703,7 +703,7 @@ En general, si has usado hooks de `preStop` para controlar el orden de terminaci Cuando los Pods fallan, los objetos API permanecen en el clúster hasta que un humano o el proceso de -{{< glossary_tooltip term_id="controller" text="controlador" >}} los elimina +{{< glossary_tooltip term_id="controller" text="controlador" >}} los elimine explícitamente. El recolector de elementos no utilizados (PodGC en inglés) es un controlador en From c776b399e332d2a43b88dd618f4bcc2376b6ecc5 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 16 Aug 2024 13:38:51 +0200 Subject: [PATCH 16/34] docs: Localize pod lifecycle to Spanish fix pod phase link Update content with #46529 solves #45708 --- .../concepts/workloads/pods/pod-lifecycle.md | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 5ddf868c81b33..745805274230e 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -222,13 +222,17 @@ ignoran el campo `restartPolicy`: en Kubernetes, un sidecar se define como una entrada dentro de `initContainers` que tiene su `restartPolicy` a nivel del contenedor establecido en `Always`. Para contenedores de inicio que finalizan con un error, el kubelet reinicia el contenedor de inicio si el nivel del Pod `restartPolicy` es `OnFailure` -o `Always`. +o `Always`: + +* `Always`: Automáticamente reinicia el contenedor luego de alguna terminación. +* `OnFailure`: Solo reinicia el contenedor si finaliza con un error (estado de salida distinto de cero). +* `Never`: No reinicia el contenedor automáticamente. Cuando el kubelet está manejando el contenedor, se reinicia de acuerdo con la política de reinicio configurada, que solo se aplica a los reinicios que realizan contenedores de reemplazo dentro del mismo Pod y ejecutándose en el mismo nodo. Después de que los contenedores en un Pod terminan, el kubelet -los reinicia con un retraso de retroceso exponencial (10 s, 20 s, 40 s,...), que +los reinicia con un retraso de retroceso exponencial (10s, 20s, 40s,...), que está limitado a cinco minutos. Una vez que un contenedor se ha ejecutado durante 10 minutos sin ningún problema, el @@ -256,14 +260,14 @@ El kubelet administra las siguientes condiciones del Pod: * `Ready`: el Pod es capaz de recibir peticiones y debería ser agregado a los grupos de equilibrio de carga de todos los Services que coincidan. -| Nombre del campo | Descripción | -|:---------------------|:------------------------------------------------------------------------------------------------------| -| `type` | Nombre de esta condición del Pod. | -| `status` | Indica si la condición es aplicable, con valores posibles "`True`", "`False`", ó "`Unknown`". | -| `lastProbeTime` | Marca de tiempo de cuando se probó por última vez la condición del Pod. | -| `lastTransitionTime` | Marca de tiempo de cuando el Pod hizo transición de un estado a otro. | -| `reason` | Texto legible por máquina que indica el motivo de la última transición de la condición. | -| `message` | Mensaje legible por humanos indicando detalles acerca ade la última transición de estado. | +| Nombre del campo | Descripción | +|:---------------------|:-----------------------------------------------------------------------------------------------------| +| `type` | Nombre de esta condición del Pod. | +| `status` | Indica si la condición es aplicable, con valores posibles "`True`", "`False`", ó "`Unknown`". | +| `lastProbeTime` | Marca de tiempo de cuando se probó por última vez la condición del Pod. | +| `lastTransitionTime` | Marca de tiempo de cuando el Pod hizo transición de un estado a otro. | +| `reason` | Texto legible por máquina que indica el motivo de la última transición de la condición. | +| `message` | Mensaje legible por humanos indicando detalles acerca de la última transición de estado. | ### Preparación del Pod {#pod-readiness-gate} @@ -715,7 +719,7 @@ Esto evita la fuga de recursos mientras que los Pods se crean y se eliminan en el tiempo. Adicionalmente, -el PodGC limpia cualquier Pod que satisfaga cualquiera de las siguiente +el PodGC limpia cualquier Pod que satisfaga cualquiera de las siguientes condiciones: 1. Pods huérfanos - asociados a un Nodo que ya no existe, @@ -734,10 +738,10 @@ Mira [condiciones de disrupción del Pod](/docs/concepts/workloads/pods/disrupti ## {{% heading "whatsnext" %}} * Obtén experiencia práctica - [agregar controladores a los eventos del ciclo de vida del contenedor](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). + [agregando controladores a los eventos del ciclo de vida del contenedor](/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/). * Obtén experiencia práctica - [configurar sondas de Liveness, Readiness y Startup](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/). + [configurando sondas de Liveness, Readiness y Startup](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/). * Aprende más sobre [hooks del ciclo de vida del contenedor](/docs/concepts/containers/container-lifecycle-hooks/). From fc30ffc3625ecf6d26832161f37c0ec6c3c7e686 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 16 Aug 2024 13:43:42 +0200 Subject: [PATCH 17/34] Revert "fix: Localize pod lifecycle to Spanish" This reverts commit 899c0a8e975dd927c041eab936729bc70d5a9903. --- .../concepts/workloads/pods/pod-lifecycle.md | 2 +- package-lock.json | 913 ++++++------------ 2 files changed, 298 insertions(+), 617 deletions(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 745805274230e..2749a8a9cb85d 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -124,7 +124,7 @@ Si un Nodo muere o se desconecta del resto del clúster, Kubernetes aplica una política para establecer la `phase` de todos los Pods en `Failed`. -## Estados del contenedor {#container-states} +## Estados del contenedor Así como la fase del Pod en general, Kubernetes rastrea el estado de cada contenedor dentro de un Pod. diff --git a/package-lock.json b/package-lock.json index 5392e8022a2db..ab0163bc23a7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,132 +1,101 @@ { - "name": "k8s-website", - "lockfileVersion": 3, "requires": true, - "packages": { - "": { - "devDependencies": { - "autoprefixer": "^9.8.4", - "postcss-cli": "^7.1.1" - } - }, - "node_modules/@babel/runtime-corejs3": { + "lockfileVersion": 1, + "dependencies": { + "@babel/runtime-corejs3": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz", "integrity": "sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==", "dev": true, - "dependencies": { + "requires": { "core-js-pure": "^3.0.0", "regenerator-runtime": "^0.13.4" } }, - "node_modules/@nodelib/fs.scandir": { + "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", "dev": true, - "dependencies": { + "requires": { "@nodelib/fs.stat": "2.0.3", "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/@nodelib/fs.stat": { + "@nodelib/fs.stat": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true, - "engines": { - "node": ">= 8" - } + "dev": true }, - "node_modules/@nodelib/fs.walk": { + "@nodelib/fs.walk": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, - "dependencies": { + "requires": { "@nodelib/fs.scandir": "2.1.3", "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/@types/color-name": { + "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "node_modules/ansi-regex": { + "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/ansi-styles": { + "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "dependencies": { + "requires": { "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/anymatch": { + "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, - "dependencies": { + "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" } }, - "node_modules/argparse": { + "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "dependencies": { + "requires": { "sprintf-js": "~1.0.2" } }, - "node_modules/array-union": { + "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/at-least-node": { + "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } + "dev": true }, - "node_modules/autoprefixer": { + "autoprefixer": { "version": "9.8.4", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", "integrity": "sha512-84aYfXlpUe45lvmS+HoAWKCkirI/sw4JK0/bTeeqgHYco3dcsOn0NqdejISjptsYwNji/21dnkDri9PsYKk89A==", "dev": true, - "dependencies": { + "requires": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001087", "colorette": "^1.2.0", @@ -134,780 +103,577 @@ "num2fraction": "^1.2.2", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, - "node_modules/binary-extensions": { + "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/braces": { + "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "dependencies": { + "requires": { "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" } }, - "node_modules/browserslist": { + "browserslist": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", "dev": true, - "dependencies": { + "requires": { "caniuse-lite": "^1.0.30001088", "electron-to-chromium": "^1.3.483", "escalade": "^3.0.1", "node-releases": "^1.1.58" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" } }, - "node_modules/caller-callsite": { + "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, - "dependencies": { + "requires": { "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/caller-path": { + "caller-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, - "dependencies": { + "requires": { "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/callsites": { + "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/camelcase": { + "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/caniuse-lite": { + "caniuse-lite": { "version": "1.0.30001093", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001093.tgz", "integrity": "sha512-0+ODNoOjtWD5eS9aaIpf4K0gQqZfILNY4WSNuYzeT1sXni+lMrrVjc0odEobJt6wrODofDZUX8XYi/5y7+xl8g==", "dev": true }, - "node_modules/chalk": { + "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "dependencies": { + "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "node_modules/chokidar": { + "chokidar": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", "dev": true, - "dependencies": { + "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", + "fsevents": "~2.1.2", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.4.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" } }, - "node_modules/cliui": { + "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "dependencies": { + "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, - "node_modules/color-convert": { + "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "dependencies": { + "requires": { "color-name": "1.1.3" } }, - "node_modules/color-name": { + "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "node_modules/colorette": { + "colorette": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.0.tgz", "integrity": "sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw==", "dev": true }, - "node_modules/core-js-pure": { + "core-js-pure": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", - "deprecated": "core-js-pure@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure.", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } + "dev": true }, - "node_modules/cosmiconfig": { + "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "dependencies": { + "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/decamelize": { + "decamelize": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", "dev": true, - "dependencies": { + "requires": { "xregexp": "^4.2.4" - }, - "engines": { - "node": ">=6" } }, - "node_modules/dependency-graph": { + "dependency-graph": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz", "integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } + "dev": true }, - "node_modules/dir-glob": { + "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "dependencies": { + "requires": { "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/electron-to-chromium": { + "electron-to-chromium": { "version": "1.3.487", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.487.tgz", "integrity": "sha512-m4QS3IDShxauFfYFpnEzRCcUI55oKB9acEnHCuY/hSCZMz9Pz2KJj+UBnGHxRxS/mS1aphqOQ5wI6gc3yDZ7ew==", "dev": true }, - "node_modules/emoji-regex": { + "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/error-ex": { + "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "dependencies": { + "requires": { "is-arrayish": "^0.2.1" } }, - "node_modules/escalade": { + "escalade": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/escape-string-regexp": { + "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } + "dev": true }, - "node_modules/esprima": { + "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/fast-glob": { + "fast-glob": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", "dev": true, - "dependencies": { + "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.0", "merge2": "^1.3.0", "micromatch": "^4.0.2", "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" } }, - "node_modules/fastq": { + "fastq": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "dev": true, - "dependencies": { + "requires": { "reusify": "^1.0.4" } }, - "node_modules/fill-range": { + "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "dependencies": { + "requires": { "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" } }, - "node_modules/find-up": { + "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "dependencies": { + "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/fs-extra": { + "fs-extra": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, - "dependencies": { + "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^1.0.0" - }, - "engines": { - "node": ">=10" } }, - "node_modules/fsevents": { + "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "optional": true }, - "node_modules/get-caller-file": { + "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } + "dev": true }, - "node_modules/get-stdin": { + "get-stdin": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/glob-parent": { + "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, - "dependencies": { + "requires": { "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" } }, - "node_modules/globby": { + "globby": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "dev": true, - "dependencies": { + "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.1.1", "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { + "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "node_modules/has-flag": { + "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/ignore": { + "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } + "dev": true }, - "node_modules/import-cwd": { + "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dev": true, - "dependencies": { + "requires": { "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/import-fresh": { + "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, - "dependencies": { + "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/import-from": { + "import-from": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, - "dependencies": { + "requires": { "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/is-arrayish": { + "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "node_modules/is-binary-path": { + "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "dependencies": { + "requires": { "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/is-directory": { + "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/is-extglob": { + "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/is-fullwidth-code-point": { + "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/is-glob": { + "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, - "dependencies": { + "requires": { "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/is-number": { + "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } + "dev": true }, - "node_modules/js-yaml": { + "js-yaml": { "version": "3.14.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, - "dependencies": { + "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-parse-better-errors": { + "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "node_modules/jsonfile": { + "jsonfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, - "dependencies": { + "requires": { + "graceful-fs": "^4.1.6", "universalify": "^1.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" } }, - "node_modules/locate-path": { + "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "dependencies": { + "requires": { "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/lodash": { + "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "node_modules/log-symbols": { + "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, - "dependencies": { + "requires": { "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" } }, - "node_modules/merge2": { + "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } + "dev": true }, - "node_modules/micromatch": { + "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, - "dependencies": { + "requires": { "braces": "^3.0.1", "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" } }, - "node_modules/node-releases": { + "node-releases": { "version": "1.1.58", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", "dev": true }, - "node_modules/normalize-path": { + "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/normalize-range": { + "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/num2fraction": { + "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, - "node_modules/p-limit": { + "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "dependencies": { + "requires": { "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { + "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "dependencies": { + "requires": { "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/p-try": { + "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "dev": true }, - "node_modules/parse-json": { + "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "dependencies": { + "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" } }, - "node_modules/path-exists": { + "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/path-type": { + "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/picomatch": { + "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "dev": true }, - "node_modules/pify": { + "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/postcss": { + "postcss": { "version": "7.0.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, - "dependencies": { + "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" } }, - "node_modules/postcss-cli": { + "postcss-cli": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-7.1.1.tgz", "integrity": "sha512-bYQy5ydAQJKCMSpvaMg0ThPBeGYqhQXumjbFOmWnL4u65CYXQ16RfS6afGQpit0dGv/fNzxbdDtx8dkqOhhIbg==", "dev": true, - "dependencies": { + "requires": { "chalk": "^4.0.0", "chokidar": "^3.3.0", "dependency-graph": "^0.9.0", @@ -921,358 +687,280 @@ "read-cache": "^1.0.0", "yargs": "^15.0.2" }, - "bin": { - "postcss": "bin/postcss" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-cli/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/postcss-cli/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/postcss-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/postcss-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/postcss-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-cli/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss-load-config": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "postcss-load-config": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", "dev": true, - "dependencies": { + "requires": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" } }, - "node_modules/postcss-reporter": { + "postcss-reporter": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", "dev": true, - "dependencies": { + "requires": { "chalk": "^2.4.1", "lodash": "^4.17.11", "log-symbols": "^2.2.0", "postcss": "^7.0.7" - }, - "engines": { - "node": ">=6" } }, - "node_modules/postcss-value-parser": { + "postcss-value-parser": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "node_modules/pretty-hrtime": { + "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true, - "engines": { - "node": ">= 0.8" - } + "dev": true }, - "node_modules/read-cache": { + "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "dev": true, - "dependencies": { + "requires": { "pify": "^2.3.0" } }, - "node_modules/readdirp": { + "readdirp": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, - "dependencies": { + "requires": { "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" } }, - "node_modules/regenerator-runtime": { + "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, - "node_modules/require-directory": { + "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/require-main-filename": { + "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "node_modules/resolve-from": { + "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } + "dev": true }, - "node_modules/reusify": { + "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/run-parallel": { + "run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, - "node_modules/set-blocking": { + "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "node_modules/slash": { + "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } + "dev": true }, - "node_modules/source-map": { + "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true }, - "node_modules/sprintf-js": { + "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/string-width": { + "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, - "dependencies": { + "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/strip-ansi": { + "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, - "dependencies": { + "requires": { "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" } }, - "node_modules/supports-color": { + "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "dependencies": { + "requires": { "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" } }, - "node_modules/to-regex-range": { + "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "dependencies": { + "requires": { "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" } }, - "node_modules/universalify": { + "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } + "dev": true }, - "node_modules/which-module": { + "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/wrap-ansi": { + "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "dependencies": { + "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/xregexp": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "xregexp": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", "dev": true, - "dependencies": { + "requires": { "@babel/runtime-corejs3": "^7.8.3" } }, - "node_modules/y18n": { + "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "node_modules/yargs": { + "yargs": { "version": "15.4.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.0.tgz", "integrity": "sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw==", "dev": true, - "dependencies": { + "requires": { "cliui": "^6.0.0", "decamelize": "^3.2.0", "find-up": "^4.1.0", @@ -1284,31 +972,24 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" } }, - "node_modules/yargs-parser": { + "yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "dependencies": { + "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-parser/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + } } } } From 1094318c4bc29f7a2a68976ce0542408a45dbe36 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:29:33 +0200 Subject: [PATCH 18/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 2749a8a9cb85d..28b314562289b 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -76,7 +76,7 @@ el objeto relacionado (un volumen, en este ejemplo) también se destruye y se cr {{< figure src="/images/docs/pod.svg" title="Figura 1." class="diagram-medium" caption="Un Pod de varios contenedores que contiene un extractor de archivos sidecar y un servidor web. El Pod utiliza un volumen efímero `emptyDir` para almacenamiento compartido entre los contenedores." >}} -## Fase del Pod {##pod-phase } +## Fase del Pod {#pod-phase} El campo `status` de un Pod es un objeto [PodStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podstatus-v1-core) From db8b77c1a84be18b9aaf341de8dd4965f013696a Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:29:43 +0200 Subject: [PATCH 19/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 28b314562289b..ccfa9a4d7c19b 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -124,7 +124,7 @@ Si un Nodo muere o se desconecta del resto del clúster, Kubernetes aplica una política para establecer la `phase` de todos los Pods en `Failed`. -## Estados del contenedor +## Estados del contenedor {#container-states} Así como la fase del Pod en general, Kubernetes rastrea el estado de cada contenedor dentro de un Pod. From 289ded80d6ab150485e6dce0013e90b3d1088622 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:29:53 +0200 Subject: [PATCH 20/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index ccfa9a4d7c19b..cac58d7fa4403 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -129,7 +129,7 @@ en `Failed`. Así como la fase del Pod en general, Kubernetes rastrea el estado de cada contenedor dentro de un Pod. Puedes -usar [hooks del ciclo de vida de un contenedor](/docs/concepts/containers/container-lifecycle-hooks/) +usar [hooks del ciclo de vida de un contenedor](/es/docs/concepts/containers/container-lifecycle-hooks/) para lanzar eventos en ciertos puntos en el ciclo de vida de un contenedor. From 9adedd1eca564720daf70f11f60bf718a008d63e Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:30:01 +0200 Subject: [PATCH 21/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index cac58d7fa4403..252845cf27134 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -379,7 +379,7 @@ después de la creación exitosa del sandbox y la configuración de la red por e Para un Pod sin contenedores de inicialización, el kubelet establece la condición `Initialized` en `True` antes de que comience la creación del sandbox y la configuración de la red. -## Sondeos del contenedor +## Sondeos del contenedor {#container-probes} Una _sonda_ es un diagnóstico realizado periódicamente por el [kubelet](/docs/reference/command-line-tools-reference/kubelet/) en un From 3fddd0e1abfa45be98cad90768a08f22884ff3c1 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:30:21 +0200 Subject: [PATCH 22/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 252845cf27134..7f3ecde07a584 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -216,7 +216,7 @@ El valor por defecto es `Always`. La política de reinicio (`restartPolicy` en inglés) para un Pod aplica a {{< glossary_tooltip text="contenedores de apps" term_id="app-container" >}} en el Pod -para [contenedores de inicialización](/docs/concepts/workloads/pods/init-containers/) regulares. +para [contenedores de inicialización](/es/docs/concepts/workloads/pods/init-containers/) regulares. Los [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/) ignoran el campo `restartPolicy`: en Kubernetes, un sidecar se define como una entrada dentro de `initContainers` que tiene su `restartPolicy` a nivel del contenedor From afb11a825f44f1fe98bbe3e907edba570eb50356 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:30:29 +0200 Subject: [PATCH 23/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 7f3ecde07a584..96fa319d4d01c 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -237,7 +237,7 @@ está limitado a cinco minutos. Una vez que un contenedor se ha ejecutado durante 10 minutos sin ningún problema, el kubelet restablece el temporizador de reinicio para ese contenedor. -[Ciclo de vida de contenedores Sidecar y el Pod](#sidecar-containers-and-pod-lifecycle) +[Ciclo de vida de contenedores Sidecar y el Pod](/docs/concepts/workloads/pods/sidecar-containers/#sidecar-containers-and-pod-lifecycle) explica el comportamiento de `init containers` cuando especifica una `restartPolicy`. From 5ec451c73bc53b55fc85cff61c25c817a7e47c0f Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:30:36 +0200 Subject: [PATCH 24/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 96fa319d4d01c..9b7346eaa8fe8 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -255,7 +255,7 @@ El kubelet administra las siguientes condiciones del Pod: correctamente y se configuró la red. * `ContainersReady`: todos los contenedores en el Pod están listos. * `Initialized`: todos - los [contenedores de inicio](/docs/concepts/workloads/pods/init-containers/) + los [contenedores de inicio](/es/docs/concepts/workloads/pods/init-containers/) han terminado exitosamente. * `Ready`: el Pod es capaz de recibir peticiones y debería ser agregado a los grupos de equilibrio de carga de todos los Services que coincidan. From 1bac9eb21479ce08e903068a3e5fdce1021ce56a Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:30:43 +0200 Subject: [PATCH 25/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 9b7346eaa8fe8..2a5ae521a926e 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -310,7 +310,7 @@ status: ``` Las condiciones del Pod que incluyas deben tener nombres que sean válidos para -los [formatos de etiqueta](/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set) +los [formatos de etiqueta](/es/docs/concepts/overview/working-with-objects/labels/#sintaxis-y-conjunto-de-caracteres) de Kubernetes. ### Estado de preparación del Pod {#pod-readiness-status} From 404cacad8063f12bed2d12e254f981fdeeec42ab Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Fri, 23 Aug 2024 20:31:08 +0200 Subject: [PATCH 26/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 2a5ae521a926e..27a82715d124d 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -13,7 +13,7 @@ y luego pasando a "exitoso" (`Succeeded`) o "fallido" (`Failed`) si uno de los c termina en error. Al igual que contenedores de aplicaciones, los Pods se consideran entidades relativamente efímeras. -Los Pods se crean y se les asigna un identificador único ([UID](/docs/concepts/overview/working-with-objects/names/#uids)), y se programan para ejecutarse en nodos donde se mantienen hasta que se terminan (de acuerdo con las políticas de reinicio) o se eliminan. +Los Pods se crean y se les asigna un identificador único ([UID](/es/docs/concepts/overview/working-with-objects/names/#uids)), y se programan para ejecutarse en nodos donde se mantienen hasta que se terminan (de acuerdo con las políticas de reinicio) o se eliminan. Si un {{< glossary_tooltip text="nodo" term_id="node" >}} muere, los Pods programados para ejecutarse en ese Nodo From bd552c70a65219971432028639d7d3ed2770186c Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:25:26 +0200 Subject: [PATCH 27/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 27a82715d124d..c6c8f43fcde16 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -354,7 +354,7 @@ sandbox de runtime y configurar la red para el Pod. Si la [puerta de características](/docs/reference/command-line-tools-reference/feature-gates/) `PodReadyToStartContainersCondition` está habilitada -(esta habilitada por defecto para Kubernetes {{< skew currentVersion >}}), la +(está habilitada por defecto para Kubernetes {{< skew currentVersion >}}), la condición `PodReadyToStartContainers` se agregará al campo `status.conditions` de un Pod. La condición `PodReadyToStartContainers` se establece en `False` por el kubelet cuando detecta que un From fa128d5d50dd51ade9875f971a3776b6272605e1 Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:25:34 +0200 Subject: [PATCH 28/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index c6c8f43fcde16..b1d58c78ab777 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -470,7 +470,7 @@ está sujeto a su [política de reinicio](#restart-policy). Si un contenedor no tiene un sondeo de inicio, el estado por defecto es `Success`. Para mayor información sobre como configurar un sondeo liveness, -readiness o de startup, mire la +readiness o de startup, mira la sección [Configurar una sonda Liveness, Readiness y Startup](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/). #### ¿Cuándo debería utilizar un sondeo liveness? From 3b9bbfe5a72e751b659ffde8b19ef1f7a98bcd1d Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:26:01 +0200 Subject: [PATCH 29/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index b1d58c78ab777..4eb2f4415647a 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -465,7 +465,7 @@ es `Success`. `startupProbe` : Indica si la aplicación dentro del contenedor ha iniciado. El resto de los sondeos están deshabilitados si un sondeo de inicio se proporciona, hasta que se -complete. Si el sondeo falla, el kubelet mata el contenedor, y el contenedor +complete. Si el sondeo falla, el kubelet mata el contenedor y el contenedor está sujeto a su [política de reinicio](#restart-policy). Si un contenedor no tiene un sondeo de inicio, el estado por defecto es `Success`. From 8bab0fae94c7d0afd452a090f2f472c18cdb063d Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:26:15 +0200 Subject: [PATCH 30/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 4eb2f4415647a..872b38d685880 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -481,7 +481,7 @@ kubelet automáticamente realizará la acción adecuada de acuerdo con la polít de reinicio `restartPolicy` del Pod. Si te gustaría que tu contenedor fuese destruido y reiniciado si falla un -sondeo, especifica un sondeo liveness, y especifica una `restartPolicy` +sondeo, especifica un sondeo liveness y especifica una `restartPolicy` de `Always` o `OnFailure`. #### ¿Cuándo debería utilizar un sondeo readiness? From 93f68b7d4b101538fc8173daef3c6a5c9facf72c Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:26:40 +0200 Subject: [PATCH 31/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 872b38d685880..88664cd5b3d70 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -589,7 +589,7 @@ Un flujo de finalización de un Pod, ilustrado con un ejemplo: gracia), el kubelet comienza el proceso local de parar el Pod. 1. Si uno de los contenedores del Pod tiene definido - un [hook](/docs/concepts/containers/container-lifecycle-hooks) `preStop` y + un [hook](/es/docs/concepts/containers/container-lifecycle-hooks) `preStop` y el `terminationGracePeriodSeconds` en la especificación del Pod no está definido en 0, el kubelet ejecuta ese hook dentro del contenedor. El `terminationGracePeriodSeconds` por defecto es 30 segundos. From a764845ee78047074546da65ff8235438a928d9f Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:26:57 +0200 Subject: [PATCH 32/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 88664cd5b3d70..c36b76fbdc251 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -687,7 +687,7 @@ El recurso puede continuar ejecutándose en el clúster de forma indefinida. Si necesitas eliminar Pods por la fuerza y son parte de un `StatefulSet`, mira la documentación -para [borrar Pods de un StatefulSet](/docs/tasks/run-application/force-delete-stateful-set-pod/). +para [borrar Pods de un StatefulSet](/es/docs/tasks/run-application/force-delete-stateful-set-pod/). ### Terminación del Pod y contenedores sidecar {##termination-with-sidecars} From 54d07ed2ba7075d42b83416b71faacc80fed17cc Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:27:26 +0200 Subject: [PATCH 33/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index c36b76fbdc251..70cb7b517cd43 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -743,7 +743,7 @@ Mira [condiciones de disrupción del Pod](/docs/concepts/workloads/pods/disrupti * Obtén experiencia práctica [configurando sondas de Liveness, Readiness y Startup](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/). -* Aprende más sobre [hooks del ciclo de vida del contenedor](/docs/concepts/containers/container-lifecycle-hooks/). +* Aprende más sobre [hooks del ciclo de vida del contenedor](/es/docs/concepts/containers/container-lifecycle-hooks/). * Aprende más sobre [contenedores sidecar](/docs/concepts/workloads/pods/sidecar-containers/). From 1df7431f3a3f75d087c8e24f1163f8a2e0ecc6ae Mon Sep 17 00:00:00 2001 From: Anyul Rivas Date: Tue, 27 Aug 2024 06:28:05 +0200 Subject: [PATCH 34/34] Update content/es/docs/concepts/workloads/pods/pod-lifecycle.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Rodolfo Martínez Vega --- content/es/docs/concepts/workloads/pods/pod-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md index 70cb7b517cd43..64638b43862b5 100644 --- a/content/es/docs/concepts/workloads/pods/pod-lifecycle.md +++ b/content/es/docs/concepts/workloads/pods/pod-lifecycle.md @@ -630,7 +630,7 @@ Un flujo de finalización de un Pod, ilustrado con un ejemplo: Cualquier endpoint que representa los Pods en finalización no son removidos inmediatamente de `EndpointSlices` y se expone un estatus indicando - el [estado de terminación](/docs/concepts/services-networking/endpoint-slices/#conditions) + el [estado de terminación](/es/docs/concepts/services-networking/endpoint-slices/#condiciones) de la API de EndpointSlice (y la API de Endpoint legada). Los endpoints que están terminando siempre tienen su estatus `ready`