Share via


Tutorial: Compactar e implementar contentores como uma aplicação do Service Fabric com o Yeoman

Este tutorial é a segunda parte de uma série. Neste tutorial, é utilizada uma ferramenta de gerador de modelos (Yeoman) para gerar uma definição de aplicação do Service Fabric. Esta aplicação pode, depois, ser utilizada para implementar contentores no Service Fabric. Neste tutorial, ficará a saber como:

  • Instalar o Yeoman
  • Criar um pacote de aplicação com o Yeoman
  • Configurar as definições no pacote da aplicação para utilização com contentores
  • Criar a aplicação
  • Implementar e executar a aplicação
  • Limpar a aplicação

Pré-requisitos

  • Vão ser utilizadas as imagens de contentor enviadas para o Azure Container Registry que foram criadas na Parte 1 desta série de tutoriais.
  • Vai ser configurado o ambiente de desenvolvimento do Linux.

Instalar o Yeoman

O Service Fabric proporciona ferramentas estruturais que ajudam a criar aplicações a partir do terminal com o gerador de modelos Yeoman. Siga os passos abaixo para confirmar que tem o gerador de modelos Yeoman.

  1. Instale nodejs e Node Package Manager no seu computador. Se utilizar o macOS X, terá de utilizar o gestor 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 no seu computador a partir do Node Package Manager:

    npm install -g yo
    
  3. Instalar o gerador de contentores Yeoman do Service Fabric

    npm install -g generator-azuresfcontainer
    

Empacotar um contentor de imagens do Docker com o Yeoman

  1. Para criar uma aplicação de contentor do Service Fabric, no diretório “container-tutorial” do repositório clonado, execute o comando seguinte.

    yo azuresfcontainer
    
  2. Escreva "TestContainer" para dar um nome à aplicação

  3. Escreva "azurevotefront" para dar um nome ao serviço de aplicação.

  4. Indique o caminho da imagem de contentor no ACR para o repositório de front-end, por exemplo "acrName.azurecr.io/azure-vote-front:v1<>". O <campo acrName> tem de ser o mesmo que o valor utilizado no tutorial anterior.

  5. Prima Enter para deixar a secção Comandos vazia.

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

A imagem seguinte 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 contentores a uma aplicação já criada com o Yeoman, execute os seguintes passos:

  1. Altere o diretório um nível para o diretório TestContainer, como, por exemplo, ./TestContainer
  2. Executar yo azuresfcontainer:AddService
  3. Dê ao serviço o nome “azurevoteback”
  4. Indique o caminho da imagem do contentor para Redis – "redis:alpine"
  5. Prima Enter para deixar a secção Comandos vazia
  6. Especifique uma contagem de instâncias de "1".

São apresentadas todas as entradas para adicionar o serviço utilizado:

? 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

Ao longo do resto do tutorial, vamos trabalhar no diretório TestContainer. Por exemplo, ./TestContainer/TestContainer. O conteúdo deste diretório deve ser o seguinte.

$ ls
ApplicationManifest.xml azurevotefrontPkg azurevotebackPkg

Configurar o manifesto da aplicação com credenciais para o Azure Container Registry

Para que o Service Fabric extraia as imagens de contentores do Azure Container Registry, temos de indicar as credenciais em ApplicationManifest.xml.

Inicie sessão na sua instância do ACR. Utilize o comando az acr login para concluir a operação. Forneça o nome exclusivo dado ao registo de contentor quando este foi criado.

az acr login --name <acrName>

O comando devolve uma mensagem Início de Sessão Com Êxito depois de concluída.

Em seguida, execute o comando seguinte para obter a palavra-passe do seu registo de contentor. O Service Fabric utiliza esta palavra-passe para se autenticar no ACR e extrair as imagens de contentores.

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

Em ApplicationManifest.xml, adicione o fragmento de código no elemento ServiceManifestImport do serviço de front-end. Insira o acrName no campo AccountName e a palavra-passe devolvida com o comando anterior é utilizada no campo Password. É disponibilizado um ApplicationManifest.xml completo na parte final deste documento.

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

Configurar a comunicação e o mapeamento de portas de porta para anfitrião do contentor

Configurar a porta da comunicação

Configure um ponto final de HTTP de modo a que os clientes possam comunicar com o seu serviço. Abra o ficheiro ./TestContainer/azurevotefrontPkg/ServiceManifest.xml e declare um recurso de ponto final no elemento ServiceManifest. Adicione o protocolo, a porta e o nome. Neste tutorial, o serviço escuta na porta 80. O fragmento seguinte é colocado na etiqueta ServiceManifest do 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 do serviço de back-end. Abra ./TestContainer/azurevotebackPkg/ServiceManifest.xml e declare um recurso de ponto final no elemento ServiceManifest. Neste tutorial, a predefinição de redis 6379 é mantida. O fragmento seguinte é colocado na etiqueta ServiceManifest do 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>

