Compartilhar via


Preparar ativos técnicos de contêiner do Azure para um aplicativo do Kubernetes

Este artigo fornece recursos técnicos e recomendações para ajudá-lo a criar uma oferta de contêiner no Azure Marketplace para um aplicativo do Kubernetes.

Para obter um exemplo abrangente dos ativos técnicos necessários para uma oferta de contêiner baseada em aplicativo do Kubernetes, consulte Amostras de oferta de contêiner do Azure Marketplace para Kubernetes.

Conhecimento técnico fundamental

Projetar, criar e testar esses ativos leva tempo e exige conhecimento técnico da plataforma do Azure e das tecnologias usadas para criar a oferta.

Além do domínio da solução, a equipe de engenharia deve ter conhecimento das seguintes tecnologias Microsoft:

Pré-requisitos

  • Seu aplicativo deve ser baseado em gráfico do Helm.

  • O gráfico do Helm não deve incluir .tgz arquivos compactados; todos os arquivos devem ser descompactados.

  • Se você tiver vários gráficos, poderá incluir outros gráficos de leme como subgráficos além do gráfico de leme principal.

  • Todas as referências de imagem e detalhes de resumo da mensagem devem ser incluídos no gráfico. Nenhum outro gráfico ou imagem pode ser baixado em tempo de execução.

  • Você deve ter um locatário de publicação ativo ou acesso a um locatário de publicação e a uma conta do Partner Center.

  • Você deve ter criado um ACR (Registro de Contêiner do Azure) que pertença ao locatário de publicação ativo acima. Você carregará o CNAB (Cloud Native Application Bundle) para ele. Para obter mais informações, consulte Criar um Registro de Contêiner do Azure.

  • Instale a versão mais recente da CLI do Azure.

  • O aplicativo deve ser implantável no ambiente do Linux.

  • As imagens devem estar livres de vulnerabilidades. Para obter diretrizes sobre como especificar os requisitos de verificação de vulnerabilidade, consulte Solucionar problemas de certificação de contêiner. Para saber mais sobre como verificar vulnerabilidades, consulte Avaliações de vulnerabilidade para o Azure com o Gerenciamento de Vulnerabilidades do Microsoft Defender.

  • Se estiver executando a ferramenta de empacotamento manualmente, o Docker precisará ser instalado em um computador local. Para obter mais informações, consulte a seção de back-end do WSL 2 na documentação do Docker para Windows ou Linux. Isso só é suportado em máquinas Linux/Windows AMD64.

Limitações

  • O Marketplace de Contêiner dá suporte apenas a imagens AMD64 baseadas na plataforma Linux.
  • A oferta do Marketplace de Contêiner dá suporte à implantação no AKS Gerenciado e no Kubernetes Habilitado para Arc. Uma única oferta só pode ser direcionada a um tipo de cluster, AKS gerenciado ou Kubernetes habilitado para Arc.
  • As ofertas para clusters do Kubernetes habilitados para Arc oferecem suporte apenas a modelos de cobrança predefinidos. Para obter mais informações sobre modelos de cobrança, consulte Planejar uma oferta de Contêiner do Azure.
  • Não há suporte para contêineres individuais.
  • Não há suporte para modelos vinculados do Azure Resource Manager.

Visão geral da publicação

A primeira etapa para publicar sua oferta de contêiner baseado em aplicativo do Kubernetes no Azure Marketplace é empacotar seu aplicativo como um CNAB (Pacote de Aplicativos Nativos de Nuvem). O CNAB, composto pelos artefatos do aplicativo, é publicado primeiro no ACR (Registro de Contêiner do Azure) privado e, posteriormente, enviado por push para um ACR público de propriedade da Microsoft e é usado como o único artefato que você referencia no Partner Center.

Depois, a verificação de vulnerabilidades executará para garantir que as imagens são seguras. Por fim, o aplicativo Kubernetes é registrado como um tipo de extensão para um cluster do AKS (Serviço de Kubernetes do Azure).

Depois que sua oferta é publicada, seu aplicativo aproveita as extensões de cluster para o recurso AKS para gerenciar o ciclo de vida do aplicativo dentro de um cluster do AKS.

Um diagrama mostrando os três estágios do processamento do pacote, fluindo de

