Pular para o conteúdo principal

Biblioteca de imagens de SO

Problema e finalidade​

Uma máquina virtual pode ser iniciada a partir de uma imagem de SO pronta em segundos, enquanto a instalação a partir de mídia leva dezenas de minutos. Mas o disco da nova máquina é criado como um clone ZFS, e um clone reside no mesmo pool que o seu pai. Portanto, a imagem já precisa estar no pool onde a máquina é criada. Baixar gigabytes de um servidor externo toda vez que uma VM é criada não faz sentido.

A biblioteca de imagens separa esses dois eventos no tempo. Primeiro, o administrador importa a imagem para o cluster uma única vez e a distribui entre os pools. Depois, as máquinas são criadas a partir das cópias locais, sem acessar a rede externa.

Isso divide o modelo em duas partes. Fora do cluster está a fonte da biblioteca: um servidor web comum com um arquivo manifest.json que lista as imagens disponíveis. Dentro do cluster está o catálogo de imagens: imagens que já foram importadas, com um mapa de distribuição entre os pools e o estado de cada cópia. A sincronização lê a primeira parte; a importação preenche a segunda.

A terceira característica do modelo é menos óbvia. O registro de fonte não tem um parâmetro "qual VDC" (data center virtual): o papel Cluster master cria uma fonte compartilhada do cluster, e um administrador de VDC cria uma fonte do seu próprio VDC. A importação tem esse parâmetro, mas quem decide são os direitos. O papel Cluster master importa apenas imagens compartilhadas, e um VDC especificado é ignorado. Um administrador de VDC precisa especificar o seu próprio VDC: sem ele, a importação é rejeitada com o código -49005, e com outro VDC, com o código -49006.

Na interface web do vStack Center, a biblioteca é aberta pela seção «Image library», com as abas «Images» e «Sources»: o catálogo de imagens do cluster, a adição de uma imagem a partir de uma fonte, a remoção de uma imagem e o registro, a sincronização e a remoção de fontes. Todas as operações da biblioteca também estão disponíveis pela API do cluster, por chamadas de API ou por um sistema de automação que faz essas chamadas. As operações estão listadas no final desta página; as estruturas de requisição e resposta estão na referência da API.

Esta página explica o modelo. Para importar uma imagem, consulte Como importar uma imagem de SO para o cluster; para remover uma imagem do cluster, consulte Como remover uma imagem de SO.

Modelo e entidades​

Fonte da biblioteca. Um servidor externo com imagens. Uma fonte tem um nome, uma URL raiz da biblioteca e o horário da sua última sincronização, que fica vazio se ela ainda não foi sincronizada. A URL deve usar http ou https; https é obrigatório por padrão. O http não criptografado só é permitido com autorização explícita. A URL é única dentro do cluster: a mesma URL raiz não pode ser registrada duas vezes.

Manifesto. O arquivo manifest.json na raiz da fonte é um catálogo do que a fonte oferece. O proprietário da biblioteca escreve o manifesto, e cada entrada contém os metadados completos da imagem: os campos obrigatórios name, version, format, url_path, size e sha256, e os opcionais description, os_type, net_link_pattern, zero_based_link, default_shell, sector_size_logical, sector_size_physical, guest_customization, uefi, min_size e uuid. O próprio cluster determina se uma imagem pode ser importada: apenas imagens no formato zfs são elegíveis.

O campo uuid é formalmente opcional, mas a importação o usa para localizar a imagem no manifesto: uma entrada sem uuid não pode ser importada. O identificador é globalmente único: o manifesto não pode conter duas entradas com o mesmo uuid.

Imagem no catálogo do cluster. Uma imagem importada é endereçada por um identificador substituto (UUID). Os nomes de imagem não são únicos, então as operações usam o identificador, e não o nome. Uma imagem tem um estágio do ciclo de vida e um mapa da sua distribuição real entre os pools.

Cópia em um par nó → pool. A distribuição é feita por pool, e cada par nó → pool tem o seu próprio resultado. Isso explica o estado "não distribuída em todos os lugares" e a dependência inversa: os discos das VMs em um pool são clones ZFS da cópia da imagem naquele pool específico.

EntidadeEndereçada porPertence a
Fonte da bibliotecaIdentificador inteiroAo cluster (compartilhada) ou a um VDC
Imagem no catálogoIdentificador UUIDAo VDC proprietário ou ao cluster
Cópia da imagemUm par nó → poolAo pool

