AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1002886
Accepted
tacos_tacos_tacos
tacos_tacos_tacos
Asked: 2020-02-13 19:15:34 +0800 CST2020-02-13 19:15:34 +0800 CST 2020-02-13 19:15:34 +0800 CST

O pool de nós do Kubernetes não será dimensionado automaticamente para 0 nós

  • 772

Eu tenho uma carga de trabalho bastante cara que alguns colegas precisam executar às vezes durante a semana (não em nenhum tipo de cronograma definido). Eu uso o Google Cloud Kubernetes.

Ele consiste em três statefulsets, cada um com uma réplica.

Eu os instruí sobre como "ligar" e "desligar". Para ativá-lo, eles dimensionam cada statefulset para 1 réplica. Para desativá-lo, eles dimensionam cada statefulset para 0 réplicas.

Originalmente, eu tinha um único pool de nós de escalonamento automático com um tamanho padrão de três nós (os statefulsets consomem quase um nó inteiro de CPU e RAM). Observei que, mesmo depois de reduzir para 0, pelo menos um (e às vezes dois) nós permaneceriam após uma ou duas horas. Eu esperava que eventualmente todos os nós morressem, mas isso não acontece.

Percebi que os nós em execução ainda tinham alguns pods, apenas em um namespace diferente. Os pods restantes estão todos no kube-systemnamespace, exceto um no custom-metricsnamespace.

Então pensei, ok - talvez haja outros serviços que o Kubernetes deseja executar mesmo quando não há cargas de trabalho/pods definidos pelo usuário. Então, criei outro pool de nós, com um único nó muito pequeno, mas adequado. Esse nó é grande o suficiente para executar tudo o que o Kubernetes relata que está sendo executado nesses defaultnamespaces.

Depois que o novo pool de nós estava sendo executado com um nó, continuei a redimensionar manualmente o pool de nós original para 0. Tudo bem. Eu esperava neste ponto que eu tivesse um pool de nós de "sistema" para executar kube-systeme outras coisas, e um pool de nós de "usuário" para executar minhas próprias coisas.

Então, para o meu próximo teste, desta vez eu apenas dimensionei uma réplica statefulset. Eventualmente, um nó ficou online e o pod statefulset estava em execução/pronto. Eu então reduzi para 0 novamente e esperei... e esperei... e o nó não foi embora.

O que é necessário para fazer com que o pool de nós de escalonamento automático alcance 0 nós? Claramente estou faltando algo (ou mais do que algo), mas tive dificuldade em encontrar informações sobre o que é necessário para acionar o dimensionador de nós para reduzir o tamanho de um pool de nós para 0.

Qualquer conselho é apreciado.

informação adicional

Quando olho para o que está sendo executado no nó no pool de nós, quero ir para 0, eis o que vejo

  Namespace                  Name                                                   CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                                   ------------  ----------  ---------------  -------------  ---
  kube-system                fluentd-gcp-v3.1.1-mfkxf                               100m (0%)     1 (3%)      200Mi (0%)       500Mi (0%)     28m
  kube-system                kube-proxy-gke-tileperformance-pool-1-14d3671d-jl76    100m (0%)     0 (0%)      0 (0%)           0 (0%)         28m
  kube-system                prometheus-to-sd-htvnw                                 1m (0%)       3m (0%)     20Mi (0%)        20Mi (0%)      28m

Se eu tentar draino nó, ele reclama que eles são gerenciados via DaemonSet, então eu poderia forçá-lo, mas obviamente estou tentando não ter que intervir manualmente de forma alguma.

Hackear

Para que o autoescalador "funcione" e reduza o tamanho para 0, adicionei temporariamente um nodeSelectora todas as kube-systemimplantações para que elas sejam atribuídas a um pool separado para kube-systemcoisas. Mas tem que haver uma maneira melhor, certo?

kubernetes google-kubernetes-engine autoscaling
  • 2 2 respostas
  • 3243 Views