Conceder acesso ao Registro de Contêiner do Azure

Como parte do processo de publicação, a Microsoft copia profundamente seu CNAB do ACR para um ACR específico do Azure Marketplace de propriedade da Microsoft. As imagens são carregadas em um registro público acessível a todos. Esta etapa exige que você conceda à Microsoft acesso ao registro. O ACR deve estar no mesmo locatário do Microsoft Entra vinculado à sua conta do Partner Center.

A Microsoft tem um aplicativo primário responsável por lidar com esse processo com um id dos 32597670-3e15-4def-8851-614ff48c1efa. Para começar, crie uma entidade de serviço com base no aplicativo:

Observação

Se a sua conta não tem permissão para criar uma entidade de serviço, az ad sp create retorna a mensagem de erro "Privilégios insuficientes para concluir a operação". Entre em contato com o administrador do Microsoft Entra para criar uma entidade de serviço.

az login

Verifique se já existe uma entidade de serviço para o aplicativo:

az ad sp show --id 32597670-3e15-4def-8851-614ff48c1efa 

Se o comando anterior não retornar nenhum resultado, crie uma nova entidade de serviço:

az ad sp create --id 32597670-3e15-4def-8851-614ff48c1efa

Anote a ID da entidade de serviço a ser usada nas etapas a seguir.

Em seguida, obtenha a ID completa do registro:

az acr show --name <registry-name> --query "id" --output tsv

A saída deve ser semelhante ao seguinte:

...
},
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/myregistry",
...

Em seguida, crie uma atribuição de função para conceder à entidade de serviço a capacidade de efetuar pull do registro usando os valores obtidos anteriormente:

Para atribuir funções do Azure, é necessário ter:

az role assignment create --assignee <sp-id> --scope <registry-id> --role acrpull

Por fim, registre o provedor de recursos Microsoft.PartnerCenterIngestion na mesma assinatura usada para criar o Registro de Contêiner do Azure:

az provider register --namespace Microsoft.PartnerCenterIngestion --subscription <subscription-id> --wait

Monitore o registro e confirme se ele foi concluído antes de prosseguir:

az provider show -n Microsoft.PartnerCenterIngestion --subscription <subscription-id>

Coletar artefatos para atender aos requisitos de formato de pacote

Cada CNAB é composto pelos seguintes artefatos:

  • Gráfico Helm
  • CreateUiDefinition
  • Modelo do ARM
  • Arquivo de manifesto

Atualizar o gráfico do Helm

Verifique se o gráfico do Helm segue as seguintes regras:

  • Todos os nomes e referências de imagem são parametrizados e representados em values.yaml como referências global.azure.images. Atualize o arquivo deployment.yaml de modelo de gráfico do Helm para apontar essas imagens. Isso garante que o bloco de imagem possa ser atualizado para fazer referência às imagens ACR do Azure Marketplace. Captura de tela mostrando o exemplo de referência de suporte de tag de adição estendida.Captura de tela mostrando a adição de referência de imagem.

  • Se você tiver vários gráficos, poderá incluir outros gráficos de leme como subgráficos além do gráfico de leme principal. Todas as referências de imagem de gráficos de leme dependentes precisarão de atualizações e devem apontar para as imagens incluídas no gráfico values.yamlprincipal.

  • Ao fazer referência a imagens, você pode utilizar tags ou resumos. No entanto, é importante observar que as imagens são marcadas internamente para apontar para o ACR (Registro de Contêiner do Azure) de propriedade da Microsoft. Quando você atualiza uma marca, uma nova versão do CNAB deve ser enviada ao Azure Marketplace. Isso é para que as alterações possam ser refletidas nas implantações do cliente.

    Captura de tela mostrando a adição de exemplo de referência de suporte a tag.

Modelos de cobrança disponíveis

Para todos os modelos de cobrança disponíveis, consulte as opções de licenciamento para Aplicativos de Kubernetes do Azure.

Fazer atualizações com base no modelo de cobrança

Depois de analisar os modelos de faturamento disponíveis, selecione um apropriado para seu caso de uso e conclua as seguintes etapas:

