Udostępnij za pośrednictwem


Wdrażanie wystąpień kontenerów w sieci wirtualnej platformy Azure

Usługa Azure Virtual Network zapewnia bezpieczną sieć prywatną dla zasobów platformy Azure i zasobów lokalnych. Wdrażając grupy kontenerów w sieci wirtualnej platformy Azure, kontenery mogą bezpiecznie komunikować się z innymi zasobami w sieci wirtualnej.

W tym artykule pokazano, jak za pomocą polecenia az container create w interfejsie wiersza polecenia platformy Azure wdrożyć grupy kontenerów w nowej sieci wirtualnej lub istniejącej sieci wirtualnej.

Ważne

  • Przed użyciem sieci wirtualnej należy delegować podsieci
  • Przed wdrożeniem grup kontenerów w sieciach wirtualnych zalecamy najpierw sprawdzenie ograniczenia. Aby zapoznać się ze scenariuszami i ograniczeniami sieci wirtualnych, zobacz Scenariusze i zasoby sieci wirtualnej dla usługi Azure Container Instances.
  • Wdrażanie grupy kontenerów w sieci wirtualnej jest ogólnie dostępne dla kontenerów systemów Linux i Windows, w większości regionów, w których jest dostępna usługa Azure Container Instances. Aby uzyskać szczegółowe informacje, zobacz dostępne regiony.

Ważne

Profile sieciowe zostały wycofane w wersji interfejsu 2021-07-01 API. Jeśli używasz tej lub nowszej wersji, zignoruj wszystkie kroki i akcje związane z profilami sieciowymi.

Przykłady w tym artykule są formatowane dla powłoki Bash. Jeśli wolisz inną powłokę, taką jak program PowerShell lub wiersz polecenia, odpowiednio dostosuj znaki kontynuacji wiersza.

Wymagania wstępne

Definiowanie zmiennych środowiskowych

Ścieżka zautomatyzowanego wdrażania używa następujących zmiennych środowiskowych i nazw zasobów w tym przewodniku. Użytkownicy przechodzący przez przewodnik ręcznie mogą używać własnych zmiennych i nazw jako preferowanych.

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"

Tworzenie grupy zasobów

Do zarządzania wszystkimi zasobami używanymi w poniższych przykładach potrzebna jest grupa zasobów. Aby utworzyć grupę zasobów, użyj polecenia az group create:

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

Pomyślna operacja powinna spowodować wygenerowanie danych wyjściowych podobnych do następującego kodu JSON:

Wyniki:

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

Wdrażanie w nowej sieci wirtualnej

Uwaga

Jeśli używasz zakresu adresów IP podsieci /29, aby mieć tylko 3 adresy IP. Zalecamy zawsze przejście do jednego zakresu powyżej (nigdy poniżej). Na przykład użyj zakresu adresów IP podsieci /28, aby mieć co najmniej 1 lub więcej buforu IP dla grupy kontenerów. Dzięki temu można uniknąć zakleszczonych kontenerów, nie można uruchomić, uruchomić ponownie lub nawet nie można zatrzymać stanów.

Aby wdrożyć w nowej sieci wirtualnej i automatycznie utworzyć zasoby sieciowe na platformie Azure, określ następujące elementy podczas wykonywania polecenia az container create:

  • Nazwa sieci wirtualnej
  • Prefiks adresu sieci wirtualnej w formacie CIDR
  • Nazwa podsieci
  • Prefiks adresu podsieci w formacie CIDR

Prefiksy adresów sieci wirtualnej i podsieci określają odpowiednio przestrzenie adresowe dla sieci wirtualnej i podsieci. Te wartości są reprezentowane w notacji CIDR (Classless Inter-Domain Routing), na przykład 10.0.0.0/16. Aby uzyskać więcej informacji na temat pracy z podsieciami, zobacz Dodawanie, zmienianie lub usuwanie podsieci sieci wirtualnej.

Po wdrożeniu pierwszej grupy kontenerów za pomocą tej metody można wdrożyć w tej samej podsieci, określając sieć wirtualną i nazwy podsieci lub profil sieciowy tworzony automatycznie przez platformę Azure. Ponieważ platforma Azure deleguje podsieć do usługi Azure Container Instances, można wdrożyć tylko grupy kontenerów w podsieci.

Przykład

Następujące polecenie az container create określa ustawienia nowej sieci wirtualnej i podsieci. Podaj nazwę grupy zasobów, która została utworzona w regionie, w którym są dostępne wdrożenia grup kontenerów w sieci wirtualnej. To polecenie wdraża publiczny kontener Microsoft aci-helloworld, który uruchamia mały Node.js serwer internetowy obsługujący statyczną stronę internetową. W następnej sekcji wdrożysz drugą grupę kontenerów w tej samej podsieci i przetestujesz komunikację między dwoma wystąpieniami kontenerów.

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

Pomyślna operacja powinna spowodować wygenerowanie danych wyjściowych podobnych do następującego kodu JSON:

Wyniki:

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

Wdrożenie w nowej sieci wirtualnej przy użyciu tej metody może potrwać kilka minut podczas tworzenia zasobów sieciowych. Po początkowym wdrożeniu kolejne wdrożenia grup kontenerów do tej samej podsieci są szybsze.

Wdrażanie w istniejącej sieci wirtualnej