Como funciona​

O trabalho com a biblioteca envolve oito operações, cada uma com o seu próprio privilégio.

TarefaModoPrivilégio
Registrar ou reconfigurar uma fonteSíncronoManage Image Library
Remover uma fonteSíncronoManage Image Library
Visualizar as fontes disponíveisSíncronoView Image Library
Ler o catálogo da fonteSíncronoSync Image Library
Importar uma imagem para o clusterAssíncronoImport Golden Image
Visualizar o catálogo de imagens do clusterSíncronoView Image Catalog
Obter o mapa de dependências de uma imagemSíncronoView Image Dependencies
Remover uma imagem do clusterSíncronoRemove OS Image

Todos os privilégios têm como escopo o respectivo VDC; o papel Cluster master tem escopo global. O direito de visualizar dependências é separado do direito de remover imagens: a visualização pode ser concedida amplamente, a remoção não.

A sincronização lê o manifesto, não as imagens​

A sincronização baixa apenas o manifest.json e retorna o catálogo de imagens da fonte. Nenhum byte de imagem é transferido, então a operação é barata e segura. Ela também atualiza o horário da última sincronização da fonte. Uma imagem em um formato não suportado não desaparece do catálogo: ela é retornada com um indicador "não elegível para importação", que mostra por que a importação não a aceitará.

As requisições a URLs externas são protegidas contra substituição de destino. O esquema (somente http ou https) e o resultado da resolução de nomes são verificados. O cluster rejeita loopback, link-local, incluindo o endereço do serviço de metadados, as faixas privadas da RFC 1918, o espaço de endereços compartilhado de NAT de nível de operadora (CGNAT), a "rede zero" e o endereço de broadcast. As formas disfarçadas de IPv6 mapeado em IPv4 são reduzidas a IPv4 e verificadas contra a mesma lista; os endereços IPv6 nativos de loopback, link-local e locais únicos (ULA) são bloqueados. O corpo do manifesto é limitado a 100 MB.

A importação distribui a imagem entre os pools​

A importação responde imediatamente, confirmando a aceitação do job, e não que a imagem está pronta: o trabalho continua em segundo plano. O serviço de distribuição dedicado vstack-center-image-distributor transfere os bytes usando um protocolo de duas fases; o dispatcher do cluster apenas orquestra o processo. Um único componente grava no catálogo de imagens, então não há gravações concorrentes no estado da imagem.

O progresso e o resultado ficam visíveis no catálogo de imagens do cluster: uma imagem tem um estágio e um mapa de distribuição com uma entrada para cada pool.

EstágioSignificadoAção
importingA imagem está sendo baixada e distribuídaAguarde
activeA imagem foi distribuída para todos os pools selecionadosÉ possível criar VMs
partial_activeAlguns pools não receberam uma cópiaConclua a distribuição importando a mesma versão novamente
failedA tentativa falhou por completoInvestigue a causa e reinicie a importação
deletingA imagem está sendo removidaAguarde o resultado; a importação e outra remoção são rejeitadas com o código -48004

Não há novas tentativas automáticas, por design. Qualquer falha (download, soma de verificação, distribuição ou o serviço perder o job) coloca a imagem em failed e cria uma entrada de log. O administrador inicia uma nova tentativa importando novamente. A mesma lógica se aplica após um reinício do dispatcher: as importações incompletas são marcadas como falhas, em vez de repetidas silenciosamente.

O sucesso parcial não é revertido. Os pools que receberam uma cópia a mantêm; importar a mesma versão novamente entrega as cópias restantes.

A criação de VM aguarda um pool pronto​

Enquanto a imagem tiver um mapa de distribuição, a sua cópia no pool selecionado para a criação da máquina precisa estar ativa. Caso contrário, a criação da VM é rejeitada com o código -259 antes que qualquer coisa seja criada. Portanto, a ordem das operações inverte a abordagem habitual: primeiro a imagem no pool, depois a máquina nesse pool. Para detalhes sobre a criação, consulte Como criar, remover e migrar uma máquina virtual.

Visibilidade e propriedade​

Imagens e fontes têm o mesmo escopo de visibilidade. O Cluster master vê tudo. Um administrador de VDC vê os objetos compartilhados do cluster mais os objetos atribuídos aos seus VDCs. Uma entidade sem VDC vê apenas os objetos compartilhados. A URL da fonte é exibida apenas ao seu proprietário; os demais não a veem.