Conclua as etapas a seguir para adicionar o identificador nos modelos de cobrança Por núcleo, Por pod, Por nó:

  • Adicione um rótulo azure-extensions-usage-release-identifier de identificador de faturamento à especificação do pod em seus arquivos yaml de carga de trabalho .

    • Se a carga de trabalho for especificada como Implantações ou Replicasets ou Statefulsets ou Daemonsets specs, adicione esse rótulo em .spec.template.metadata.labels.

    • Se a carga de trabalho for especificada diretamente como especificações do pod, adicione esse rótulo em .metadata.labels.

      Uma captura de tela de um rótulo de identificador de cobrança formatado corretamente em um arquivo deployment.yaml. O conteúdo é semelhante ao arquivo depoyment.yaml de exemplo vinculado neste artigo.

      Uma captura de tela de um rótulo de identificador de faturamento formatado corretamente em um arquivo statefulsets.yaml. O conteúdo é semelhante ao arquivo statefulsets.yaml de exemplo vinculado neste artigo.

      Uma captura de tela de solicitações de recursos da CPU em um arquivo daemonsets.yaml. O conteúdo é semelhante ao arquivo daemonsets.yaml de amostra vinculado neste artigo.

      Uma captura de tela das solicitações de recursos da CPU em um arquivo pods.yaml. O conteúdo é semelhante ao arquivo pods.yaml de amostra vinculado neste artigo.

  • Para o modelo de cobrança perCore , especifique a Solicitação de CPU incluindo o campo no manifesto resources:requests do recurso de contêiner. Esta etapa só é necessária para o modelo de cobrança perCore .

    Uma captura de tela das solicitações de recursos da CPU em um arquivo pods.yaml. O conteúdo é semelhante ao exemplo por arquivo de modelo de cobrança principal vinculado neste artigo.

No momento da implantação, o recurso de extensões de cluster substitui o valor do identificador de cobrança pelo nome da instância da extensão.

Para obter exemplos configurados para implantar o Aplicativo de Votação do Azure, consulte o seguinte:

Para o modelo de cobrança de medidores personalizados, adicione os campos listados abaixo no arquivo values.yaml do modelo do helm

  • clientId deve ser adicionado em global.azure.identity
  • planId deve ser adicionada em global.azure.marketplace. planId
  • resourceId deve ser adicionado em global.azure.extension.resrouceId

Captura de tela do faturamento de medição personalizado.

No momento da implantação, o recurso de extensões de cluster substitui esses campos pelos valores apropriados. Para obter exemplos, consulte o aplicativo baseado em Medidores Personalizados de Voto do Azure.

Validar o gráfico do Helm

Para garantir que o gráfico do Helm seja válido, teste se ele pode ser instalado em um cluster local. Você também pode usar helm install --generate-name --dry-run --debug para detectar certos erros de geração de modelo.

Criar e testar o createUiDefinition

Um createUiDefinition é um arquivo JSON que define os elementos da interface do usuário para o portal do Azure ao implantar o aplicativo. Para saber mais, veja:

Após criar o arquivo createUiDefinition.json para o aplicativo, você precisa testar a experiência do usuário. Para simplificar o teste, copie o conteúdo do arquivo para o ambiente de sandbox. A área restrita apresenta a sua interface do usuário na experiência atual do portal de tela inteira. A área restrita é a maneira recomendada de visualizar a interface do usuário.

Criar o modelo do ARM (Azure Resource Manager)

Um modelo do ARM define os recursos do Azure a serem implantados. Por padrão, você implantará um recurso de extensão de cluster para o aplicativo Azure Marketplace. Opcionalmente, você pode escolher por implantar um cluster do AKS.

Atualmente, só permitimos os seguintes tipos de recursos:

  • Microsoft.ContainerService/managedClusters
  • Microsoft.KubernetesConfiguration/extensions

Por exemplo, consulte este modelo do ARM de exemplo projetado para obter resultados da definição de interface do usuário de exemplo vinculada anteriormente e passar parâmetros para seu aplicativo.

Fluxo de parâmetros de usuário

É importante reconhecer como os parâmetros de usuário fluem pelos artefatos que você está criando e empacotando. No exemplo do Aplicativo de Votação do Azure, os parâmetros são definidos inicialmente ao criar a interface do usuário por meio de um arquivo createUiDefinition.json:

