Bagikan melalui


Mengemas dan menyebarkan kontainer sebagai aplikasi Service Fabric menggunakan Yeoman

Tutorial ini adalah bagian kedua dari seri tutorial. Dalam tutorial ini, alat generator templat (Yeoman) digunakan untuk menghasilkan definisi aplikasi Service Fabric. Aplikasi ini kemudian dapat digunakan untuk menyebarkan kontainer ke Service Fabric. Dalam tutorial ini, Anda akan belajar cara:

  • Pasang Yeoman
  • Membuat paket aplikasi menggunakan Yeoman
  • Mengonfigurasi pengaturan dalam paket aplikasi untuk digunakan dengan kontainer
  • Membangun aplikasi
  • Menyebarkan dan menjalankan aplikasi
  • Membersihkan aplikasi

Prasyarat

  • Gambar kontainer yang didorong ke Azure Container Registry yang dibuat di Bagian 1 dari seri tutorial ini digunakan.
  • Lingkungan pengembangan Linux disiapkan.

Pasang Yeoman

Service Fabric menyediakan alat perancah untuk membantu membuat aplikasi dari terminal menggunakan generator templat Yeoman. Ikuti langkah-langkah di bawah ini untuk memastikan Anda memiliki generator templat Yeoman.

  1. Instal nodejs dan Node Package Manager di mesin Anda. Jika Anda menggunakan macOS X, Anda harus menggunakan manajer paket Homebrew.

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash
    nvm install node 
    
  2. Instal generator templat Yeoman di mesin Anda dari Node Manajer Paket:

    npm install -g yo
    
  3. Pasang generator kontainer Service Fabric Yeoman

    npm install -g generator-azuresfcontainer
    

Mengemas kontainer gambar Docker dengan Yeoman

  1. Untuk membuat aplikasi kontainer Service Fabric, di direktori 'tutorial-kontainer' dari repositori kloning, jalankan perintah berikut.

    yo azuresfcontainer
    
  2. Harap ketik "TestContainer" untuk menamai aplikasi Anda

  3. Harap ketik "azurevotefront" untuk memberi nama layanan aplikasi Anda.

  4. Sediakan jalur gambar kontainer di ACR untuk repo frontend - misalnya '<acrName>.azurecr.io/azure-vote-front:v1'. Bidang <acrName> harus sama dengan nilai yang digunakan dalam tutorial sebelumnya.

  5. Tekan Enter untuk membiarkan bagian Perintah kosong.

  6. Tentukan jumlah instans 1.

Berikut ini menunjukkan input dan output menjalankan perintah 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

Untuk menambahkan layanan kontainer lain ke aplikasi yang sudah dibuat menggunakan Yeoman, lakukan langkah-langkah berikut:

  1. Ubah direktori satu tingkat ke direktori TestContainer, misalnya, ./TestContainer
  2. Jalankan yo azuresfcontainer:AddService
  3. Beri nama layanan 'azurevoteback'
  4. Menyediakan jalur gambar kontainer untuk Redis - 'redis:alpine'
  5. Tekan Enter untuk membiarkan bagian Perintah kosong.
  6. Tentukan jumlah instans "1".

Entri untuk menambahkan layanan yang digunakan semuanya diperlihatkan:

? 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

Untuk sisa tutorial ini, kami bekerja di direktori TestContainer. Misalnya, ./TestContainer/TestContainer. Isi direktori ini harus sebagai berikut.

$ ls
ApplicationManifest.xml azurevotefrontPkg azurevotebackPkg

Mengonfigurasi manifes aplikasi dengan kredensial untuk Azure Container Registry

Untuk Service Fabric untuk menarik gambar kontainer dari Azure Container Registry, kita perlu memberikan kredensial di ApplicationManifest.xml.

Masuk ke instans ACR Anda. Gunakan perintah masuk acr az untuk menyelesaikan operasi. Berikan nama unik yang diberikan ke registri kontainer ketika dibuat.

az acr login --name <acrName>

Perintah mengembalikan pesan Masuk Berhasil setelah selesai.

Selanjutnya, jalankan perintah berikut untuk mendapatkan kata sandi registri kontainer Anda. Kata sandi ini digunakan oleh Service Fabric untuk mengautentikasi dengan ACR untuk menarik gambar kontainer.

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

Di ApplicationManifest.xml, tambahkan cuplikan kode di bawah elemen ServiceManifestImport untuk layanan front end. Sisipkan acrName Anda untuk bidang AccountName dan kata sandi yang dikembalikan dari perintah sebelumnya digunakan untuk bidang Kata sandi. ApplicationManifest.xml yang lengkap disediakan di akhir dokumen ini.

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

Mengonfigurasi komunikasi dan pemetaan port port-ke-host kontainer

Mengonfigurasi port komunikasi

Konfigurasikan titik akhir HTTP sehingga klien dapat berkomunikasi dengan layanan Anda. Buka file ./TestContainer/azurevotefrontPkg/ServiceManifest.xml dan nyatakan sumber daya titik akhir di elemen ServiceManifest. Tambahkan protokol, port, dan nama. Untuk tutorial ini, layanan mendengarkan di port 80. Cuplikan berikut ditempatkan di bawah tag ServiceManifest di sumber daya.

<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>

Demikian pula, modifikasi Manifes Layanan untuk layanan backend. Buka ./TestContainer/azurevotebackPkg/ServiceManifest.xml dan nyatakan sumber daya titik akhir di elemen ServiceManifest. Untuk tutorial ini, default redis 6379 dipertahankan. Cuplikan berikut ditempatkan di bawah tag ServiceManifest di sumber daya.

