Criar um pool
Dimensionamento e cicatrização
Rolando uma alteração de modelo
Um endereço público compartilhado
Criando uma pool
- Console
- API
- CLI
- Go
template é a configuração de lançamento, na mesma forma que um standalone instance create toma — mesmos nomes de campo, mesmos tipos, mesmos significados. Não há um recurso de modelo de lançamento separado para criar, fazer versão ou compartilhar; o modelo pertence ao pool.
Um flavor e uma sub-rede primária são necessários: template.flavor e template.networks[0].subnet. O índice 0 é a NIC primária; o resto são extras.
Referências e respostas de função do IAM
As solicitações de criação e substituição aceitamtemplate.iam_role como um UUID, CRN ou cadeia de nome exata para uma função em sua conta. Anexando a função requer iam:PassRole e autorização de confiança de instância; consulte Funções e identidade de instância.
Respostas de pool retornam um resumo de função opcional dentro de template, em vez de iam_role_id. Este excerto de resposta mostra a identidade do anexo:
id, crn e name e é visível com acesso de leitura de pool, sem iam:GetRole. Exclui campos de função confidenciais, como políticas. template.iam_role é omitido quando nenhuma função está anexada, a função foi excluída ou pertence a outra conta. Abrir os detalhes do IAM da função ainda requer iam:GetRole.
Referências e respostas de sub-rede
As solicitações de criação e substituição levamtemplate.networks[].subnet como uma cadeia de caracteres: um UUID ou um CRN completo de VPC/sub-rede. Um nome de sub-rede simples não é suficiente, porque os nomes de sub-rede são exclusivos apenas dentro de sua VPC.
As respostas de pool incorporam toda a sub-rede em cada NIC de modelo, no lugar do antigo subnet_id. O embed carrega a VPC pai e o resumo da tabela de rotas nuláveis descrito em subnet placement:
subnet.name e subnet.vpc.name são legíveis diretamente do pool — nenhuma leitura separada de sub-rede ou VPC é necessária apenas para mostrar onde as réplicas aterrissam. No Go SDK estes são nic.Subnet e nic.Subnet.VPC.
subnet é null quando a sub-rede referenciada não é mais resolvida, como uma sub-rede excluída depois que o modelo foi armazenado. Trate isso como um posicionamento indisponível em vez de “sem sub-rede”: mostre-o como indisponível e atualize antes de agir sobre ele. O modelo ainda nomeia uma sub-rede na qual o pool não pode ser lançado, e é por isso que a próxima substituição que ele lança falha.
A imagem é resolvida uma vez
template.image toma as mesmas três formas que instance create faz — um id, name:version, ou um name simples. Ao contrário da criação de instância, a referência é resolvida uma vez, quando o pool é criado (ou quando o modelo é substituído), e o id de imagem resultante é o que todas as réplicas inicializam — incluindo substituições geradas meses depois.
Isso é deliberado. Uma tag re-resolvida por réplica permitiria que um membro curado inicializasse uma compilação mais recente do que seus irmãos, e um pool cujos membros não são idênticos é a premissa da quebra primitiva silenciosa. Para mover um pool para uma nova compilação, altere o modelo e atualize.
Como são chamadas as réplicas
Cada réplica recebe um número de sequência, estável enquanto tiver o slot, e é nomeada<pool-name>-<sequence_num> — web-asg-0, web-asg-1, e assim por diante. Um substituto assume o número liberado.
GET /v1/instance-pools/{pool_id}/instances retorna todos os objetos Instance em instances, mais a paginação meta, assim como a lista de instâncias de nível superior. Cada objeto inclui seu estado, endereços, tipo de instância, imagem e função; você não precisa de uma solicitação de instância separada para cada membro. Leia a sequência de réplica de metadata["basalt:pool:sequence_num"]. Seu valor é uma string, incluindo "0" para o primeiro slot.
Filtrar esta lista com name, crn, current_state, flavor ou image. Ele também aceita limit e marker. Enquanto meta.has_more for true, solicite a próxima página usando meta.marker como marker, mantendo os mesmos filtros e limites. Colete instances de cada página para listar todos os membros correspondentes.
web não pode coexistir com uma instância que você já nomeou como web-0. Os próprios nomes de pool são de 1 a 127 caracteres de letras, dígitos, ponto, traço e sublinhado, exclusivos por conta.Discos e endereços por réplica
template.volumes cria um disco com cada réplica e o recupera com essa réplica. delete_on_termination padrão para true; defina-o como false e uma réplica escalada, substituída ou desmontada com o pool libera seu volume de volta para available em vez de destruí-lo.
template.networks[0].floating_ip_assignment dá a cada réplica seu próprio IP flutuante em sua NIC primária, alocado conforme o pool escala para fora e liberado conforme ele escala para dentro. Uma NIC em template.networks[] carrega sua própria bandeira, então uma interface secundária pode ser a pública. Cada endereço conta contra sua cota floating_ips.
Isso é diferente do endereço compartilhado do pool — veja abaixo.
Dimensionamento e convergência
Todos os três campos de dimensionamento são inteiros mutáveis. Os valores resultantes devem satisfazer0 ≤ min_count ≤ desired_count ≤ max_count ≤ 100. Em criar apenas, limites omitidos padrão para desired_count.
Em PATCH, os limites omitidos mantêm seus valores armazenados. Se você omitir desired_count, o alvo atual é fixado nos novos limites: elevar o mínimo acima dele eleva o alvo; diminuir o máximo abaixo dele diminui o alvo. Um alvo já dentro dos limites permanece inalterado.
Se você enviar explicitamente desired_count, ele deve se encaixar nos limites resultantes. O dimensionamento inválido retorna 400 sem aplicar qualquer parte da atualização, incluindo tags ou um modelo enviado com ela. Zero é válido, incluindo ambos os limites em zero. O dimensionamento não substitui o modelo de lançamento nem solicita uma atualização.
Esses controles se aplicam a pools gerenciados pelo cliente. Os pools de propriedade de um serviço gerenciado não podem ser redimensionados por meio da API de pool de instâncias; use os controles desse serviço.
Escala automática
Uma política deautoscaling ajusta desired_count dentro dos limites configurados. A mesma política está disponível em load balancers. Criar ou atualizar uma política não altera o modelo de inicialização.
O rastreamento de alvo da CPU requer min_count de pelo menos 1.
- Console
- API
- CLI
- Go
telemetry:ReadMetrics; essa permissão é verificada novamente enquanto a política é executada. Somente as métricas da conta e da região do pool são elegíveis.
expected_series deve corresponder ao número de séries selecionadas; uma série ausente impede o dimensionamento. As métricas de contador podem usar sample_aggregation: "rate" para contabilizar redefinições antes que as taxas sejam combinadas em todas as séries.
Publique um novo zero quando a fila estiver vazia. Dados ausentes, obsoletos ou incompletos nunca significam zero e não podem remover a capacidade. As métricas de demanda personalizadas podem aumentar um pool a partir do zero; as políticas de CPU não podem. Com várias métricas, a maior recomendação de capacidade válida vence. Dados ausentes ainda permitem uma recomendação de escala válida de outra métrica.
O aquecimento padrão é de 180 segundos, o tempo de recarga é de 60 segundos e a estabilização de redução é de 300 segundos. Cada decisão adiciona no máximo quatro instâncias ou remove no máximo uma. Estes limites e drain_seconds (padrão 120) são configuráveis. O tempo de espera e a estabilização permanecem em vigor durante as reinicializações do serviço. Leia autoscaling_status.reason e autoscaling_status.history para a condição de espera atual e as mudanças recentes de capacidade.
Você ainda pode alterar o tamanho manualmente. A avaliação automática recomeça após o tempo de recarga. Para parar as alterações automáticas, envie a política com enabled: false; sua configuração de métrica é mantida quando você a envia de volta. As políticas são substituídas como um todo, portanto, inclua a configuração da métrica ao desabilitar uma.
O dimensionamento inicial marca primeiro um membro como aposentado e o retira dos conjuntos de back-end do balanceador de carga e dos IPs flutuantes compartilhados. A exclusão aguarda o reconhecimento da retirada e o período de carência de drenagem. Isso não invoca um gancho de desligamento de aplicativo; trabalhos de longa execução devem tolerar o término da instância. Sessões TCP, UDP e WebSocket de longa duração podem terminar no prazo de drenagem. As alterações à associação de encaminhamento de IP flutuante compartilhado também podem alterar o posicionamento da conexão durante a retirada.
Ajustando os limites
A sequência a seguir começa com um mínimo de 2, desejado 3 e máximo 6. Ele aumenta o alvo para 4, diminui para 2 e, em seguida, escala para zero. Escalar para zero aposenta todos os membros; seus discos seguemdelete_on_termination.
- Console
- API
- CLI
- Go
201 imediatamente. As instâncias são geradas por um reconciliador de fundo, que também é o que converge o pool para desired_count sempre que você o altera, então observe o pool ao invés de esperar membros na resposta de criação.
Quatro contadores dizem onde está uma pool, e confundir dois deles é a fonte usual de um falso alarme:
status: "active" significa member_count == desired_count — o pool contém os membros que foram solicitados. Não é uma afirmação de que todos eles estão ativos. Um pool pode estar active com live_count abaixo de desired_count quando os membros pararam. Leia live_count para liveness.scaling significa que ele não mantém seu alvo e está convergindo: após uma criação, após uma alteração de desired_count, e para a duração de uma atualização. error significa uma falha de erro ativa — leia cada entrada em faults — e ainda está reconciliada: o pool continua sendo re-tentado. deleting é um teardown em andamento.POOL_LAUNCH_FAILED, POOL_SCALE_OUT_FAILED, POOL_SCALE_IN_FAILED) limpar quando o pool atinge seu alvo. Um redimensionamento posterior não os limpa primeiro: um pool que falhou em gerar e está sendo redimensionado novamente ainda não provou que a falha está por trás dele.
O que é substituído e o que não é
A cada passagem, o pool substitui qualquer membro cujocurrent_state é error ou deleted, e qualquer binding cuja instância foi excluída a partir dele. A substituição pega o número de sequência liberado e é lançada a partir do modelo atual do pool.
Escalar remove os números de sequência mais altos primeiro, então uma escala de 5 a 3 retira -4 e -3. Cada desativação executa a exclusão da instância completa, portanto, sua cota, seus volumes e seus endereços são manipulados exatamente como para uma instância autônoma.
As réplicas são distribuídas entre os hosts — melhor esforço. Cada nova réplica evita os hosts que seus irmãos já ocupam, mas quando a frota não tem espaço, o spread é descartado em vez de o lançamento falhar, então as réplicas podem acabar compartilhando um host.
Alterar o modelo
PATCH /v1/instance-pools/{pool_id} altera desired_count, min_count, max_count, autoscaling, as tags do pool, o template, ou qualquer combinação. Cada campo é opcional; enviar nenhum deles é um 400 ao invés de um no-op silencioso.
- Console
- API
- CLI
- Go
PATCH substitui o template por completo, salvar qualquer uma das duas placas de template reenvia toda a configuração armazenada: o console converte a sub-rede embutida de cada NIC de volta para seu ID para que nenhuma interface seja descartada. Se a sub-rede de qualquer NIC não for resolvida, ela relata a interface e não envia nada, ao invés de salvar um modelo curto de uma NIC.template.iam_role para o resumo id ou crn. Não envie o objeto de resumo de volta. Omitir iam_role de uma substituição limpa o anexo para lançamentos futuros.
Da mesma forma, converta a subnet embutida de cada NIC de resposta para sua string id ou crn na solicitação de substituição — veja referências e respostas de subnet. Uma sub-rede nula precisa de uma referência de substituição válida; não copie objetos de resposta diretamente para a solicitação. Faça isso para todas as entradas de networks, não apenas a primária: uma NIC extra descartada porque sua sub-rede não pôde ser convertida é uma interface sem a qual a próxima réplica é iniciada.
Uma alteração de modelo decide o que o pool lança a seguir. As instâncias já em execução mantêm o que inicializaram, porque uma VM ativa não pode alterar o tipo de instância, a camada, a sub-rede ou suas tags no local.
Então, entre a edição e um roll, o pool legitimamente mantém membros de dois modelos diferentes. stale_instance_count é quantos estão no mais antigo, e um valor diferente de zero é o sinal de que uma alteração de modelo ainda não foi implementada.
PATCH silenciosamente substituindo cada membro em execução apagaria - uma operação destrutiva usando a forma de uma edição.Rolando a pool
- Console
- API
- CLI
- Go
- Abra Instance pools e selecione seu pool.
- Escolha Roll instances ao lado de Scale.
- Confirme a substituição de cada membro em execução em um modelo mais antigo ou desconhecido. Os membros no modelo atual são mantidos. Sem espaço de aumento, o rolo espera; use Scale para aumentar Maximum count acima de Desired count (até 100).
- Assista Roll in progress e Stale instances. Uma contagem de zero não significa que o rolo terminou enquanto o Roll in progress permanece.
202 com o pool como ele está, e substitui todos os membros não lançados a partir do modelo atual — incluindo qualquer um que precede o rastreamento de modelo. Assincronizado, e deliberadamente: cada substituição é uma inicialização de VM, e uma solicitação que esperava expiraria muito antes que um pool de qualquer tamanho terminasse.
Um membro por passe
E somente quando a pool estiver inteira
A capacidade não mergulha
desired_count não é tocado — o surto é derivado, não escrito no que você pediu.refresh_in_progress e stale_instance_count para o progresso do rolo, e member_count e live_count para a capacidade. Uma contagem zero significa apenas que nenhum membro usa um modelo antigo. Depois que o sinalizador de atualização for limpo, o pool ainda poderá precisar remover seu membro de pico e convergir para o desejado. Espere até que o flag seja false, status: "active", e ambas as contagens sejam iguais antes de tratar a capacidade como resolvida.
Perguntar novamente enquanto um rolo está em execução é aceito e não o reinicia.
Dois conjuntos de tags
Um pool carrega dois mapas de tags e eles respondem a perguntas diferentes.tags
basalt:ResourceTag/<key> e usado para atribuição de custo. Tem efeito imediatamente, não toca em nenhuma instância e substitui todo o conjunto — um objeto vazio os limpa, um campo omitido os deixa sozinhos.Adicione o template.tags
template.tags sozinho é a maneira mais fácil de acabar com um pool cujos membros carregam dois conjuntos de tags diferentes — o que importa se uma política do IAM ou um relatório de custos tiverem chaves neles. stale_instance_count é quantos ainda estão no conjunto antigo.
Um endereço para toda a pool
POST /v1/instance-pools/{pool_id}/floating-ips vincula um IP flutuante que você já alocou ao pool. Um IP público, respondido por cada réplica — um endereço anycast — ao contrário de template.networks[0].floating_ip_assignment, que dá a cada réplica o seu próprio.
- Console
- API
- CLI
- Go
attached_to nomeia o CRN canônico do pool, mesmo quando members está vazio. Todas as réplicas ativas podem se tornar membros, incluindo réplicas no mesmo host. Leia a interface embutida e os resumos de instância em members para identificá-los; veja Reading the bindings.
A associação é mantida para você: um membro de escala de saída se junta, um membro de escala de entrada sai, um membro substituído é trocado. Não há nenhuma conexão por réplica a ser feita, e as próprias conexões e desconexões do serviço de rede são recusadas no endereço de um pool.
Não é um balanceador de carga
Com mais de um membro, a borda da região escolhe um membro por conexão, fazendo hash dos endereços e portas do fluxo, e cada pacote dessa conexão vai para o mesmo. Isso espalha conexões entre instâncias independentes e sobrevive à perda de um host.Requisitos e remoção
O IP flutuante deve ser unattached (attached_to: null) e seu, e a sub-rede do pool já deve rotear 0.0.0.0/0 para um gateway de internet. A anexação é idempotente: re-anexar o mesmo endereço ao mesmo pool retorna-o inalterado. Um 409 significa que o endereço já está ligado a algo, ou já pertence a outro pool.
DELETE /v1/instance-pools/{pool_id}/floating-ips/{floating_ip_id} interrompe o roteamento do endereço para o pool. No console, é a ação de linha na guia Floating IPs, confirmada como Detach floating IP.
DELETE /v1/floating-ips/{floating_ip_id}. Separando um o pool não contém respostas 204.GET /v1/instance-pools/{pool_id}/floating-ips lista os endereços compartilhados com seus membros atuais em floating_ips, mais paginação meta, usando a mesma forma de resposta que a lista de IP flutuante de nível superior. Ele aceita name, crn, limit e marker. IPs flutuantes não têm nome, então fornecer name retorna uma lista vazia. Enquanto meta.has_more for true, passe meta.marker como marker na próxima solicitação, preservando os filtros e limites, e colete floating_ips de cada página.
Os endereços por réplica não estão aqui — eles pertencem à réplica e são lidos da lista de NICs da instância.
Excluir um pool
- Console
- API
- CLI
- Go
204.
Excluir o pool é a única maneira de remover seus membros: excluir uma réplica diretamente apenas libera seu número de sequência e o pool gera uma substituição para ela na próxima passagem.
Permissões
Toda operação de pool autoriza contracrn:compute:<region>:<account>:instance-pool/<name> — esse é o valor que uma declaração de política do IAM deve nomear para escopo de uma permissão para um pool.
compute:UpdateInstancePool, a mesma ação que um PATCH, não como uma ação própria. Conceder a alguém a capacidade de editar um pool, portanto, também lhe concede a capacidade de rolá-lo, o que substitui todos os membros em execução.compute:CreateInstance do principal — e sua iam:PassRole em template.iam_role, se o template tiver uma — é a que cada recuperação e escalabilidade posterior é executada. Veja policies e roles.
Solução de problemas
A pool diz ativa, mas a capacidade está baixa
A pool diz ativa, mas a capacidade está baixa
active significa member_count == desired_count, não que os membros estão ativos. Leia o live_count. Uma lacuna entre eles são membros que existem e não estão em execução — parados, ainda em inicialização ou em cunho — e o pool não substitui um membro parado.Uma atualização não está em andamento
Uma atualização não está em andamento
max_count com desired_count. Se não houver capacidade livre para novas réplicas, aumente o máximo acima do desejado (até 100). A atualização permanece solicitada e retoma sem outra chamada de atualização. As alterações de limites durante uma atualização podem colocá-lo nesse estado de espera; o dimensionamento normal continua.Com espaço, o rolo espera por uma substituição acima do desejado com cada membro em execução antes de aposentar o próximo. Se o novo modelo não inicializar, o roll para lá por design ao invés de esvaziar o pool — verifique as faults da réplica mais recente e sua saída do console.stale_instance_count pára de cair assim que isso acontece, e refresh_in_progress permanece verdadeiro.Eu editei o modelo e nada mudou
Eu editei o modelo e nada mudou
template.iam_role para o resumo id ou crn. Não envie o objeto de resumo de volta. Omitir iam_role de uma substituição limpa o anexo para lançamentos futuros.Uma alteração de modelo decide o que o pool iniciará em seguida; as instâncias já em execução mantêm o que inicializaram. stale_instance_count conta-os, e POST /v1/instance-pools/{pool_id}/refresh os atualiza.O modelo perdeu uma NIC ou um volume de dados
O modelo perdeu uma NIC ou um volume de dados
template em um PATCH Leia o pool de volta e crie a solicitação de substituição completa, convertendo o resumo da função em uma referência de string, como descrito em
Alterar o modelo.O endereço compartilhado tem menos membros do que o pool tem réplicas
O endereço compartilhado tem menos membros do que o pool tem réplicas
health e a reason de cada membro separadamente: os membros que estão inicializando ou falhando permanecem listados, mas não recebem tráfego. Uma lista de membros vazia não limpa a propriedade attached_to do pool.Anexando um IP flutuante ao pool respostas 400
Anexando um IP flutuante ao pool respostas 400
409 é diferente — que é um endereço já anexado a outra coisa, ou já detido por outro pool.Uma réplica que eu apaguei voltou
Uma réplica que eu apaguei voltou
desired_count, então a exclusão de um membro é lida como deriva e reabastecida no número de sequência liberado. Diminua o desired_count, ou exclua o pool.Criar ou redimensionar o pool responde 400 no dimensionamento
Criar ou redimensionar o pool responde 400 no dimensionamento
0 ≤ min_count ≤ max_count ≤ 100. Um desired_count explícito deve estar dentro desses limites. Na criação, os limites omitidos são padrão para o desejado; na atualização, eles preservam os limites armazenados. Omita o desejado na atualização para fixá-lo automaticamente. O dimensionamento inválido não aplica nenhuma atualização. Para crescer além do máximo original, aumente max_count antes ou junto com desired.
