Configurando a prioridade do pod
Com a prioridade e a preempção do pod, é possível configurar classes prioritárias para indicar a prioridade relativa dos pods que compõem a carga de trabalho do seu cluster Kubernetes. O planejador do Kubernetes leva em consideração a prioridade de um pod e pode até mesmo priorizar (remover) pods com prioridade mais baixa para deixar espaço em um nó do trabalhador para os pods de prioridade mais alta.
- Por que defino a prioridade do pod?
- Como um administrador de cluster, você deseja controlar quais pods são mais críticos para a carga de trabalho do cluster. As classes de prioridade podem ajudar a controlar as decisões do planejador do Kubernetes para favorecer os pods de prioridade mais alta sobre os pods de prioridade mais baixa. O planejador do Kubernetes pode até mesmo priorizar (remover) os pods de prioridade mais baixa que estão em execução para que os pods de prioridade mais alta pendentes possam ser planejados.
Configurando a prioridade do pod, é possível ajudar a evitar que cargas de trabalho de prioridade mais baixa impactem cargas de trabalho críticas em seu cluster, especialmente nos casos em que o cluster começa a atingir a sua capacidade de recurso.
Certifique-se de ter configurado o acesso adequado do usuário ao cluster e, se aplicável, as políticas de segurança do pod (PSPs). As políticas de acesso e as PSPs podem ajudar a evitar que usuários não confiáveis implementem pods de alta prioridade que impeçam o planejamento de outros pods.
Como funcionam o agendamento de prioridades e a preempção?
Em geral, os pods pendentes que têm uma prioridade mais alta são planejados antes dos pods priorizados mais baixos. Se você não tiver recursos suficientes restantes nos nós de trabalho, o agendador Kubernetes poderá antecipar (remover) pods para liberar recursos suficientes para que os pods com prioridade mais alta sejam agendados. A preempção é afetada também por períodos de finalização harmoniosa, orçamentos de interrupção do pod e afinidade do nó do trabalhador.
Se você não especificar uma prioridade para a implementação de pod, o padrão será definido para a classe de prioridade configurada como globalDefault
. Se você não tiver uma classe de prioridade globalDefault
, a prioridade
padrão para todos os pods será zero (0
). Por padrão, o IBM Cloud Kubernetes Service não configura um globalDefault
, portanto, a prioridade padrão do pod é zero.
Para entender como a prioridade do pod e o planejador do Kubernetes trabalham juntos, considere os cenários na figura a seguir. Deve-se colocar os pods priorizados nos nós do trabalhador com recursos disponíveis. Caso contrário, os pods de alta prioridade em seu cluster podem permanecer pendentes, ao mesmo tempo que os pods existentes são removidos, como no Cenário 3.
- Três pods com prioridade alta, média e baixa estão pendentes de planejamento. O planejador do Kubernetes localiza um nó do trabalhador disponível com espaço para todos os três pods e os planeja em ordem de prioridade, com o pod com prioridade mais alta planejado primeiro.
- Três pods com prioridade alta, média e baixa estão pendentes de planejamento. O planejador do Kubernetes localiza um nó do trabalhador disponível, mas o nó do trabalhador tem apenas recursos suficientes para suportar os pods de prioridade alta e média. O pod de baixa prioridade não está planejado e permanece em pendente.
- Dois pods com prioridade alta e média estão pendentes de planejamento. Existe um terceiro pod com baixa prioridade em um nó do trabalhador disponível. No entanto, o nó do trabalhador não tem recursos suficientes para planejar qualquer um dos pods pendentes. O planejador do Kubernetes prioriza, ou remove, o pod de baixa prioridade, que retorna o pod a um estado pendente. Em seguida, o planejador do Kubernetes tenta planejar o pod de alta prioridade. No entanto, o nó do trabalhador não tem recursos suficientes para planejar o pod de alta prioridade e, em vez disso, o planejador do Kubernetes planeja o pod de média prioridade.
Para obter mais informações, consulte a documentação do Kubernetes sobre prioridade e preempção de pod.
- Posso desativar o controlador de admissão de prioridade de pod?
- Nº Se não quiser usar prioridade de pod, não configure um
globalDefault
ou inclua uma classe de prioridade nas implementações de pod. Cada pod é padronizado para zero, exceto para os pods críticos do cluster que a IBM implementa com as classes de prioridade padrão. Como a prioridade do pod é relativa, essa configuração básica assegura que os pods críticos de cluster sejam priorizados para os recursos e planeja qualquer outro pod seguindo as políticas de planejamento existentes estabelecidas. - Como as cotas de recursos afetam a prioridade do pod?
- É possível usar prioridade de pod em combinação com cotas de recurso, incluindo escopos de cota. Com os escopos de cota, é possível configurar suas cotas de recurso para considerar a prioridade do pod. Os pods de prioridade mais alta podem consumir recursos do sistema que são limitados pela cota de recurso antes dos pods de prioridade mais baixa.
Entendendo classes de prioridade padrão
Seus clusters do IBM Cloud® Kubernetes Service vêm com algumas classes de prioridade por padrão.
Não modifique as classes padrão, que são usadas para gerenciar adequadamente seu cluster. É possível usar essas classes em suas implementações de app ou criar suas próprias classes de prioridade.
A tabela a seguir descreve as classes de prioridade que estão em seu cluster por padrão e por que elas são usadas.
Nome | Configurado por | Valor de Prioridade | Propósito |
---|---|---|---|
system-node-critical |
Kubernetes | 2000001000 | Os pods selecionados que são implantados em namespaces de sistema privilegiados quando você cria o cluster usam essa classe de prioridade para proteger a funcionalidade crítica dos nós de trabalho, como pods de rede, armazenamento, registro em log, monitoramento e métricas. |
system-cluster-critical |
Kubernetes | 2000000000 | Os pods selecionados que são implantados em namespaces de sistema privilegiados quando você cria o cluster usam essa classe de prioridade para proteger a funcionalidade crítica dos clusters, como pods de rede, armazenamento, registro em log, monitoramento e métricas. |
ibm-app-cluster-critical |
IBM | 900000000 | Os pods selecionados que são implantados em namespaces de sistema privilegiados quando você cria o cluster usam essa classe de prioridade para proteger a funcionalidade crítica dos aplicativos, como os pods do balanceador de carga. |
É possível verificar quais pods usam as classes de prioridade, executando o comando a seguir.
kubectl get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
Criando uma classe de prioridade
Para configurar a prioridade do pod, é necessário usar uma classe de prioridade.
Antes de Iniciar:
- Efetue login na sua conta. If applicable, target the appropriate resource group. Configure o contexto para o seu cluster.
- Certifique-se de ter a função de acesso de serviço de Gravador ou GerenciadorIBM Cloud do IAM para o espaço de nomes
default
.
-
Liste as classes de prioridade existentes. Você pode usar uma classe de prioridade existente como modelo para a nova classe.
kubectl get priorityclasses
-
Escolha a classe de prioridade que você deseja copiar e crie um arquivo YAML local.
kubectl get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml
-
Faça seu arquivo YAML de classe de prioridade.
apiVersion: scheduling.k8s.io/v1alpha1 kind: PriorityClass metadata: name: <priority_class_name> value: <1000000> globalDefault: <false> description: "Use this class for XYZ service pods only."
Entendendo os componentes de arquivo YAML Componentes Descrição name
Necessário: o nome da classe de prioridade que você deseja criar. value
Necessário: insira um número inteiro menor ou igual a 1 bilhão (1000000000). Quanto maior o valor, maior a prioridade. Os valores são relativos aos valores de outras classes de prioridade no cluster. Reserve números muito altos para pods críticos do sistema que você não quer que sejam priorizados (removidos). Por exemplo, o intervalo de classes de prioridade padrão crítica do cluster no valor de 900000000-2000001000, portanto, insira um valor menor que esses números para novas classes de prioridade para que nada seja priorizado mais alto que esses pods.
globalDefault
Opcional: configure o campo como true
para tornar essa classe de prioridade o padrão global que é aplicado a cada pod que está planejado sem um valorpriorityClassName
. Apenas uma classe de prioridade em seu cluster pode ser configurada como o padrão global. Se não houver um padrão global, os pods sempriorityClassName
especificado terão prioridade zero (0
).As classes de prioridade padrão não configuram um
globalDefault
. Se você criou outras classes de prioridade no cluster, será possível verificar se elas não configuram umglobalDefault
executandokubectl describe priorityclass <name>
.description
Opcional: diga aos usuários por que usar essa classe de prioridade. Coloque a sequência entre aspas ( ""
). -
Crie a classe de prioridade em seu cluster.
kubectl apply -f filepath/priorityclass.yaml
-
Verifique se a classe de prioridade foi criada.
kubectl get priorityclasses
Ótimo! Você criou uma classe de prioridade. Deixe a sua equipe saber sobre a classe de prioridade e qual classe de prioridade, se houver, que ela deve usar para as suas implementações de pod.
Designando prioridade a seus pods
Designe uma classe de prioridade à sua especificação de pod para configurar a prioridade do pod no seu cluster do IBM Cloud Kubernetes Service.
Antes de Iniciar:
- Efetue login na sua conta. If applicable, target the appropriate resource group. Configure o contexto para o seu cluster.
- Certifique-se de ter a função de acesso de serviço Gravador ou Gerenciador do IBM Cloud IAM no namespace no qual deseja implementar os pods.
- Entenda como o planejamento de prioridade funciona, pois a prioridade pode priorizar os pods existentes e afetar como os recursos de seu cluster são consumidos.
Conclua as etapas a seguir para verificar a importância de outros pods implantados, de modo que você possa escolher a classe de prioridade correta para seus pods em relação ao que já está implantado.
-
Visualize as classes de prioridade que outros pods no namespace usam.
kubectl get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
-
Obtenha os detalhes da classe de prioridade e anote o número do valor. Os pods com números mais altos são priorizados antes dos pods com números mais baixos. Repita essa etapa para cada classe de prioridade que deseja revisar.
kubectl describe priorityclass <priorityclass_name>
-
Obtenha a classe de prioridade que você deseja usar ou crie sua própria classe de prioridade.
kubectl get priorityclasses
-
Em sua especificação de pod, inclua o campo
priorityClassName
com o nome da classe de prioridade que você recuperou na etapa anterior.apiVersion: apps/v1 kind: Deployment metadata: name: ibmliberty spec: replicas: 1 selector: matchLabels: app: ibmliberty template: metadata: labels: app: ibmliberty spec: containers: - name: ibmliberty image: icr.io/ibm/liberty:latest ports: - containerPort: 9080 priorityClassName: <priorityclass_name>
-
Crie seus pods priorizados no namespace em que você deseja implementá-los.
kubectl apply -f filepath/pod-deployment.yaml