Nesta página, mostramos como solicitar tempos de execução estendidos para pods antes que eles sejam removidos pelo Google Kubernetes Engine (GKE).
Sobre a remoção de pods iniciados pelo GKE
As remoções de pods são parte normal da execução de cargas de trabalho no Kubernetes.
O GKE remove cargas de trabalho durante eventos programados, como upgrades automáticos de nós e escalonamentos automáticos, para garantir que os nós estejam atualizados e otimizados para uso eficiente de recursos. Por padrão, o GKE envia um sinal de encerramento para o contêiner assim que o evento ocorre. Após esse período, o contêiner tem um período de carência para ser encerrado antes que o Kubernetes remova o pod. Para upgrades automáticos de nós, o período de carência pode ser de até uma hora. Para eventos de redução da escala vertical, o período de carência pode ser de até
10 minutos.
O Kubernetes tem recursos integrados que os contêineres podem usar para lidar de modo típico
com remoções, como
PodDisruptionBudgets
e períodos de carência
normal.
No entanto, algumas cargas de trabalho, como filas de lotes ou servidores de jogos multiplayer,
precisam ser executadas por um período mais longo antes de serem removidas. O período de carência
padrão que o GKE concede durante os processos
iniciados pelo GKE pode não ser suficiente para essas cargas de trabalho. Nessas situações, você pode informar ao Autopilot para evitar a remoção de cargas de trabalho específicas por até sete dias.
Casos de uso
Veja a seguir algumas situações em que é recomendável dizer ao GKE para evitar o descarte de cargas de trabalho:
Você executa servidores de jogo multijogador que expulsam os jogadores de suas sessões se os servidores forem encerrados antecipadamente.
executar um software de áudio ou videoconferência que interrompa as reuniões em andamento se os servidores forem encerrados;
Você executa tarefas que precisam de tempo para serem concluídas, e o encerramento antecipado causaria a perda do trabalho em andamento.
Você executa um serviço com estado que é menos tolerante a interrupções e quer
minimizar a frequência das interrupções.
Preços
É possível solicitar tempos de execução estendidos para seus pods sem custo adicional.
No entanto, considere as seguintes mudanças comportamentais que podem afetar os preços:
Os clusters do Autopilot aplicam
valores mínimos mais altos
para as solicitações de recursos dos pods de duração estendida. Os clusters do Autopilot cobram pelas solicitações de recursos dos pods em execução. Você
não é cobrado pela sobrecarga do sistema ou pela capacidade do nó não utilizada.
O uso de pods de duração estendida pode aumentar o número de nós no cluster, o que pode afetar o uso e a escalonabilidade do endereço IP. Se você tiver DaemonSets que são executados em cada nó, isso resulta em mais DaemonSets no cluster,
Se você quiser usar a Google Cloud CLI para essa tarefa,
instale e, em seguida,
inicialize a
CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão
mais recente executando gcloud components update.
Verifique se você tem um
cluster do Autopilot
com a versão 1.27 ou mais recente.
Limitações
Não é possível solicitar tempos de execução estendidos para seus pods do Spot.
Os tempos de extração de imagem são contabilizados ao calcular o tempo de execução estendido.
É possível ter no máximo 50 cargas de trabalho de duração estendida (com solicitações de CPU diferentes) em cada cluster. Isso significa que até 50 conjuntos diferentes de valores de solicitação da CPU, após passar os valores mínimos, as proporções e as verificações de tamanho do incremento automático, podem ter duração estendida em cada cluster.
Não é possível usar a afinidade entre pods do Kubernetes em pods de duração estendida.
Sempre que possível, o GKE coloca cada pod de tempo de execução estendido no próprio nó. Esse comportamento garante que os nós possam ser reduzidos se estiverem
subutilizados.
Solicitar tempo de execução estendido
Para solicitar um ambiente de execução estendido para um pod, defina a anotação cluster-autoscaler.kubernetes.io/safe-to-evict do Kubernetes como false na especificação do pod.
Salve o seguinte manifesto como extended-deployment.yaml:
Os pods continuam em execução por pelo menos sete dias antes de ocorrer uma redução de escala ou um upgrade automático do nó.
Considerações e recomendações
Ao usar essa funcionalidade, considere o seguinte:
Os pods de duração estendida não são protegidos contra remoção com base em prioridade. Se você
usa Kubernetes PriorityClasses,
considere os seguintes métodos para minimizar a probabilidade de remoção com base na prioridade:
Verifique se os pods de duração estendida usam a classe de prioridade mais alta
para que outros pods de usuário não os removam.
Os pods do sistema são executados com a prioridade mais alta e sempre podem remover pods de duração estendida. Para minimizar a probabilidade disso, o GKE programa pods do sistema no nó antes de programar o pod de duração estendida.
Os pods de duração estendida ainda podem ser removidos antecipadamente nas seguintes
situações:
Remoção para liberar espaço para pods de usuários de prioridade mais alta (usando uma classe de prioridade mais alta)
Remoção para liberar espaço para componentes do sistema do Kubernetes
Eventos iniciados pelo usuário, como drenagem de um nó
É possível usar a anotação cluster-autoscaler.kubernetes.io/safe-to-evict em
clusters padrão, mas o resultado não é o mesmo. Os pods são executados indefinidamente, mesmo que ocorra um evento de redução da escala vertical. Isso evita a exclusão de nós subutilizados e faz com que você continue pagando por esses nós. Os pods também não estão protegidos contra remoções causadas por upgrades automáticos de nós.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Informações incorretas ou exemplo de código","incorrectInformationOrSampleCode","thumb-down"],["Não contém as informações/amostras de que eu preciso","missingTheInformationSamplesINeed","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2024-11-22 UTC."],[],[],null,["# Extend the run time of Autopilot Pods\n\n[Autopilot](/kubernetes-engine/docs/concepts/autopilot-overview)\n\n*** ** * ** ***\n\nThis page shows you how to request extended run times for Pods before they're\nevicted by Google Kubernetes Engine (GKE).\n\nAbout GKE-initiated Pod eviction\n--------------------------------\n\nPod evictions are a normal part of running workloads on Kubernetes.\nGKE evicts workloads during scheduled events, such as automatic\nnode upgrades and autoscaling scale-downs, to ensure that your nodes are\nup-to-date and optimized for efficient resource usage. By default,\nGKE sends a termination signal to the container as soon as the\nevent occurs, after which the container has a grace period to terminate before\nKubernetes evicts the Pod. For automatic node upgrades, the grace period\ncan be up to one hour. For scale-down events, the grace period can be up to\n10 minutes.\n\nKubernetes has built-in features that containers can use to gracefully handle\nevictions, such as\n[PodDisruptionBudgets](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)\nand [graceful termination\nperiods](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination/).\nHowever, some workloads, such as batch queues or multiplayer game servers, need\nto run for a longer period of time before being evicted. The default grace\nperiod that GKE grants during GKE-initiated\nevictions might not be enough for these workloads. In these situations, you can\ntell Autopilot to avoid evicting specific workloads for up to 7 days.\n\n### Use cases\n\nSome situations in which you might want to tell GKE to avoid\nevicting workloads include the following:\n\n- You run multiplayer game servers that would kick players out of their sessions if the servers terminated early.\n- You run audio or video conferencing software that would disrupt in-progress meetings if the servers terminated.\n- You run tasks that need time to complete, and early termination would cause a loss of in-progress work.\n- You run a stateful service that is less tolerant to disruption and you want to minimize how often disruptions occur.\n\nPricing\n-------\n\nYou can request extended run times for your Pods at no additional charge.\nHowever, consider the following behavioral changes that might impact your\npricing:\n\n- Autopilot clusters enforce [higher minimum values](/kubernetes-engine/docs/concepts/autopilot-resource-requests#workload-separation) for the resource requests of extended duration Pods. Autopilot clusters charge you for the resource requests of your running Pods. You're not charged for system overhead or for unused node capacity.\n- Using extended duration Pods might increase the number of nodes in your cluster, which might affect IP address usage and scalability. If you have DaemonSets that run on every node, this results in more DaemonSets in the cluster,\n\nFor pricing details, see\n[Autopilot pricing](/kubernetes-engine/pricing#autopilot_mode).\n\nBefore you begin\n----------------\n\nBefore you start, make sure that you have performed the following tasks:\n\n- Enable the Google Kubernetes Engine API.\n[Enable Google Kubernetes Engine API](https://console.cloud.google.com/flows/enableapi?apiid=container.googleapis.com)\n- If you want to use the Google Cloud CLI for this task, [install](/sdk/docs/install) and then [initialize](/sdk/docs/initializing) the gcloud CLI. If you previously installed the gcloud CLI, get the latest version by running `gcloud components update`. **Note:** For existing gcloud CLI installations, make sure to set the `compute/region` [property](/sdk/docs/properties#setting_properties). If you use primarily zonal clusters, set the `compute/zone` instead. By setting a default location, you can avoid errors in the gcloud CLI like the following: `One of [--zone, --region] must be supplied: Please specify location`. You might need to specify the location in certain commands if the location of your cluster differs from the default that you set.\n\n\u003c!-- --\u003e\n\n- Ensure that you have an [Autopilot cluster](/kubernetes-engine/docs/how-to/creating-an-autopilot-cluster) running version 1.27 or later.\n\n### Limitations\n\n- You can't request extended run times for your Spot Pods.\n- Image pull times are counted when calculating the extended run time.\n- You can have a maximum of 50 extended duration workloads (with different CPU requests) in each cluster. This means that up to 50 different sets of CPU request values, after passing Autopilot resource minimums, ratios, and increment size checks, can have extended duration in each cluster.\n- You can't use Kubernetes inter-Pod affinity in extended duration Pods.\n- Whenever possible, GKE places each extended run time Pod on its own node. This behavior ensures that nodes can scale down if they're under-utilized.\n- You can't request extended run times for Pods that target [custom compute classes](/kubernetes-engine/docs/concepts/about-custom-compute-classes).\n\nRequest extended run time\n-------------------------\n\nTo request extended run time for a Pod, set the Kubernetes\n`cluster-autoscaler.kubernetes.io/safe-to-evict` annotation to `false` in the\nPod specification.\n\n1. Save the following manifest as `extended-deployment.yaml`:\n\n apiVersion: apps/v1\n kind: Deployment\n metadata:\n name: extended-pods\n labels:\n duration: extended\n spec:\n selector:\n matchLabels:\n duration: extended\n template:\n metadata:\n annotations:\n cluster-autoscaler.kubernetes.io/safe-to-evict: \"false\"\n labels:\n duration: extended\n spec:\n containers:\n - name: example-container\n image: registry.k8s.io/pause\n resources:\n requests:\n cpu: 200m\n\n2. Create the Deployment:\n\n kubectl create -f extended-deployment.yaml\n\nThe Pods continue to run for at least 7 days before a scale-down or a node\nauto-upgrade can occur.\n\nConsiderations and recommendations\n----------------------------------\n\nWhen you use this functionality, consider the following:\n\n- Extended duration Pods aren't protected from priority-based eviction. If you use [Kubernetes PriorityClasses](/kubernetes-engine/docs/how-to/capacity-provisioning), consider the following methods to minimize the probability of priority-based eviction:\n - Ensure that your extended duration Pods use the highest priority PriorityClass, so that other user Pods don't evict your extended duration Pods.\n - Use [workload separation](/kubernetes-engine/docs/how-to/workload-separation) to run extended duration Pods separately from other Pods.\n- System Pods run with the highest priority and will always be able to evict extended duration Pods. To minimize the probability of this, GKE schedules system Pods on the node before scheduling the extended duration Pod.\n- Extended duration Pods can still be evicted early in the following situations:\n - Eviction to make space for higher-priority user Pods (using a higher PriorityClass)\n - Eviction to make space for Kubernetes system components\n - [kubelet out-of-memory eviction](https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/) if the Pod uses more memory than it requested (OOMKill)\n - Compute Engine VM maintenance events. [Accelerator-optimized machine types](/compute/docs/accelerator-optimized-machines) are more likely to be affected by these events because those machines don't support [live migration](/compute/docs/instances/live-migration-process).\n - Node auto-repairs\n - User-initiated events such as draining a node\n- You can use the `cluster-autoscaler.kubernetes.io/safe-to-evict` annotation in Standard clusters, but the result is not the same. Pods run indefinitely even if a scale-down event occurs, preventing deletion of underutilized nodes and resulting in you continuing to pay for those nodes. Pods also aren't protected from evictions caused by node auto-upgrades.\n\nWhat's next\n-----------\n\n- [Use PriorityClasses to provision spare capacity in Autopilot for\n rapid Pod scaling](/kubernetes-engine/docs/how-to/capacity-provisioning)"]]