Colocar o Service Fabric Reliable Services e o Reliable Actors em contentores no Windows

O Service Fabric suporta a contentorização de microsserviços do Service Fabric (Reliable Services e serviços baseados no Reliable Actor). Para obter mais informações, veja Contentores do service fabric.

Este documento fornece orientações para que o seu serviço seja executado dentro de um contentor do Windows.

Nota

Atualmente, esta funcionalidade só funciona para o Windows. Para executar contentores, o cluster tem de estar em execução no Windows Server 2016 com Contentores.

Passos para contentorizar a Aplicação do Service Fabric

  1. Abra a sua aplicação do Service Fabric no Visual Studio.

  2. Adicione a classe SFBinaryLoader.cs ao projeto. O código nesta classe é um programa auxiliar para carregar corretamente os binários de runtime do Service Fabric dentro da sua aplicação ao executar dentro de um contentor.

  3. Para cada pacote de código que pretende colocar em contentor, inicialize o carregador no ponto de entrada do programa. Adicione o construtor estático apresentado no seguinte fragmento de código ao ficheiro de ponto de entrada do programa.

    namespace MyApplication
    {
       internal static class Program
       {
           static Program()
           {
               SFBinaryLoader.Initialize();
           }
    
           /// <summary>
           /// This is the entry point of the service host process.
           /// </summary>
           private static void Main()
           {
    
  4. Crie e empacote o seu projeto. Para criar e criar um pacote, clique com o botão direito do rato no projeto de aplicação no Explorador de Soluções e selecione o comando Pacote.

  5. Para cada pacote de código que precisa de contentorizar, execute o script do PowerShell CreateDockerPackage.ps1. A utilização é a seguinte:

    .NET Completo

      $codePackagePath = 'Path to the code package to containerize.'
      $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.'
      $applicationExeName = 'Name of the Code package executable.'
      CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -ApplicationExeName $applicationExeName
    

    .NET Core

      $codePackagePath = 'Path to the code package to containerize.'
      $dockerPackageOutputDirectoryPath = 'Output path for the generated docker folder.'
      $dotnetCoreDllName = 'Name of the Code package dotnet Core Dll.'
      CreateDockerPackage.ps1 -CodePackageDirectoryPath $codePackagePath -DockerPackageOutputDirectoryPath $dockerPackageOutputDirectoryPath -DotnetCoreDllName $dotnetCoreDllName
    

    O script cria uma pasta com artefactos do Docker em $dockerPackageOutputDirectoryPath. Modifique o Dockerfile gerado para expose quaisquer portas, execute scripts de configuração, etc. com base nas suas necessidades.

  6. Em seguida, tem de criar e emitir o pacote de contentor do Docker para o seu repositório.

  7. Modifique o ApplicationManifest.xml e ServiceManifest.xml para adicionar a imagem de contentor, as informações do repositório, a autenticação do registo e o mapeamento porta a anfitrião. Para modificar os manifestos, veja Criar uma aplicação de contentor do Azure Service Fabric. A definição do pacote de código no manifesto do serviço tem de ser substituída pela imagem de contentor correspondente. Certifique-se de que altera o EntryPoint para um tipo containerHost.

    <!-- Code package is your service executable. -->
    <CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
     <!-- Follow this link for more information about deploying Windows containers to Service Fabric: https://aka.ms/sfguestcontainers -->
     <ContainerHost>
       <ImageName>myregistry.azurecr.io/samples/helloworldapp</ImageName>
     </ContainerHost>
    </EntryPoint>
    <!-- Pass environment variables to your container: -->
    </CodePackage>
    
  8. Adicione o mapeamento porta a anfitrião para o seu replicador e ponto final de serviço. Uma vez que ambas as portas são atribuídas no runtime pelo Service Fabric, o ContainerPort está definido como zero para utilizar a porta atribuída para mapeamento.

    <Policies>
    <ContainerHostPolicies CodePackageRef="Code">
     <PortBinding ContainerPort="0" EndpointRef="ServiceEndpoint"/>
     <PortBinding ContainerPort="0" EndpointRef="ReplicatorEndpoint"/>
    </ContainerHostPolicies>
    </Policies>
    
  9. Para configurar o modo de isolamento do contentor, veja Configurar o modo de isolamento. O Windows suporta dois modos de isolamento para contentores: processo e Hyper-V. Os fragmentos seguintes mostram como o modo de isolamento é especificado no ficheiro de manifesto da aplicação.

    <Policies>
    <ContainerHostPolicies CodePackageRef="Code" Isolation="process">
    ...
    </ContainerHostPolicies>
    </Policies>
    
    <Policies>
    <ContainerHostPolicies CodePackageRef="Code" Isolation="hyperv">
    ...
    </ContainerHostPolicies>
    </Policies>
    

Nota

Um cluster do Service Fabric é um inquilino único por predefinição e as aplicações alojadas são consideradas fidedignas. Se estiver a considerar alojar aplicações de contentor não fidedignos, considere implementá-las como contentores convidados e veja Alojar aplicações não fidedignos num cluster do Service Fabric.

  1. Para testar esta aplicação, tem de implementá-la num cluster com a versão 5.7 ou superior. Para as versões de runtime 6.1 ou inferiores, tem de editar e atualizar as definições do cluster para ativar esta funcionalidade de pré-visualização. Siga os passos neste artigo para adicionar a definição apresentada a seguir.

      {
        "name": "Hosting",
        "parameters": [
          {
            "name": "FabricContainerAppsEnabled",
            "value": "true"
          }
        ]
      }
    
  2. Em seguida, implemente o pacote de aplicação editado neste cluster.

Agora, deverá ter uma aplicação do Service Fabric em contentores a executar o cluster.

Passos seguintes