Indicar UriScheme regista automaticamente o ponto final do contentor no serviço Nomenclatura do Service Fabric para deteção. É disponibilizado um ficheiro de exemplo completo ServiceManifest.xml do serviço de back-end na parte final deste artigo.

Mapear portas de contentores para um serviço

Para expor os contentores no cluster, também temos de criar um enlace de porta em “ApplicationManifest.xml”. A política PortBinding referencia os Pontos finais que definimos nos ficheiros ServiceManifest.xml. Os pedidos recebidos para estes pontos finais são mapeados para as portas dos contentores que estão abertas e vinculadas aqui. No ficheiro ApplicationManifest.xml, adicione o seguinte código para vincular as portas 80 e 6379 aos pontos finais. É disponibilizado um ApplicationManifest.xml completo na parte 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 ao serviço de back-end

Para que o Service Fabric atribua este nome DNS ao serviço de back-end, o nome tem de ser especificado em ApplicationManifest.xml. Adicione o atributo ServiceDnsName ao elemento Service, 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. Esta variável de ambiente já está definida no Dockerfile que foi utilizado para gerar a imagem do Docker e não é necessário realizar qualquer ação aqui.

ENV REDIS redisbackend.testapp

O fragmento de código seguinte ilustra de que forma é que o código Python do front-end escolhe a variável de ambiente descrita no Dockerfile. Não é necessário realizar nenhuma ação aqui.

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

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

Nesta fase do tutorial, o modelo de uma aplicação Service Package está disponível para implementação num cluster. No tutorial subsequente, esta aplicação é implementada e executada num cluster do Service Fabric.

Criar um cluster do Service Fabric

Para implementar a aplicação no Azure, precisa de um cluster do Service Fabric para executar a aplicação. Os seguintes comandos 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 transferem o certificado localmente como um ficheiro PEM. O novo certificado é utilizado para proteger o cluster quando é implementado e é utilizado 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

Nota

O serviço de front-end da Web está configurado para escutar tráfego de entrada na porta 80. Por predefinição, a porta 80 está aberta nas VMs do cluster e no balanceador de carga do Azure.

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

Criar e implementar a aplicação no cluster

Pode implementar a aplicação no cluster do Azure com a CLI do Service Fabric. Se a CLI do Service Fabric não estiver instalada no seu computador, siga estas instruções para instalá-la.

Ligue ao cluster do Service Fabric no Azure. Substitua o ponto final do exemplo pelo seu próprio. O ponto final tem de ser um URL completo semelhante ao seguinte. O ficheiro PEM é o certificado autoassinado que foi criado anteriormente.

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

Utilize o script de instalação disponibilizado no diretório TestContainer para copiar o pacote de aplicação para o arquivo de imagens do cluster, registar o tipo de aplicação e criar uma instância da mesma.

./install.sh

Abra um browser e navegue para Service Fabric Explorer emhttps://containertestcluster.eastus.cloudapp.azure.com:19080/Explorer. Expanda o nó Aplicações e repare que há uma entrada para o tipo de aplicação e outra para a instância.

Service Fabric Explorer

Para ligar à aplicação em execução, abra um browser e aceda ao URL do cluster, por exemplo http://containertestcluster.eastus.cloudapp.azure.com:80. Deverá ver a aplicação Voting na IU da Web.

Captura de ecrã a mostrar a Aplicação de Voto do Azure com botões para Gatos, Cães e Repor e totais.

Limpeza

Utilize o script de desinstalação fornecido no modelo para eliminar a instância da aplicação do cluster local e anular o registo do tipo de aplicação. Este comando demora algum tempo a limpar a instância e o comando “install'sh” não pode ser executado imediatamente a seguir a este 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 do 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>

Passos seguintes

Neste tutorial, foram agrupados vários contentores numa aplicação do Service Fabric com o Yeoman. Depois, a aplicação foi implementada e executada num cluster do Service Fabric. Foram efetuados os seguintes passos:

  • Instalar o Yeoman
  • Criar um pacote de aplicação com o Yeoman
  • Configurar as definições no pacote da aplicação para utilização com contentores
  • Criar a aplicação
  • Implementar e executar a aplicação
  • Limpar a aplicação

Avance para o próximo tutorial para saber mais sobre a ativação pós-falha e o dimensionamento da aplicação no Service Fabric.