Sdílet prostřednictvím


Nasazení instancí kontejnerů do virtuální sítě Azure

Azure Virtual Network poskytuje zabezpečené privátní sítě pro vaše prostředky Azure a místní prostředky. Nasazením skupin kontejnerů do virtuální sítě Azure můžou kontejnery bezpečně komunikovat s dalšími prostředky ve virtuální síti.

Tento článek ukazuje, jak pomocí příkazu az container create v Azure CLI nasadit skupiny kontejnerů do nové virtuální sítě nebo existující virtuální sítě.

Důležité

  • Před použitím virtuální sítě musí být podsítě delegovány.
  • Před nasazením skupin kontejnerů ve virtuálních sítích doporučujeme nejprve zkontrolovat omezení. Scénáře a omezení sítí najdete v tématu Scénáře a prostředky virtuální sítě pro službu Azure Container Instances.
  • Nasazení skupiny kontejnerů do virtuální sítě je obecně dostupné pro kontejnery Linuxu a Windows ve většině oblastí, kde je služba Azure Container Instances dostupná. Podrobnosti najdete v dostupných oblastech.

Důležité

Profily sítě byly vyřazeny z 2021-07-01 verze rozhraní API. Pokud používáte tuto nebo novější verzi, ignorujte všechny kroky a akce související se síťovými profily.

Příklady v tomto článku jsou formátovány pro prostředí Bash. Pokud dáváte přednost jinému prostředí, jako je PowerShell nebo příkazový řádek, upravte znaky pokračování řádku odpovídajícím způsobem.

Požadavky

Definování proměnných prostředí

Cesta automatizovaného nasazení používá následující proměnné prostředí a názvy prostředků v rámci této příručky. Uživatelé, kteří procházejí průvodcem ručně, můžou používat vlastní proměnné a názvy jako upřednostňované.

export RANDOM_ID="$(openssl rand -hex 3)"
export MY_RESOURCE_GROUP_NAME="myACIResourceGroup$RANDOM_ID"
export MY_VNET_NAME="aci-vnet"
export MY_SUBNET_NAME="aci-subnet"
export MY_SUBNET_ID="/subscriptions/$(az account show --query id --output tsv)/resourceGroups/$MY_RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$MY_VNET_NAME/subnets/$MY_SUBNET_NAME"
export MY_APP_CONTAINER_NAME="appcontainer"
export MY_COMM_CHECKER_NAME="commchecker"
export MY_YAML_APP_CONTAINER_NAME="appcontaineryaml"

Vytvoření skupiny zdrojů

Ke správě všech prostředků použitých v následujících příkladech potřebujete skupinu prostředků. Pokud chcete vytvořit skupinu prostředků, použijte příkaz az group create:

az group create --name $MY_RESOURCE_GROUP_NAME --location eastus

Úspěšná operace by měla vytvořit výstup podobný následujícímu kódu JSON:

Výsledky:

{
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123abc",
  "location": "abcdef",
  "managedBy": null,
  "name": "myACIResourceGroup123",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Nasazení do nové virtuální sítě

Poznámka:

Pokud používáte rozsah IP adres podsítě /29, abyste měli jenom 3 IP adresy. doporučujeme vždy přejít o jeden rozsah výše (nikdy níže). Použijte například rozsah IP adres podsítě /28, abyste mohli mít alespoň 1 nebo více vyrovnávací paměti PROTOKOLU IP pro každou skupinu kontejnerů. Tímto způsobem se můžete vyhnout zablokovaným kontejnerům, nemůžete spustit, restartovat nebo dokonce zastavit stavy.

Pokud chcete nasadit do nové virtuální sítě a nechat Azure automaticky vytvořit síťové prostředky, při spuštění příkazu az container create zadejte následující:

  • Název virtuální sítě
  • Předpona adresy virtuální sítě ve formátu CIDR
  • Název podsítě
  • Předpona adresy podsítě ve formátu CIDR

Předpony adres virtuální sítě a podsítě určují adresní prostory virtuální sítě a podsítě. Tyto hodnoty jsou reprezentovány v zápisu CIDR (Classless Inter-Domain Routing), například 10.0.0.0/16. Další informace o práci s podsítěmi najdete v tématu Přidání, změna nebo odstranění podsítě virtuální sítě.

Jakmile pomocí této metody nasadíte svou první skupinu kontejnerů, můžete ji nasadit do stejné podsítě zadáním názvů virtuální sítě a podsítí nebo profilu sítě, který azure automaticky vytvoří za vás. Vzhledem k tomu, že Azure deleguje podsíť do služby Azure Container Instances, můžete do podsítě nasadit pouze skupiny kontejnerů.

Příklad

Následující příkaz az container create určuje nastavení pro novou virtuální síť a podsíť. Zadejte název skupiny prostředků, která byla vytvořena v oblasti, ve které jsou dostupná nasazení skupin kontejnerů ve virtuální síti. Tento příkaz nasadí veřejný kontejner Microsoft aci-helloworld, na kterém běží malý webový server Node.js obsluhující statickou webovou stránku. V další části nasadíte druhou skupinu kontejnerů do stejné podsítě a otestujete komunikaci mezi dvěma instancemi kontejneru.

az container create \
  --name $MY_APP_CONTAINER_NAME \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet $MY_VNET_NAME \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet $MY_SUBNET_NAME \
  --subnet-address-prefix 10.0.0.0/24

Úspěšná operace by měla vytvořit výstup podobný následujícímu kódu JSON:

Výsledky:

{
  "confidentialComputeProperties": null,
  "containers": [
    {
      "command": null,
      "environmentVariables": [],
      "image": "mcr.microsoft.com/azuredocs/aci-helloworld",
      "instanceView": {
        "currentState": {
          "detailStatus": "",
          "exitCode": null,
          "finishTime": null,
          "startTime": "0000-00-00T00:00:00.000000+00:00",
          "state": "Running"
        },
        "events": [
          {
            "count": 1,
            "firstTimestamp": "0000-00-00T00:00:00+00:00",
            "lastTimestamp": "0000-00-00T00:00:00+00:00",
            "message": "Successfully pulled image \"mcr.microsoft.com/azuredocs/aci-helloworld@sha256:0000000000000000000000000000000000000000000000000000000000000000\"",
            "name": "Pulled",
            "type": "Normal"
          },
          {
            "count": 1,
            "firstTimestamp": "0000-00-00T00:00:00+00:00",
            "lastTimestamp": "0000-00-00T00:00:00+00:00",
            "message": "pulling image \"mcr.microsoft.com/azuredocs/aci-helloworld@sha256:0000000000000000000000000000000000000000000000000000000000000000\"",
            "name": "Pulling",
            "type": "Normal"
          },
          {
            "count": 1,
            "firstTimestamp": "0000-00-00T00:00:00+00:00",
            "lastTimestamp": "0000-00-00T00:00:00+00:00",
            "message": "Started container",
            "name": "Started",
            "type": "Normal"
          }
        ],
        "previousState": null,
        "restartCount": 0
      },
      "livenessProbe": null,
      "name": "appcontainer",
      "ports": [
        {
          "port": 80,
          "protocol": "TCP"
        }
      ],
      "readinessProbe": null,
      "resources": {
        "limits": null,
        "requests": {
          "cpu": 1.0,
          "gpu": null,
          "memoryInGb": 1.5
        }
      },
      "securityContext": null,
      "volumeMounts": null
    }
  ],
  "diagnostics": null,
  "dnsConfig": null,
  "encryptionProperties": null,
  "extensions": null,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123/providers/Microsoft.ContainerInstance/containerGroups/appcontainer",
  "identity": null,
  "imageRegistryCredentials": null,
  "initContainers": [],
  "instanceView": {
    "events": [],
    "state": "Running"
  },
  "ipAddress": {
    "autoGeneratedDomainNameLabelScope": null,
    "dnsNameLabel": null,
    "fqdn": null,
    "ip": "10.0.0.4",
    "ports": [
      {
        "port": 80,
        "protocol": "TCP"
      }
    ],
    "type": "Private"
  },
  "location": "eastus",
  "name": "appcontainer",
  "osType": "Linux",
  "priority": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "myACIResourceGroup123abc",
  "restartPolicy": "Always",
  "sku": "Standard",
  "subnetIds": [
    {
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/myACIResourceGroup123/providers/Microsoft.Network/virtualNetworks/aci-vnet/subnets/aci-subnet",
      "name": null,
      "resourceGroup": "myACIResourceGroup123abc"
    }
  ],
  "tags": {},
  "type": "Microsoft.ContainerInstance/containerGroups",
  "volumes": null,
  "zones": null
}

Při nasazení do nové virtuální sítě pomocí této metody může nasazení trvat několik minut, než se síťové prostředky vytvoří. Po počátečním nasazení se další nasazení skupin kontejnerů do stejné podsítě dokončí rychleji.

Nasazení do existující virtuální sítě

Nasazení skupiny kontejnerů do existující virtuální sítě:

  1. Vytvořte podsíť ve stávající virtuální síti, použijte existující podsíť, ve které je už nasazená skupina kontejnerů, nebo použijte existující podsíť vyprázdněnou ze všech ostatních prostředků a konfigurace. Podsíť, kterou používáte pro skupiny kontejnerů, může obsahovat pouze skupiny kontejnerů. Před nasazením skupiny kontejnerů do podsítě musíte před zřízením explicitně delegovat podsíť. Po delegování je možné podsíť použít pouze pro skupiny kontejnerů. Pokud se do delegované podsítě pokusíte nasadit jiné prostředky než skupiny kontejnerů, operace selže.
  2. Nasaďte skupinu kontejnerů pomocí příkazu az container create a zadejte jednu z následujících možností:
    • Název virtuální sítě a název podsítě
    • ID prostředku virtuální sítě a ID prostředku podsítě, které umožňuje používat virtuální síť z jiné skupiny prostředků

Nasazení pomocí souboru YAML

Skupinu kontejnerů můžete také nasadit do existující virtuální sítě pomocí souboru YAML, šablony Resource Manageru nebo jiné programové metody, jako je sada Python SDK.

Například při použití souboru YAML můžete nasadit do virtuální sítě s podsítí delegovanou do služby Azure Container Instances. Zadejte následující vlastnosti:

  • ipAddress: Nastavení privátní IP adresy pro skupinu kontejnerů.
    • ports: Porty, které se mají otevřít, pokud existuje.
    • protocol: Protokol (TCP nebo UDP) pro otevřený port.
  • subnetIds: ID prostředků podsítí, do které se mají nasadit.
    • id: ID prostředku podsítě
    • name: Název podsítě

Tento YAML vytvoří ve vaší virtuální síti skupinu kontejnerů. Do polí názvů a ID podsítě zadejte název skupiny kontejnerů do pole ID podsítě. Pro název používáme appcontaineryaml . Pokud potřebujete najít ID podsítě a už nemáte přístup k předchozím výstupům, můžete ho zobrazit pomocí příkazu az container show . Vyhledejte pole pod položkou id subnetIds.

apiVersion: '2021-07-01'
location: eastus
name: appcontaineryaml
properties:
  containers:
  - name: appcontaineryaml
    properties:
      image: mcr.microsoft.com/azuredocs/aci-helloworld
      ports:
      - port: 80
        protocol: TCP
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
  ipAddress:
    type: Private
    ports:
    - protocol: tcp
      port: '80'
  osType: Linux
  restartPolicy: Always
  subnetIds:
    - id: <subnet_id>
      name: default
tags: null
type: Microsoft.ContainerInstance/containerGroups

Následující příkaz Bash je určený pro cestu automatizovaného nasazení.

echo -e "apiVersion: '2021-07-01'\nlocation: eastus\nname: $MY_YAML_APP_CONTAINER_NAME\nproperties:\n  containers:\n  - name: $MY_YAML_APP_CONTAINER_NAME\n    properties:\n      image: mcr.microsoft.com/azuredocs/aci-helloworld\n      ports:\n      - port: 80\n        protocol: TCP\n      resources:\n        requests:\n          cpu: 1.0\n          memoryInGB: 1.5\n  ipAddress:\n    type: Private\n    ports:\n    - protocol: tcp\n      port: '80'\n  osType: Linux\n  restartPolicy: Always\n  subnetIds:\n    - id: $MY_SUBNET_ID\n      name: default\ntags: null\ntype: Microsoft.ContainerInstance/containerGroups" > container-instances-vnet.yaml

Nasaďte skupinu kontejnerů pomocí příkazu az container create a zadejte název souboru YAML pro --file parametr:

az container create --resource-group $MY_RESOURCE_GROUP_NAME \
  --file container-instances-vnet.yaml

Následující příkaz Bash je určený pro cestu automatizovaného nasazení.

rm container-instances-vnet.yaml

Po dokončení nasazení spusťte příkaz az container show a zobrazte jeho stav:

az container list --resource-group $MY_RESOURCE_GROUP_NAME --output table

Výstup by měl vypadat podobně jako v následujícím příkladu:

Výsledky:

Name              ResourceGroup             Status     Image                                       IP:ports        Network    CPU/Memory       OsType    Location
----------------  ------------------------  ---------  ------------------------------------------  --------------  ---------  ---------------  --------  ----------
appcontainer      myACIResourceGroup123abc  Succeeded  mcr.microsoft.com/azuredocs/aci-helloworld  10.0.0.4:80,80  Private    1.0 core/1.5 gb  Linux     abcdef
appcontaineryaml  myACIResourceGroup123abc  Succeeded  mcr.microsoft.com/azuredocs/aci-helloworld  10.0.0.5:80,80  Private    1.0 core/1.5 gb  Linux     abcdef

Předvedení komunikace mezi instancemi kontejnerů

Následující příklad nasadí třetí skupinu kontejnerů do stejné podsítě vytvořené dříve. Pomocí image Alpine Linux ověřuje komunikaci mezi sebou a první instancí kontejneru.

Poznámka:

Vzhledem k omezování rychlosti při načítání veřejných imagí Dockeru, jako je například Alpine Linux, která se zde používá, se může zobrazit chyba ve formuláři:

(RegistryErrorResponse) Z registru Dockeru index.docker.io se obdrží chybová odpověď. Zkuste to prosím znovu později. Kód: RegistryErrorResponse Message: Z registru Dockeru index.docker.io se obdrží chybová odpověď. Zkuste to prosím znovu později.

Následující příkaz Bash je určený pro cestu automatizovaného nasazení.

echo -e "Due to rate limiting in effect for pulling public Docker images like the Alpine Linux one used here, you may receive an error in the form:\n\n(RegistryErrorResponse) An error response is received from the docker registry 'index.docker.io'. Please retry later.\nCode: RegistryErrorResponse\nMessage: An error response is received from the docker registry 'index.docker.io'. Please retry later.\n\nIf this occurs, the automated deployment will exit. You can try again or go to the end of the guide to see instructions for cleaning up your resources."

Nejprve získejte IP adresu první skupiny kontejnerů, kterou jste nasadili, appcontainer:

az container show --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $MY_APP_CONTAINER_NAME \
  --query ipAddress.ip --output tsv

Výstup zobrazí IP adresu skupiny kontejnerů v privátní podsíti. Příklad:

Výsledky:

10.0.0.4

Teď nastavte CONTAINER_GROUP_IP ip adresu, kterou jste načetli pomocí az container show příkazu, a spusťte následující az container create příkaz. Tento druhý kontejner, čárkacker, spustí image založenou na Alpine Linuxu a spustí wget se s IP adresou privátní podsítě první skupiny kontejnerů.

az container create \
  --resource-group $MY_RESOURCE_GROUP_NAME \
  --name $MY_COMM_CHECKER_NAME \
  --image alpine:3.4 \
  --command-line "wget 10.0.0.4" \
  --restart-policy never \
  --vnet $MY_VNET_NAME \
  --subnet $MY_SUBNET_NAME

Po dokončení tohoto druhého nasazení kontejneru si stáhněte protokoly, abyste viděli výstup wget příkazu, který spustil:

az container logs --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_COMM_CHECKER_NAME

Pokud druhý kontejner úspěšně komunikoval s prvním, výstup je podobný následujícímu:

Connecting to 10.0.0.4 (10.0.0.4:80)
index.html           100% |*******************************|  1663   0:00:00 ETA

Výstup protokolu by měl ukázat, že wget se mohl připojit a stáhnout soubor indexu z prvního kontejneru pomocí jeho privátní IP adresy v místní podsíti. Síťový provoz mezi těmito dvěma skupinami kontejnerů zůstal ve virtuální síti.

Vyčištění prostředků

Pokud nechcete tyto prostředky dál používat, můžete je odstranit, abyste se vyhnuli poplatkům za Azure. Všechny prostředky, které jste použili v této příručce, můžete vyčistit odstraněním skupiny prostředků pomocí příkazu az group delete . Po odstranění jsou tyto prostředky nedostupné.

Další kroky