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:
- 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ę.
- 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 wid
: identyfikator zasobu podsieciname
: 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
Aby wdrożyć nową sieć wirtualną, podsieć, profil sieciowy i grupę kontenerów przy użyciu szablonu usługi Resource Manager, zobacz Tworzenie grupy kontenerów platformy Azure z siecią wirtualną.
Aby wdrożyć usługi Azure Container Instances, które mogą ściągać obrazy z usługi Azure Container Registry za pośrednictwem prywatnego punktu końcowego, zobacz Deploy to Azure Container Instances from Azure Container Registry using a managed identity (Wdrażanie w usłudze Azure Container Instances z usługi Azure Container Registry przy użyciu tożsamości zarządzanej).