<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>

Menyediakan UriScheme secara otomatis mendaftarkan titik akhir kontainer dengan layanan Penamaan Service Fabric agar dapat ditemukan. File contoh ServiceManifest.xml lengkap untuk layanan backend disediakan di akhir artikel ini sebagai contoh.

Memetakan port kontainer ke layanan

Untuk mengekspos kontainer dalam kluster, kita juga perlu membuat port pengikatan di 'ApplicationManifest.xml'. Kebijakan PortBinding mereferensikan Titik akhir yang kami tentukan di file ServiceManifest.xml. Permintaan masuk ke titik akhir ini dipetakan ke port kontainer yang dibuka dan dibatasi di sini. Dalam file ApplicationManifest.xml, tambahkan kode berikut ke port ikat 80 dan 6379 ke titik akhir. ApplicationManifest.xml yang lengkap terisedia di akhir dokumen ini.

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

Menambahkan nama DNS ke layanan backend

Untuk Service Fabric untuk menetapkan nama DNS ini ke layanan backend, nama perlu ditentukan dalam ApplicationManifest.xml. Tambahkan atribut ServiceDnsName ke elemen Layanan seperti yang ditunjukkan:

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

Layanan frontend membaca variabel lingkungan untuk mengetahui nama DNS instans Redis. Variabel lingkungan ini sudah didefinisikan dalam Dockerfile yang digunakan untuk menghasilkan gambar Docker dan tidak ada tindakan yang perlu diambil di sini.

ENV REDIS redisbackend.testapp

Cuplikan kode berikut menggambarkan bagaimana kode Python front-end mengambil variabel lingkungan yang dijelaskan di Dockerfile. Tidak ada tindakan yang perlu diambil di sini.

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

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

Pada titik ini dalam tutorial, templat untuk aplikasi Paket Layanan tersedia untuk penyebaran ke kluster. Dalam tutorial berikutnya, aplikasi ini disebarkan dan dijalankan dalam kluster Service Fabric.

Membuat kluster Service Fabric

Untuk menyebarkan aplikasi ke Azure, Anda perlu kluster Service Fabric untuk menjalankan aplikasi. Perintah berikut membuat kluster lima simpul di Azure. Perintah itu juga membuat sertifikat yang ditandatangani sendiri, menambahkannya ke brankas kunci, dan mengunduh sertifikat secara lokal sebagai file PEM. Sertifikat baru digunakan untuk mengamankan kluster saat disebarkan dan digunakan untuk mengautentikasi klien.

#!/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

Catatan

Layanan front end web dikonfigurasi untuk merespons pada port 80 untuk lalu lintas masuk. Secara default, port 80 terbuka di VM kluster Anda dan Azure load balancer.

Untuk informasi selengkapnya tentang membuat kluster Anda sendiri, lihat Membuat kluster Service Fabric di Azure.

Membangun dan menyebarkan aplikasi ke kluster

Anda dapat menggunakan aplikasi kluster Azure menggunakan CLI Service Fabric. Jika CLI Service Fabric tidak dipasang pada mesin Anda, ikuti instruksi di sini untuk memasangnya.

Menyambungkan kluster Service Fabric di Azure. Ganti titik akhir sampel dengan titik akhir Anda sendiri. Titik akhir harus url lengkap yang mirip dengan url di bawah ini. Berkas PEM adalah sertifikat yang ditandatangani sendiri yang sebelumnya dibuat.

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

Gunakan skrip pasang yang disediakan di direktori TestContainer untuk menyalin paket aplikasi ke penyimpanan gambar kluster, mendaftarkan jenis aplikasi, dan membuat contoh aplikasi.

./install.sh

Buka browser dan navigasikan ke Service Fabric Explorer dihttps://containertestcluster.eastus.cloudapp.azure.com:19080/Explorer. Perluas node Aplikasi dan catat bahwa ada entri untuk jenis aplikasi Anda dan yang lain untuk instans.

Explorer Service Fabric

Untuk menyambungkan ke aplikasi yang berjalan, buka browser web dan masuk ke url kluster - misalnya http://containertestcluster.eastus.cloudapp.azure.com:80. Anda harus melihat aplikasi Voting akan muncul di browser.

Cuplikan layar memperlihatkan Aplikasi Voting Azure dengan tombol untuk Kucing, Anjing, dan Reset, dan total.

Pembersihan

Gunakan skrip hapus instalan yang disediakan dalam templat untuk menghapus instans aplikasi dari kluster dan membatalkan registrasi jenis aplikasi. Perintah ini membutuhkan waktu untuk membersihkan instans dan perintah 'install.sh' tidak dapat dijalankan segera setelah skrip ini.

./uninstall.sh

Contoh manifes yang diselesaikan

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>

Langkah berikutnya

Dalam tutorial ini, beberapa kontainer dikemas ke dalam aplikasi Service Fabric menggunakan Yeoman. Aplikasi ini kemudian disebarkan dan dijalankan pada kluster Service Fabric. Langkah-langkah berikut telah selesai:

  • Pasang Yeoman
  • Membuat paket aplikasi menggunakan Yeoman
  • Mengonfigurasi pengaturan dalam paket aplikasi untuk digunakan dengan kontainer
  • Membangun aplikasi
  • Menyebarkan dan menjalankan aplikasi
  • Membersihkan aplikasi

Lanjutkan ke tutorial berikutnya untuk mempelajari tentang kegagalan dan penskalaan aplikasi di Service Fabric.