Aby wdrożyć grupę kontenerów w istniejącej sieci wirtualnej:

  1. Utwórz podsieć w istniejącej sieci wirtualnej, użyj istniejącej podsieci, w której grupa kontenerów jest już wdrożona, lub użyj istniejącej podsieci opróżnionej wszystkich innych zasobów i konfiguracji. Podsieć używana dla grup kontenerów może zawierać tylko grupy kontenerów. Przed wdrożeniem grupy kontenerów w podsieci należy jawnie delegować podsieć przed zainicjowaniem obsługi administracyjnej. Po delegowaniu podsieć może być używana tylko dla grup kontenerów. Jeśli spróbujesz wdrożyć zasoby inne niż grupy kontenerów w delegowanej podsieci, operacja nie powiedzie się.
  2. Wdróż grupę kontenerów za pomocą polecenia az container create i określ jedną z następujących opcji:
    • Nazwa sieci wirtualnej i nazwa podsieci
    • Identyfikator zasobu sieci wirtualnej i identyfikator zasobu podsieci, który umożliwia korzystanie z sieci wirtualnej z innej grupy zasobów

Wdrażanie przy użyciu pliku YAML

Grupę kontenerów można również wdrożyć w istniejącej sieci wirtualnej przy użyciu pliku YAML, szablonu usługi Resource Manager lub innej metody programowej, takiej jak zestaw SDK języka Python.

Na przykład w przypadku korzystania z pliku YAML można wdrożyć w sieci wirtualnej z podsiecią delegowana do usługi Azure Container Instances. Określ następujące właściwości:

  • ipAddress: ustawienia prywatnego adresu IP dla grupy kontenerów.
    • ports: porty do otwarcia, jeśli istnieją.
    • protocol: protokół (TCP lub UDP) dla otwartego portu.
  • subnetIds: identyfikatory zasobów podsieci, które mają zostać wdrożone w
    • id: identyfikator zasobu podsieci
    • name: nazwa podsieci

Ten kod YAML tworzy grupę kontenerów w sieci wirtualnej. Wprowadź nazwę grupy kontenerów w polach nazwy i identyfikator podsieci w polu Identyfikator podsieci. Jako nazwę używamy pliku appcontaineryaml . Jeśli musisz znaleźć identyfikator podsieci i nie masz już dostępu do poprzednich danych wyjściowych, możesz użyć polecenia az container show , aby go wyświetlić. id Wyszukaj pole w obszarze 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

Następujące polecenie powłoki Bash jest przeznaczone dla zautomatyzowanej ścieżki wdrażania.

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

Wdróż grupę kontenerów za pomocą polecenia az container create , określając nazwę pliku YAML dla parametru --file :

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

Następujące polecenie powłoki Bash jest przeznaczone dla zautomatyzowanej ścieżki wdrażania.

rm container-instances-vnet.yaml

Po zakończeniu wdrażania uruchom polecenie az container show , aby wyświetlić jego stan:

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

Dane wyjściowe powinny wyglądać podobnie do poniższego przykładu:

Wyniki:

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

Prezentacja komunikacji między wystąpieniami kontenerów

Poniższy przykład wdraża trzecią grupę kontenerów w tej samej utworzonej wcześniej podsieci. Korzystając z obrazu alpine Linux, weryfikuje komunikację między samym sobą a pierwszym wystąpieniem kontenera.

Uwaga

Ze względu na ograniczenie szybkości ściągania publicznych obrazów platformy Docker, takich jak Alpine Linux, który został użyty tutaj, może zostać wyświetlony błąd w postaci:

(RegistryErrorResponse) Odpowiedź o błędzie jest odbierana z rejestru platformy Docker "index.docker.io". Spróbuj ponownie później. Kod: Komunikat RegistryErrorResponse: Odpowiedź o błędzie jest odbierana z rejestru platformy Docker "index.docker.io". Spróbuj ponownie później.

Następujące polecenie powłoki Bash jest przeznaczone dla zautomatyzowanej ścieżki wdrażania.

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

Najpierw uzyskaj adres IP pierwszej wdrożonej grupy kontenerów: appcontainer:

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

Dane wyjściowe wyświetla adres IP grupy kontenerów w podsieci prywatnej. Na przykład:

Wyniki:

10.0.0.4

Teraz ustaw CONTAINER_GROUP_IP adres IP pobrany za az container show pomocą polecenia i wykonaj następujące az container create polecenie. Ten drugi kontener commchecker uruchamia obraz oparty na systemie Alpine Linux i wykonuje względem prywatnego adresu IP podsieci wget pierwszej grupy kontenerów.

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 zakończeniu drugiego wdrożenia kontenera pobierz jego dzienniki, aby wyświetlić dane wyjściowe wget polecenia, które zostało wykonane:

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

Jeśli drugi kontener pomyślnie komunikował się z pierwszym, dane wyjściowe są podobne do następujących:

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

Dane wyjściowe dziennika powinny wskazywać, że wget można było nawiązać połączenie i pobrać plik indeksu z pierwszego kontenera przy użyciu jego prywatnego adresu IP w podsieci lokalnej. Ruch sieciowy między dwiema grupami kontenerów pozostał w sieci wirtualnej.

Czyszczenie zasobów

Jeśli nie planujesz nadal korzystać z tych zasobów, możesz je usunąć, aby uniknąć opłat za platformę Azure. Wszystkie zasoby używane w tym przewodniku można wyczyścić, usuwając grupę zasobów za pomocą polecenia az group delete . Po usunięciu te zasoby są nieodwracalne.

Następne kroki