Självstudie: Paketera och distribuera containers som en Service Fabric-app med Yeoman
Den här självstudien är del två i en serie. I den här självstudien används ett verktyg för mallgenerering (Yeoman) för att skapa en Service Fabric-programdefinition. Programmet kan sedan användas för att distribuera containrar till Service Fabric. I den här självstudiekursen får du lära du dig att:
- Installera Yeoman
- Skapa ett programpaket med Yeoman
- Konfigurera inställningar i programpaketet för användning med containrar
- Skapa programmet
- Distribuera och köra programmet
- Rensa programmet
Förutsättningar
- De behållaravbildningar som överfördes till det Azure Container Registry som skapades i del 1 av denna självstudie används.
- Konfigurerad Linux-utvecklingsmiljö.
Installera Yeoman
Service Fabric tillhandahåller ramverktyg som hjälper dig att skapa program från terminalen med en Yeoman-mallgenerator. Följ stegen nedan för att se till att du har Yeoman-mallgeneratorn.
Installera nodejs och Node Upravljač za pakete på datorn. Om du använder macOS X måste du använda pakethanteraren Homebrew.
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash nvm install node
Installera Yeoman-mallgeneratorn på datorn från Node Upravljač za pakete:
npm install -g yo
Installera Service Fabric Yeoman-containergenerator
npm install -g generator-azuresfcontainer
Paketera en Docker-avbildningscontainer med Yeoman
Skapa ett Service Fabric-behållarprogram i mappen ”container-tutorial” i den klonade lagringsplatsen genom att köra följande kommando.
yo azuresfcontainer
Ange ”TestContainer” som namn på programmet
Ange ”azurevotefront” som namn på tillämpningstjänsten.
Ange containeravbildningssökvägen i ACR för klientdelsplatsen , till exempel "<acrName.azurecr.io/azure-vote-front:v1>". Fältet <acrName> måste vara detsamma som värdet som användes i föregående självstudie.
Tryck på Retur och lämna avsnittet Kommandon tomt.
Ange ett instansantal på 1.
Följande visar indata och utdata vid körning av yo-kommandot:
? 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
Om du vill lägga till en till containertjänst till ett program som redan har skapats med hjälp av Yeoman utför du följande steg:
- Byt katalog en nivå till TestContainer-katalogen, till exempel ./TestContainer
- Kör
yo azuresfcontainer:AddService
- Kalla tjänsten ”azurevoteback”
- Ange containeravbildningssökvägen för Redis – "redis:alpine"
- Tryck på Retur och lämna avsnittet Kommandon tomt
- Ange ett instansantal på ”1”.
De poster som används för att lägga till tjänsten visas:
? 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
Under resten av den här självstudien kommer vi att arbeta i katalogen TestContainer. Till exempel ./TestContainer/TestContainer. Katalogen ska innehålla följande.
$ ls
ApplicationManifest.xml azurevotefrontPkg azurevotebackPkg
Konfigurera applikationsmanifestet med autentiseringsuppgifter för Azure Container Registry
Service Fabric behöver autentiseringsuppgifter för att hämta behållaravbildningar från Azure Container Registry. Dessa anges i ApplicationManifest.xml.
Logga in på din ACR-instans. Använd kommandot az acr login till att slutföra åtgärden. Ange det unika namn du angav för containerregistret när det skapades.
az acr login --name <acrName>
Du får ett meddelande om att inloggningen lyckades när inloggningen är klar.
Kör sedan följande kommando för att hämta lösenordet för containerregistret. Lösenordet används av Service Fabric för att autentisera med ACR och hämta containeravbildningarna.
az acr credential show -n <acrName> --query passwords[0].value
I ApplicationManifest.xml lägger du till kodfragmentet under elementet ServiceManifestImport för klientdelstjänsten. Ange acrName i fältet Kontonamn och lösenordet från föregående kommando i fältet Lösenord. En fullständig ApplicationManifest.xml finns i slutet av det här dokumentet.
<Policies>
<ContainerHostPolicies CodePackageRef="Code">
<RepositoryCredentials AccountName="<acrName>" Password="<password>" PasswordEncrypted="false"/>
</ContainerHostPolicies>
</Policies>
Konfigurera kommunikation och portmappning mellan container och värd
Konfigurera kommunikationsporten
Konfigurera en HTTP-slutpunkt så att klienter kan kommunicera med din tjänst. Öppna filen ./TestContainer/azurevotefrontPkg/ServiceManifest.xml och deklarera en slutpunktsresurs i elementet ServiceManifest. Lägg till protokollet, porten och namnet. I den här självstudien lyssnar tjänsten på port 80. Följande kodfragment placeras under taggen ServiceManifest i resursen.
<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>
Modifiera på tjänstemanifestet på samma sätt för serverdeltjänsten. Öppna ./TestContainer/azurevotebackPkg/ServiceManifest.xml och deklarera en slutpunktsresurs i elementet ServiceManifest. För denna självstudiekurs behålls redis-standardvärdet på 6379. Följande kodfragment placeras under taggen ServiceManifest i resursen.
<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>
Genom att tillhandahålla UriScheme registreras automatiskt containerslutpunkten med namngivningstjänsten för Service Fabric för identifiering. En fullständig ServiceManifest.xml-exempelfil för serverdeltjänsten finns i slutet av den här artikeln.
Mappa containerportar till en tjänst
För att göra containrarna tillgängliga i klustret måste vi även skapa en portbindning i ”ApplicationManifest.xml”. Principen PortBinding använder de slutpunkter vi definierade i ServiceManifest.xml-filerna som referens. Inkommande begäranden till dessa slutpunkter mappas till de containerportar som öppnas och binds här. I ApplicationManifest.xml-filen lägger du till följande kod för att binda port 80 och 6379 till slutpunkterna. En fullständig ApplicationManifest.xml finns i slutet av det här dokumentet.
<ContainerHostPolicies CodePackageRef="Code">
<PortBinding ContainerPort="80" EndpointRef="azurevotefrontTypeEndpoint"/>
</ContainerHostPolicies>
<ContainerHostPolicies CodePackageRef="Code">
<PortBinding ContainerPort="6379" EndpointRef="azurevotebackTypeEndpoint"/>
</ContainerHostPolicies>
Lägg till ett DNS-namn till serverdelstjänsten
Service Fabric kan inte tilldela DNS-namnet till serverdelstjänsten om namnet inte anges i ApplicationManifest.xml. Lägg till attributet ServiceDnsName till elementet Service som visat:
<Service Name="azurevoteback" ServiceDnsName="redisbackend.testapp">
<StatelessService ServiceTypeName="azurevotebackType" InstanceCount="1">
<SingletonPartition/>
</StatelessService>
</Service>
Klientdelstjänsten läser en miljövariabel för att ta reda på Redis-instansens DNS-namn. Miljövariabeln är redan definierad i den Dockerfile som användes för att skapa Docker-avbildningen. Inga åtgärder krävs.
ENV REDIS redisbackend.testapp
Följande kodfragment visar hur Python-koden i klientdelen läser in miljövariabeln som beskrivs i Dockerfile. Inga åtgärder krävs.
# Get DNS Name
redis_server = os.environ['REDIS']
# Connect to the Redis store
r = redis.StrictRedis(host=redis_server, port=6379, db=0)
Mallen för ett tjänstepaketprogram är nu tillgänglig för distribuering till ett kluster. I följande självstudiekurs distribueras programmet och körs i ett Service Fabric-kluster.
Skapa ett Service Fabric-kluster
Om du vill distribuera programmet till Azure behöver du ett Service Fabric-kluster som kör programmet. Följande kommandon skapar ett kluster med fem noder i Azure. Kommandona skapar även ett självsignerat certifikat, lägger till det i ett nyckelvalv och laddar ned certifikatet lokalt som en PEM-fil. Det nya certifikatet används för att skydda klustret när distribueras och används för att autentisera klienter.
#!/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
Kommentar
Frontwebbtjänsten är konfigurerad för att lyssna efter inkommande trafik på port 80. Som standard är port 80 öppen på dina virtuella klusterdatorer och Azure-lastbalanseraren.
Mer information om hur du skapar ett eget kluster finns i Skapa ett Service Fabric-kluster i Azure.
Bygg och distribuera programmet till klustret
Du kan distribuera programmet till Azure-klustret med Service Fabric CLI. Om Service Fabric CLI inte är installerat på datorn följer du dessa anvisningar och installerar det.
Anslut till Service Fabric-klustret i Azure. Byt exempelslutpunkten mot din egen. Slutpunkten måste vara en fullständig webbadress som liknar den som visas nedan. PEM-filen är det självsignerade certifikat som skapades tidigare.
sfctl cluster select --endpoint https://containertestcluster.eastus.cloudapp.azure.com:19080 --pem containertestcluster22019013100.pem --no-verify
Använd installationsskriptet som medföljer i katalogen TestContainer för att kopiera programpaketet till klustrets avbildningsarkiv, registrera programtypen och skapa en instans av programmet.
./install.sh
Öppna en webbläsare och gå till Service Fabric Explorer på https://containertestcluster.eastus.cloudapp.azure.com:19080/Explorer. Expandera programnoden och observera att det finns en post för din programtyp och en för instansen.
För att ansluta till det program som körs öppnar du en webbläsare och går till kluster-URL:en – till exempel http://containertestcluster.eastus.cloudapp.azure.com:80. Röstningsprogrammet ska visas i webbläsaren.
Rensa
Använd avinstallationsskriptet som medföljer mallen för att ta bort programinstansen från klustret och avregistrera programtypen. Det tar lite tid att rensa instansen med det här kommandot. Kommandot ”install.sh” kan inte köras omedelbart efter det här skriptet.
./uninstall.sh
Exempel på manifest
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>
Front-end ServiceManifest.xml
<?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>
Redis ServiceManifest.xml
<?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>
Nästa steg
I den här självstudiekursen packades flera containrar in i ett Service Fabric-program med Yeoman. Programmet distribuerades sedan och kördes på ett Service Fabric-kluster. Följande steg har slutförts:
- Installera Yeoman
- Skapa ett programpaket med Yeoman
- Konfigurera inställningar i programpaketet för användning med containrar
- Skapa programmet
- Distribuera och köra programmet
- Rensa programmet
Gå vidare till nästa självstudie om du vill veta mer om redundansväxling och skalning av programmet i Service Fabric.