Visibilidade e propriedade são direitos diferentes. Um administrador de VDC não pode remover uma imagem que se tornou visível para o seu VDC por meio de uma concessão de visibilidade: a remoção exige propriedade. Importar uma nova versão de uma imagem existente também só está disponível ao proprietário ou ao papel Cluster master. Imagens inexistentes e invisíveis retornam a mesma resposta, "não encontrada", de modo que a resposta não pode revelar a existência da imagem restrita de outra pessoa.

Toda alteração é registrada primeiro​

O registro e a remoção de fontes, a sincronização, a importação e a remoção de imagens gravam um registro de intenção no log de segurança antes da própria ação. A gravação do registro tem um limite de tempo de dois segundos por padrão. Se o log não aceitar o evento, a operação não é iniciada e retorna o código -503. Nada muda nem no catálogo nem nos nós.

As leituras bem-sucedidas da lista de fontes e do catálogo de imagens não são registradas, mas uma negação de acesso a qualquer operação com imagens deixa uma entrada auth.image_library_access_denied. A visualização de dependências é registrada como um evento config.image_dependencies_viewed. Os estágios da remoção têm as suas próprias entradas: config.image_remove_initiated, config.image_removed, config.image_remove_partial, config.image_remove_failed e config.image_remove_blocked_dependencies. Cada registro contém uma associação a um VDC ou a indicação de que o objeto é compartilhado em todo o cluster, o escopo de acesso de quem fez a chamada e o seu identificador. O log não contém caminhos de armazenamento nem a topologia dos pools, apenas identificadores de nós e contagens agregadas.

Limitações​

Apenas o formato zfs pode ser importado. Uma cópia de imagem em um pool é um dataset ZFS a partir do qual os discos das máquinas são clonados, então não há onde distribuir outro formato. Uma imagem em outro formato aparece no catálogo da fonte como não elegível para importação, e a própria importação retorna o código -48005. Solução alternativa: inclua uma variante zfs da imagem no manifesto.

O http não criptografado é bloqueado por padrão. A biblioteca fornece os dados a partir dos quais todas as máquinas do cluster são construídas, então o canal precisa ser verificável. Sem autorização explícita, uma URL http é rejeitada com o código -46011. Solução alternativa: publique a fonte por https; reserve a autorização para um ambiente de teste isolado.

Endereços internos são proibidos. Um host de fonte que resolve para loopback, link-local, o endereço do serviço de metadados, uma faixa privada da RFC 1918, CGNAT, a "rede zero" ou o endereço de broadcast é rejeitado com o código -46012. A restrição não pode ser removida: ela impede que o cluster acesse a si mesmo por ordem de terceiros. Uma biblioteca em uma rede interna se enquadra inteiramente nessa restrição. Solução alternativa: mova a biblioteca para um endereço fora das faixas listadas.

Remover uma fonte mantém as suas imagens. A remoção de uma fonte exclui apenas o registro e os seus vínculos com VDCs; as imagens importadas dela permanecem no catálogo, mas perdem o vínculo com a fonte. Um administrador de VDC remove apenas a fonte do seu VDC; uma fonte compartilhada do cluster é removida pelo papel Cluster master. Para alterar a URL, não é necessário remover a fonte: o registro com um identificador de fonte existente funciona como uma sobrescrita do seu nome e da sua URL.

A importação exige o serviço de distribuição. Sem um vstack-center-image-distributor implantado (e o seu vhost obrigatório imgdistr_vhost), não há o que transfira os bytes. A única solução alternativa é implantar o serviço; a sincronização não envolve o serviço de distribuição e lê apenas o manifesto.

As verificações de dependências podem ser incompletas. O mapa de clones é montado consultando todos os nós, e um nó inacessível não é incluído na resposta; ele é marcado como ignorado. Solução alternativa: aguarde o retorno do nó e obtenha o mapa novamente; a remoção nessa situação ainda terá um resultado parcial.

Leitura adicional​

Métodos da API​

As operações de API abordadas nesta página são os-library-set, os-library-delete, os-library-list, os-library-sync, os-image-import, os-image-from-vm, golden-images-list, golden-image-clones e golden-image-remove; consulte a referência da API.