Dela via


Distribuera containerinstanser i ett virtuellt Azure-nätverk

Azure Virtual Network tillhandahåller säkra, privata nätverk för dina Azure-resurser och lokala resurser. Genom att distribuera containergrupper till ett virtuellt Azure-nätverk kan dina containrar kommunicera säkert med andra resurser i det virtuella nätverket.

Den här artikeln visar hur du använder kommandot az container create i Azure CLI för att distribuera containergrupper till antingen ett nytt virtuellt nätverk eller ett befintligt virtuellt nätverk.

Viktigt!

  • Undernät måste delegeras innan du använder ett virtuellt nätverk
  • Innan du distribuerar containergrupper i virtuella nätverk rekommenderar vi att du kontrollerar begränsningen först. Nätverksscenarier och begränsningar finns i Scenarier och resurser för virtuella nätverk för Azure Container Instances.
  • Distribution av containergrupper till ett virtuellt nätverk är allmänt tillgängligt för Linux- och Windows-containrar, i de flesta regioner där Azure Container Instances är tillgängligt. Mer information finns i tillgängliga regioner.

Viktigt!

Nätverksprofiler har dragits tillbaka från och med API-versionen 2021-07-01 . Om du använder den här eller en senare version ignorerar du alla steg och åtgärder som rör nätverksprofiler.

Exempel i den här artikeln är formaterade för Bash-gränssnittet. Om du föredrar ett annat gränssnitt, till exempel PowerShell eller Kommandotolken, justerar du radfortsättningstecken i enlighet med detta.

Förutsättningar

Definiera miljövariabler

Den automatiserade distributionsvägen använder följande miljövariabler och resursnamn i den här guiden. Användare som går igenom guiden manuellt kan använda sina egna variabler och namn som önskat.

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"

Skapa en resursgrupp

Du behöver en resursgrupp för att hantera alla resurser som används i följande exempel. Om du vill skapa en resursgrupp använder du az group create:

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

En lyckad åtgärd bör generera utdata som liknar följande JSON:

Resultat:

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

Distribuera till nytt virtuellt nätverk

Kommentar

Om du använder undernätets IP-intervall /29 för att bara ha 3 IP-adresser. vi rekommenderar att du alltid går ett intervall över (aldrig nedan). Använd till exempel undernätets IP-intervall /28 så att du kan ha minst 1 eller fler IP-buffert per containergrupp. Genom att göra detta kan du undvika containrar i fastnat, inte kunna starta, starta om eller ens inte kunna stoppa tillstånd.

Om du vill distribuera till ett nytt virtuellt nätverk och låta Azure skapa nätverksresurserna automatiskt anger du följande när du kör az container create:

  • Virtuellt nätverksnamn
  • Adressprefix för virtuellt nätverk i CIDR-format
  • Namn på undernät
  • Undernätsadressprefix i CIDR-format

Adressprefixen för det virtuella nätverket och undernätet anger adressutrymmena för det virtuella nätverket respektive undernätet. Dessa värden representeras i CIDR-notation (Classless Inter-Domain Routing), till exempel 10.0.0.0/16. Mer information om hur du arbetar med undernät finns i Lägga till, ändra eller ta bort ett virtuellt nätverksundernät.

När du har distribuerat din första containergrupp med den här metoden kan du distribuera till samma undernät genom att ange namn på det virtuella nätverket och undernätet eller den nätverksprofil som Azure automatiskt skapar åt dig. Eftersom Azure delegerar undernätet till Azure Container Instances kan du bara distribuera containergrupper till undernätet.

Exempel

Följande az container create-kommando anger inställningar för ett nytt virtuellt nätverk och undernät. Ange namnet på en resursgrupp som skapades i en region där distributioner av containergrupper i ett virtuellt nätverk är tillgängliga. Det här kommandot distribuerar den offentliga Microsoft aci-helloworld-containern som kör en liten Node.js webbserver som betjänar en statisk webbsida. I nästa avsnitt distribuerar du en andra containergrupp till samma undernät och testar kommunikationen mellan de två containerinstanserna.

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

En lyckad åtgärd bör generera utdata som liknar följande JSON:

Resultat:

{
  "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
}

När du distribuerar till ett nytt virtuellt nätverk med den här metoden kan distributionen ta några minuter medan nätverksresurserna skapas. Efter den första distributionen slutförs ytterligare distributioner av containergrupper till samma undernät snabbare.

Distribuera till ett befintligt virtuellt nätverk

Så här distribuerar du en containergrupp till ett befintligt virtuellt nätverk:

  1. Skapa ett undernät i ditt befintliga virtuella nätverk, använd ett befintligt undernät där en containergrupp redan har distribuerats eller använd ett befintligt undernät tömt på alla andra resurser och konfigurationer. Det undernät som du använder för containergrupper kan bara innehålla containergrupper. Innan du distribuerar en containergrupp till ett undernät måste du uttryckligen delegera undernätet innan du etablerar. När undernätet har delegerats kan det endast användas för containergrupper. Om du försöker distribuera andra resurser än containergrupper till ett delegerat undernät misslyckas åtgärden.
  2. Distribuera en containergrupp med az container create och ange något av följande:
    • Namn på virtuellt nätverk och undernätsnamn
    • Resurs-ID för virtuellt nätverk och resurs-ID för undernät, vilket gör det möjligt att använda ett virtuellt nätverk från en annan resursgrupp

Distribuera med en YAML-fil

Du kan också distribuera en containergrupp till ett befintligt virtuellt nätverk med hjälp av en YAML-fil, en Resource Manager-mall eller en annan programmatisk metod, till exempel med Python SDK.

När du till exempel använder en YAML-fil kan du distribuera till ett virtuellt nätverk med ett undernät delegerat till Azure Container Instances. Ange följande egenskaper:

  • ipAddress: Inställningarna för den privata IP-adressen för containergruppen.
    • ports: Portarna som ska öppnas, om några.
    • protocol: Protokollet (TCP eller UDP) för den öppnade porten.
  • subnetIds: Resurs-ID:t för de undernät som ska distribueras till
    • id: Resurs-ID för undernätet
    • name: Namnet på undernätet

Den här YAML-filen skapar en containergrupp i det virtuella nätverket. Ange namnet på containergruppen i namnfälten och ditt undernäts-ID i fältet undernäts-ID. Vi använder appcontaineryaml som namn. Om du behöver hitta ditt undernäts-ID och inte längre har åtkomst till tidigare utdata kan du använda kommandot az container show för att visa det. Leta efter fältet id under 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

Följande Bash-kommando är för den automatiserade distributionsvägen.

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

Distribuera containergruppen med kommandot az container create och ange YAML-filnamnet för parametern --file :

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

Följande Bash-kommando är för den automatiserade distributionsvägen.

rm container-instances-vnet.yaml

När distributionen är klar kör du kommandot az container show för att visa dess status:

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

Utdata bör likna exemplet nedan:

Resultat:

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

Visa kommunikation mellan containerinstanser

I följande exempel distribueras en tredje containergrupp till samma undernät som skapades tidigare. Med hjälp av en Alpine Linux-avbildning verifierar den kommunikationen mellan sig själv och den första containerinstansen.

Kommentar

På grund av hastighetsbegränsning som gäller för att hämta offentliga Docker-avbildningar som alpine Linux som används här kan du få ett fel i formuläret:

(RegistryErrorResponse) Ett felsvar tas emot från Docker-registret "index.docker.io". Försök igen senare. Kod: RegistryErrorResponse-meddelande: Ett felsvar tas emot från Docker-registret "index.docker.io". Försök igen senare.

Följande Bash-kommando är för den automatiserade distributionsvägen.

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

Hämta först IP-adressen för den första containergruppen som du distribuerade, appcontainern:

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

Utdata visar IP-adressen för containergruppen i det privata undernätet. Till exempel:

Resultat:

10.0.0.4

CONTAINER_GROUP_IP Ange nu den IP-adress som du hämtade med az container show kommandot och kör följande az container create kommando. Den andra containern, commchecker, kör en Alpine Linux-baserad avbildning och körs wget mot den första containergruppens privata IP-adress för undernätet.

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

När den andra containerdistributionen har slutförts hämtar du loggarna så att du kan se utdata från kommandot som wget den körde:

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

Om den andra containern kommunicerade med den första liknar utdata:

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

Loggutdata bör visa att wget det gick att ansluta och ladda ned indexfilen från den första containern med hjälp av dess privata IP-adress i det lokala undernätet. Nätverkstrafiken mellan de två containergrupperna fanns kvar i det virtuella nätverket.

Rensa resurser

Om du inte planerar att fortsätta använda dessa resurser kan du ta bort dem för att undvika Azure-avgifter. Du kan rensa alla resurser som du använde i den här guiden genom att ta bort resursgruppen med kommandot az group delete . När resurserna har tagits bort går det inte att återställa dem.

Nästa steg