Uma captura de tela do exemplo createUiDefinition vinculado neste artigo. As definições para 'value1' e 'value2' são mostradas.

Os parâmetros são exportados por meio da outputs seção:

Uma captura de tela do exemplo createUiDefinition vinculado neste artigo. As linhas de saída para o título do aplicativo, 'value1' e 'value2' são mostradas.

A partir daí, os valores são passados para o modelo do Azure Resource Manager e propagados para o gráfico do Helm durante a implantação:

Uma captura de tela do exemplo de modelo do Azure Resource Manager vinculado neste artigo. Em 'configurationSettings', são mostrados os parâmetros para o título do aplicativo, 'value1' e 'value2'.

Por fim, os valores são passados para o gráfico Helm por meio da values.yaml mostra.

Uma captura de tela do exemplo de gráfico Helm vinculado neste artigo. Os valores para o título do aplicativo, 'value1', e 'value2' são mostrados.

Observação

Neste exemplo, extensionResourceName também é parametrizado e passado para o recurso de extensão de cluster. Da mesma forma, outras propriedades de extensão poderão ser parametrizadas como, por exemplo, habilitar a atualização automática para versões secundárias. Para obter mais informações sobre as propriedades de extensão de cluster, consulte parâmetros opcionais.

Crie o arquivo de manifesto

O manifesto do pacote é um arquivo yaml que descreve o pacote e seu conteúdo e informa à ferramenta de empacotamento onde localizar os artefatos dependentes.

Os campos usados no manifesto são os seguintes:

Nome Tipo de dados Descrição
applicationName String Nome do aplicativo
publicador String Nome do Publicador
descrição String Descrição resumida do pacote
version Cadeia de caracteres em formulário #.#.# A cadeia de caracteres de versão que descreve a versão do pacote de aplicativos pode ou não corresponder à versão dos binários internos.
helmChart String Diretório local onde o gráfico do Helm pode ser encontrado em relação a este manifest.yaml
clusterARMTemplate String Caminho local em que um modelo do ARM que descreve um cluster do AKS que atende aos requisitos no campo de restrições pode ser encontrado
uiDefinition String Caminho local em que um arquivo JSON que descreve uma experiência de Criar do portal do Azure pode ser encontrado
registryServer String O ACR em que o pacote do CNAB final deve ser enviado por push
extensionRegistrationParameters Coleção Especificação para os parâmetros de registro de extensão. Inclua pelo menos defaultScope e como um parâmetro.
defaultScope String O escopo padrão para a instalação da extensão. Os valores aceitos são cluster ou namespace. Se o escopo cluster for definido, apenas uma instância de extensão será permitida por cluster. Se o escopo namespace for selecionado, apenas uma instância será permitida por namespace. Como um cluster do Kubernetes pode ter vários namespaces, várias instâncias de extensão podem existir.
namespace String (Opcional) Especifique o namespace no qual a extensão é instalada. Essa propriedade é necessária quando defaultScope está configurado como cluster. Para restrições de nomenclatura de namespace, consulte Namespaces e DNS.
supportedClusterTypes Cobrança (Opcional) Especifique os tipos de cluster compatíveis com o aplicativo. Os tipos permitidos são – "managedClusters", "connectedClusters". "managedClusters" refere-se a clusters do AKS (Serviço de Kubernetes do Azure). "connectedClusters" refere-se a clusters do Kubernetes habilitados para Azure Arc. Se supportedClusterTypes não for fornecido, todas as distribuições de 'managedClusters' terão suporte por padrão. Se supportedClusterTypes for fornecido e um determinado tipo de cluster de nível superior não for fornecido, todas as distribuições e versões do Kubernetes para esse tipo de cluster serão tratadas como sem suporte. Para cada tipo de cluster, especifique uma lista de uma ou mais distribuições com as seguintes propriedades:
-distribuição
- distribuiçãoSuportado
- unsupportedVersions
distribuição Lista Uma matriz de distribuições correspondentes ao tipo de cluster. Forneça o nome de distribuições específicas. Defina o valor como ["All"] para indicar que todas as distribuições são suportadas.
distribuiçãoSuportado Booliano Um valor booleano que representa se as distribuições especificadas são suportadas. Se for falso, fornecer UnsupportedVersions causará um erro.
unsupportedVersions Lista Uma lista de versões para as distribuições especificadas que não têm suporte. Operadores com suporte:
- "=" A versão fornecida não é suportada. Por exemplo, "=1.2.12"
- ">" Todas as versões maiores que a versão fornecida não são suportadas. Por exemplo, ">1.1.13"
- "<" Todas as versões menores que a versão fornecida não são suportadas. Por exemplo, "<1.3.14"
- "..." Todas as versões do intervalo não são suportadas. Por exemplo, "1.1.2...1.1.15" (inclui o valor do lado direito e exclui o valor do lado esquerdo)

Para obter um exemplo configurado para o aplicativo de votação, consulte o exemplo de arquivo de manifesto a seguir.

Estruture seu aplicativo

Coloque o createUiDefinition, o modelo ARM e o arquivo de manifesto ao lado do gráfico do Helm do aplicativo.

Para obter um exemplo de um diretório estruturado corretamente, consulte Exemplo de voto do Azure.

Para obter um exemplo do aplicativo de votação que dá suporte a clusters do Kubernetes habilitados para Azure Arc, consulte Exemplo somente ConnectedCluster.

Para obter mais informações sobre como configurar um cluster do Kubernetes habilitado para Azure Arc para validar o aplicativo, consulte Início Rápido: Conectar um cluster do Kubernetes existente ao Azure Arc.

Usar a ferramenta de empacotamento de contêiner

Depois de adicionar todos os artefatos necessários, execute a ferramenta container-package-app de empacotamento para validar os artefatos, compilar o pacote e carregá-lo no Registro de Contêiner do Azure.

Como os CNABs são um novo formato e têm uma curva de aprendizado, criamos uma imagem do Docker para container-package-app o ambiente de inicialização e as ferramentas necessárias para executar com êxito a ferramenta de empacotamento.

Você tem duas opções para usar a ferramenta de empacotamento. Você pode usá-la manualmente ou integrá-la a um pipeline de implantação.

Executar manualmente a ferramenta de empacotamento

A imagem mais recente da ferramenta de empacotamento pode ser extraída de mcr.microsoft.com/container-package-app:latest.

O comando Docker a seguir efetua pulls da imagem mais recente da ferramenta de empacotamento e também monta um diretório.

Supondo que ~\<path-to-content> seja um diretório contendo o conteúdo a ser empacotado, o seguinte comando docker é ~/<path-to-content> /data montado no contêiner. Substitua ~/<path-to-content> pela localização do seu próprio aplicativo.

docker pull mcr.microsoft.com/container-package-app:latest

docker run -it -v /var/run/docker.sock:/var/run/docker.sock -v ~/<path-to-content>:/data --entrypoint "/bin/bash" mcr.microsoft.com/container-package-app:latest 

Execute os seguintes comandos a seguir no shell container-package-app do contêiner. Substitua <registry-name> pelo nome do seu ACR:

export REGISTRY_NAME=<registry-name>

az login 

az acr login -n $REGISTRY_NAME 

cd /data/<path-to-content>

Para autenticar o ACR, há duas opções. Uma opção é usar az login como mostrado anteriormente, e a segunda opção é através do docker executando docker login 'yourACRname'.azurecr.io. Insira seu nome de usuário e senha (username deve ser seu nome ACR e a senha é a chave gerada fornecida no portal do Azure) e execute.

docker login <yourACRname.azurecr.io>

Captura de tela do comando docker login na CLI.

Em seguida, execute cpa verify para iterar pelos artefatos e validá-los um por um e resolver quaisquer falhas. Execute cpa buildbundle quando estiver pronto para empacotar e carregar o CNAB no Registro de Contêiner do Azure. O cpa buildbundle comando executa o processo de verificação, compila o pacote e carrega o pacote no Registro de Contêiner do Azure.

cpa verify

Captura de tela do comando cpa verify na CLI.

cpa buildbundle 

Observação

Use cpa buildbundle --force somente se você quiser substituir uma marca existente. Se você já anexou esse CNAB a uma oferta do Azure Marketplace, incremente a versão no arquivo de manifesto.

Integrar em um Pipeline do Azure

Para obter um exemplo de como integrar container-package-app em um Azure Pipeline, consulte o exemplo do Azure Pipeline

Solução de problemas