2 respostas

  • Voted
  1. Dawid Kruk
    2020-02-19T01:16:56+08:002020-02-19T01:16:56+08:00

    O autoescalador não reduzirá seu pool de nós para 0.

    Observação: se você especificar um mínimo de zero nós, um pool de nós inativos poderá ser reduzido completamente. No entanto, pelo menos um nó deve estar sempre disponível no cluster para executar os pods do sistema.

    -- Google Cloud: escalonador automático de cluster de mecanismo do Kubernetes

    No entanto, o autoescalador de cluster não pode reduzir completamente para zero um cluster inteiro. Pelo menos um nó deve estar sempre disponível no cluster para executar os pods do sistema. Então você precisa manter pelo menos um nó. Mas isso não significa que você precisa manter um nó caro ocioso.

    -- Medium.com: dimensione seu cluster kubernetes para quase zero com o gke autoscaler

    Você pode reduzir explicitamente seu pool de nós para zero (0) com o comando:

    $ gcloud container clusters resize CLUSTER_NAME --node-pool NAME_OF_THE_POOL --num-nodes 0

    Mas esteja ciente de que essa abordagem terá uma desvantagem.

    Imagine uma situação em que:

    • Você reduz o cluster para zero nós com o comando acima
    • Você cria uma carga de trabalho no cluster que tem zero nós

    O Autoscaler não poderá aumentar um número de nós de zero . Não terá meios para saber se são necessários recursos adicionais. Os pods que estavam sendo executados kube-systemnesses nós eram essenciais para determinar se outro nó é necessário.

    Há um artigo com caso de uso semelhante ao seu. Dê uma olhada: Medium.com: dimensione seu cluster kubernetes para quase zero com o gke autoscaler

    Outra maneira de fazer isso é com orçamentos de interrupção de pods. Por favor, dê uma olhada nos recursos abaixo:

    • Kubernetes.io: interrupções
    • Kubernetes.io: Como funcionam os orçamentos de interrupção .
    • Kubernetes.io: configurar o orçamento de interrupção do pod

    Possíveis motivos que podem impedir que o autoescalador de cluster remova um nó:

    • Pods com PodDisruptionBudget restritivo.
    • Pods do sistema Kube que:
      • não são executados no nó por padrão,
      • não tem um orçamento de interrupção de pod definido ou seu PDB é muito restritivo (desde CA 0.6).
    • Pods que não são apoiados por um objeto de controlador (portanto, não são criados por implantação, conjunto de réplicas, trabalho, conjunto com estado etc.).
    • Pods com armazenamento local.
    • Pods que não podem ser movidos para outro lugar devido a várias restrições (falta de recursos, seletores ou afinidade de nós não correspondentes, antiafinidade correspondente etc.)
    • Pods que têm o seguinte conjunto de anotações: "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

    A menos que o pod tenha a seguinte anotação (suportada no CA 1.0.3 ou posterior):

    "cluster-autoscaler.kubernetes.io/safe-to-evict": "true"

    -- Github.com: Kubernetes autoscaler: quais tipos de pods podem impedir que o ca remova um nó

    A CA não remove nós subutilizados se estiverem executando pods que não devem ser despejados

    Outros possíveis motivos para não reduzir:

    • o grupo de nós já tem o tamanho mínimo,
    • houve uma tentativa fracassada de remover esse nó específico, caso em que o Cluster Autoscaler aguardará 5 minutos extras antes de considerá-lo para remoção novamente,

    -- Github.com: Eu tenho alguns nós com baixa utilização, mas eles não são reduzidos por que

    • 2
  2. Best Answer
    Vincent Yin
    2020-12-13T18:10:44+08:002020-12-13T18:10:44+08:00

    No GKE 1.18, meus experimentos mostram que eu teria que adicionar uma mancha de nó para que o pool de nós pudesse ser reduzido a zero:

    $ gcloud container node-pools create ... \
          --min-nodes 0 \
          --max-nodes 2 \
          --node-taints=...  # Without a taint, my node pool won't scale down to zero somehow.
    
    • 1

relate perguntas

  • Não é possível executar o Hyperkube (kubernetes) localmente via Docker

  • Distribuindo a carga de trabalho pelo Kubernetes

  • Tipo de máquina revertida da atualização do Kubernetes

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve