Compartilhar via


Tutorial: Empacotar e implantar contêineres como um aplicativo do Service Fabric usando Yeoman

Este tutorial é a parte dois de uma série. Neste tutorial, uma ferramenta geradora de modelos (Yeoman) é usada para gerar uma definição de aplicativo do Service Fabric. Este aplicativo pode ser usado para implantar contêineres no Service Fabric. Neste tutorial, você aprenderá a:

  • Instalar o Yeoman
  • Criar um pacote de aplicativos usando o Yeoman
  • Definir configurações no pacote de aplicativos para uso com contêineres
  • Compilar o aplicativo
  • Implantar e executar o aplicativo
  • Limpar o aplicativo

Prerequisites

  • As imagens de contêiner enviadas por push ao Registro de Contêiner do Azure criadas na Parte 1 desta série de tutoriais são usadas.
  • O ambiente de desenvolvimento do Linux está configurado.

Instalar o Yeoman

O Service Fabric fornece ferramentas de scaffolding para ajudar a criar aplicativos no terminal usando o gerador de modelos Yeoman. Siga as etapas abaixo para garantir que você tem o gerador de modelos Yeoman.

  1. Instale nodejs e Node Package Manager em seu computador. Se você usar o macOS X, precisará usar o gerenciador de pacotes Homebrew.

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
    nvm install node 
    
  2. Instale o gerador de modelos Yeoman em seu computador com base no Node Package Manager:

    npm install -g yo
    
  3. Instalar o gerador de contêineres Yeoman do Service Fabric

    npm install -g generator-azuresfcontainer
    

Empacotar um recipiente de imagem do Docker com o Yeoman

  1. Para criar um aplicativo de contêiner do Service Fabric, no diretório 'container-tutorial' do repositório clonado, execute o seguinte comando.

    yo azuresfcontainer
    
  2. Digite "TestContainer" para nomear seu aplicativo

  3. Digite "azurevotefront" para nomear o serviço de aplicativo.

  4. Forneça o caminho da imagem de contêiner no ACR para o repositório front-end – por exemplo, '<acrName>.azurecr.io/azure-vote-front:v1'. O campo <acrName> deve ser igual ao valor que foi usado no tutorial anterior.

  5. Pressione Enter para deixar a seção Comandos vazia.

  6. Especifique uma contagem de instâncias de "1".

O conteúdo a seguir mostra a entrada e a saída da execução do comando yo:

? Name your application TestContainer
? Name of the application service: azurevotefront
? Input the Image Name: <acrName>.azurecr.io/azure-vote-front:v1
? Commands:
? Number of instances of guest container application: 1
   create TestContainer/TestContainer/ApplicationManifest.xml
   create TestContainer/TestContainer/azurevotefrontPkg/ServiceManifest.xml
   create TestContainer/TestContainer/azurevotefrontPkg/config/Settings.xml
   create TestContainer/TestContainer/azurevotefrontPkg/code/Dummy.txt
   create TestContainer/install.sh
   create TestContainer/uninstall.sh

Para adicionar outro serviço de contêiner a um aplicativo já criado usando o Yeoman, execute as seguintes etapas:

  1. Altere o nível de um diretório para o diretório TestContainer, por exemplo, . / TestContainer
  2. Execute yo azuresfcontainer:AddService
  3. Chame o serviço de 'azurevoteback'
  4. Forneça o caminho da imagem de contêiner para Redis – 'redis:alpine'
  5. Pressione Enter para deixar a seção Comandos vazia
  6. Especifique a contagem de instâncias como "1".

As entradas para adicionar o serviço usado são todas mostradas:

? Name of the application service: azurevoteback
? Input the Image Name: redis:alpine
? Commands:
? Number of instances of guest container application: 1
   create TestContainer/azurevotebackPkg/ServiceManifest.xml
   create TestContainer/azurevotebackPkg/config/Settings.xml
   create TestContainer/azurevotebackPkg/code/Dummy.txt

Para o restante deste tutorial, estamos trabalhando no diretório TestContainer. Por exemplo, ./TestContainer/TestContainer. O conteúdo deste diretório deve ser da seguinte maneira.

$ ls
ApplicationManifest.xml azurevotefrontPkg azurevotebackPkg

Configurar o manifesto do aplicativo com as credenciais para o Registro de Contêiner do Azure

Para que o Service Fabric efetuar pull das imagens de contêiner do Registro de Contêiner do Azure, é necessário fornecer as credenciais no ApplicationManifest.xml.

Entre na instância do ACR. Use o comando az acr login para concluir a operação. Forneça o nome exclusivo fornecido para o Registro de contêiner quando ele foi criado.

az acr login --name <acrName>

O comando retorna uma mensagem de Logon bem-sucedido quando é concluído.

Em seguida, execute o seguinte comando para obter a senha do Registro de contêiner. Essa senha é usada pelo Service Fabric para autenticar-se com o ACR para efetuar pull das imagens de contêiner.

az acr credential show -n <acrName> --query passwords[0].value

No ApplicationManifest.xml, adicione o snippet de código no elemento ServiceManifestImport para o serviço de front-end. Insira seu acrName para o campo AccountName e a senha retornada do comando anterior é usada para o campo Senha. Um ApplicationManifest.xml completo é fornecido no final deste documento.

<Policies>
  <ContainerHostPolicies CodePackageRef="Code">
    <RepositoryCredentials AccountName="<acrName>" Password="<password>" PasswordEncrypted="false"/>
  </ContainerHostPolicies>
</Policies>

Configurar o mapeamento de porta para porta do host de comunicação e do contêiner

Configurar a porta de comunicação

Configure um ponto de extremidade HTTP para que os clientes possam se comunicar com o serviço. Abra o arquivo ./TestContainer/azurevotefrontPkg/ServiceManifest.xml e declare um recurso de ponto de extremidade no elemento ServiceManifest. Adicione protocolo, porta e nome. Para este tutorial, o serviço escuta na porta 80. O snippet a seguir está sob a marca ServiceManifest no recurso.

<Resources>
  <Endpoints>
    <!-- This endpoint is used by the communication listener to obtain the port on which to 
            listen. Please note that if your service is partitioned, this port is shared with 
            replicas of different partitions that are placed in your code. -->
    <Endpoint Name="azurevotefrontTypeEndpoint" UriScheme="http" Port="80" Protocol="http"/>
  </Endpoints>
</Resources>

Da mesma forma, modifique o Manifesto do serviço para o serviço de back-end. Abra o ./TestContainer/azurevotebackPkg/ServiceManifest.xml e declare um recurso de ponto de extremidade no elemento ServiceManifest. Para este tutorial, o padrão de redis de 6379 é mantido. O snippet a seguir está sob a marca ServiceManifest no recurso.

<Resources>
  <Endpoints>
    <!-- This endpoint is used by the communication listener to obtain the port on which to 
            listen. Please note that if your service is partitioned, this port is shared with 
            replicas of different partitions that are placed in your code. -->
    <Endpoint Name="azurevotebackTypeEndpoint" Port="6379" Protocol="tcp"/>
  </Endpoints>
</Resources>

Ao fornecer o UriScheme, o ponto de extremidade do contêiner é registrado automaticamente no serviço de nomenclatura do Service Fabric para capacidade de descoberta. Um arquivo de exemplo ServiceManifest.xml completo para o serviço de back-end é fornecido no final deste artigo como um exemplo.

Mapear portas de contêiner para um serviço

Para expor os contêineres no cluster, também é necessário criar uma associação de porta no 'ApplicationManifest.xml'. A política PortBinding referencia os Pontos de extremidade definidos nos arquivos ServiceManifest.xml. Solicitações de entrada para esses pontos de extremidade são mapeadas para as portas de contêiner abertas e limitadas aqui. No arquivo ApplicationManifest.xml, adicione o código a seguir para associar a porta 80 e 6379 aos pontos de extremidade. Um ApplicationManifest.xml completo está disponível no final deste documento.

<ContainerHostPolicies CodePackageRef="Code">
    <PortBinding ContainerPort="80" EndpointRef="azurevotefrontTypeEndpoint"/>
</ContainerHostPolicies>
<ContainerHostPolicies CodePackageRef="Code">
    <PortBinding ContainerPort="6379" EndpointRef="azurevotebackTypeEndpoint"/>
</ContainerHostPolicies>

Adicionar um nome DNS para o serviço de back-end

Para o Service Fabric atribuir esse nome DNS ao serviço de back-end, o nome precisa ser especificado no ApplicationManifest.xml. Adicione o atributo ServiceDnsName ao elemento Serviço conforme mostrado:

<Service Name="azurevoteback" ServiceDnsName="redisbackend.testapp">
  <StatelessService ServiceTypeName="azurevotebackType" InstanceCount="1">
    <SingletonPartition/>
  </StatelessService>
</Service>

O serviço de front-end lê uma variável de ambiente para saber o nome DNS da instância do Redis. Essa variável de ambiente já está definida no Dockerfile que foi usado para gerar a imagem do Docker e nenhuma ação precisa ser tomada aqui.

ENV REDIS redisbackend.testapp

O snippet de código a seguir ilustra como o código Python front-end seleciona a variável de ambiente descrita no Dockerfile. Nenhuma ação precisa ser tomada aqui.

# Get DNS Name
redis_server = os.environ['REDIS']

# Connect to the Redis store
r = redis.StrictRedis(host=redis_server, port=6379, db=0)

Neste ponto no tutorial, o modelo para um aplicativo de Pacote de serviços está disponível para implantação em um cluster. No tutorial subsequente, esse aplicativo será implantado e executado em um cluster do Service Fabric.

Criar um cluster do Service Fabric

Para implantar o aplicativo no Azure, é necessário que um cluster do Service Fabric execute o aplicativo. Os comandos a seguir criam um cluster de cinco nós no Azure. Os comandos também criam um certificado autoassinado, adicionam-no a um cofre de chaves e baixam o certificado localmente como um arquivo PEM. O novo certificado é usado para proteger o cluster quando ele é implantado e é usado para autenticar clientes.

#!/bin/bash

# Variables
ResourceGroupName="containertestcluster" 
ClusterName="containertestcluster" 
Location="eastus" 
Password="q6D7nN%6ck@6" 
Subject="containertestcluster.eastus.cloudapp.azure.com" 
VaultName="containertestvault" 
VmPassword="Mypa$$word!321"
VmUserName="sfadminuser"

# Login to Azure and set the subscription
az login

az account set --subscription <mySubscriptionID>

# Create resource group
az group create --name $ResourceGroupName --location $Location 

# Create secure five node Linux cluster. Creates a key vault in a resource group
# and creates a certficate in the key vault. The certificate's subject name must match 
# the domain that you use to access the Service Fabric cluster.  
# The certificate is downloaded locally as a PEM file.
az sf cluster create --resource-group $ResourceGroupName --location $Location \ 
--certificate-output-folder . --certificate-password $Password --certificate-subject-name $Subject \ 
--cluster-name $ClusterName --cluster-size 5 --os UbuntuServer1804 --vault-name $VaultName \ 
--vault-resource-group $ResourceGroupName --vm-password $VmPassword --vm-user-name $VmUserName

Observação

O serviço de front-end da Web está configurado para escutar o tráfego de entrada na porta 80. Por padrão, a porta 80 está aberta no seu cluster de VMs e no Azure Load Balancer.

Para obter mais informações sobre como criar seu próprio cluster, consulte Criar um cluster do Service Fabric no Azure.

Criar e implantar o aplicativo no cluster

É possível implantar o aplicativo no cluster do Azure usando a CLI do Service Fabric. Se a CLI do Service Fabric não estiver instalada em seu computador, siga as instruções aqui para instalá-la.

Conectar-se ao cluster do Service Fabric no Azure. Substitua o ponto de extremidade de exemplo pelos seus próprios. O ponto de extremidade deve ser uma URL completa semelhante à mostrada abaixo. O arquivo PEM é o certificado autoassinado anteriormente.

sfctl cluster select --endpoint https://containertestcluster.eastus.cloudapp.azure.com:19080 --pem containertestcluster22019013100.pem --no-verify

Use o script de instalação fornecido no diretório TestContainer para copiar o pacote de aplicativos para o repositório de imagens do cluster, registrar o tipo de aplicativo e criar uma instância do aplicativo.

./install.sh

Abra um navegador e navegue até o Service Fabric Explorer em https://containertestcluster.eastus.cloudapp.azure.com:19080/Explorer. Expanda o nó Aplicativos e observe que há uma entrada para o seu tipo de aplicativo e outra para a instância.

Service Fabric Explorer

Para se conectar ao aplicativo em execução, abra um navegador da Web e acesse a URL do cluster – por exemplo, http://containertestcluster.eastus.cloudapp.azure.com:80. Você deve ver o aplicativo de votação na interface do usuário da Web.

A captura de tela mostra o aplicativo Azure Voting com os botões Gatos, Cachorros, Redefinir e Totais.

Limpeza

Use o script de desinstalação fornecido com o modelo para excluir a instância do aplicativo no cluster e cancelar o registro do tipo de aplicativo. Esse comando leva algum tempo para limpar a instância e o comando 'install.sh' não pode ser executado imediatamente após esse script.

./uninstall.sh

Exemplos de manifestos concluídos

ApplicationManifest.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ApplicationManifest ApplicationTypeName="TestContainerType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="azurevotefrontPkg" ServiceManifestVersion="1.0.0"/>
    <Policies>
    <ContainerHostPolicies CodePackageRef="Code">
        <RepositoryCredentials AccountName="myaccountname" Password="<password>" PasswordEncrypted="false"/>
        <PortBinding ContainerPort="80" EndpointRef="azurevotefrontTypeEndpoint"/>
    </ContainerHostPolicies>
        </Policies>
  </ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="azurevotebackPkg" ServiceManifestVersion="1.0.0"/>
      <Policies>
        <ContainerHostPolicies CodePackageRef="Code">
          <PortBinding ContainerPort="6379" EndpointRef="azurevotebackTypeEndpoint"/>
        </ContainerHostPolicies>
      </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="azurevotefront">
      <StatelessService ServiceTypeName="azurevotefrontType" InstanceCount="1">
        <SingletonPartition/>
      </StatelessService>
    </Service>
    <Service Name="azurevoteback" ServiceDnsName="redisbackend.testapp">
      <StatelessService ServiceTypeName="azurevotebackType" InstanceCount="1">
        <SingletonPartition/>
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

ServiceManifest.xml de front-end

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="azurevotefrontPkg" Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" >

   <ServiceTypes>
      <StatelessServiceType ServiceTypeName="azurevotefrontType" UseImplicitHost="true">
   </StatelessServiceType>
   </ServiceTypes>

   <CodePackage Name="code" Version="1.0.0">
      <EntryPoint>
         <ContainerHost>
            <ImageName>acrName.azurecr.io/azure-vote-front:v1</ImageName>
            <Commands></Commands>
         </ContainerHost>
      </EntryPoint>
      <EnvironmentVariables>
      </EnvironmentVariables>
   </CodePackage>

  <Resources>
    <Endpoints>
      <!-- This endpoint is used by the communication listener to obtain the port on which to 
           listen. Please note that if your service is partitioned, this port is shared with 
           replicas of different partitions that are placed in your code. -->
      <Endpoint Name="azurevotefrontTypeEndpoint" UriScheme="http" Port="80" Protocol="http"/>
    </Endpoints>
  </Resources>

 </ServiceManifest>

ServiceManifest.xml do Redis

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="azurevotebackPkg" Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" >

   <ServiceTypes>
      <StatelessServiceType ServiceTypeName="azurevotebackType" UseImplicitHost="true">
   </StatelessServiceType>
   </ServiceTypes>

   <CodePackage Name="code" Version="1.0.0">
      <EntryPoint>
         <ContainerHost>
            <Commands></Commands>
         </ContainerHost>
      </EntryPoint>
      <EnvironmentVariables>
      </EnvironmentVariables>
   </CodePackage>
     <Resources>
    <Endpoints>
      <!-- This endpoint is used by the communication listener to obtain the port on which to 
           listen. Please note that if your service is partitioned, this port is shared with 
           replicas of different partitions that are placed in your code. -->
      <Endpoint Name="azurevotebackTypeEndpoint" Port="6379" Protocol="tcp"/>
    </Endpoints>
  </Resources>
 </ServiceManifest>

Próximas etapas

Neste tutorial, vários contêineres foram empacotados em um aplicativo do Service Fabric usando o Yeoman. Este aplicativo foi implantado e executado em um cluster do Service Fabric. As etapas a seguir foram concluídas:

  • Instalar o Yeoman
  • Criar um pacote de aplicativos usando o Yeoman
  • Definir configurações no pacote de aplicativos para uso com contêineres
  • Compilar o aplicativo
  • Implantar e executar o aplicativo
  • Limpar o aplicativo

Passe para o próximo tutorial para saber mais sobre o failover e o dimensionamento do aplicativo no Service Fabric.