Kapsayıcı örneklerini Azure sanal ağına dağıtma

Dağıtma ve Keşfetme

Azure Sanal Ağ, Azure ve şirket içi kaynaklarınız için güvenli ve özel ağ sağlar. Kapsayıcı gruplarını bir Azure sanal ağına dağıtarak kapsayıcılarınız sanal ağdaki diğer kaynaklarla güvenli bir şekilde iletişim kurabilir.

Bu makalede, kapsayıcı gruplarını yeni bir sanal ağa veya mevcut bir sanal ağa dağıtmak için Azure CLI'daki az container create komutunun nasıl kullanılacağı gösterilmektedir.

Önemli

Kapsayıcı grubunuzu bir sanal ağa dağıtırsanız, giden bağlantı için bir NAT ağ geçidi kullanmanız gerekir. Bu, sanal ağdaki kapsayıcı grubunuzdan giden bağlantı için desteklenen tek yapılandırmadır. Daha fazla bilgi için, Kapsayıcı grubundan giden trafik için statik IP adresi yapılandırmasıyla ilgili NAT ağ geçidini nasıl yapılandıracağınız bölümüne bakın.

Önemli

  • Bir sanal ağı kullanmadan önce alt ağlar devredilmelidir
  • Kapsayıcı gruplarını sanal ağlara dağıtmadan önce sınırlamayı denetlemenizi öneririz. Ağ oluşturma senaryoları ve sınırlamaları için bkz: Azure Container Instances için sanal ağ senaryoları ve kaynakları.
  • Sanal ağa kapsayıcı grubu dağıtımı, Azure Container Instances'ın kullanılabildiği çoğu bölgede Linux ve Windows kapsayıcıları için genel olarak kullanılabilir. Ayrıntılar için bkz . kullanılabilir bölgeler.

Önemli

Ağ profilleri, 2021-07-01 API sürümü itibarıyla kullanımdan kaldırılmıştır. Bu sürümü veya daha yeni bir sürümü kullanıyorsanız, ağ profilleriyle ilgili adımları ve eylemleri göz ardı edin.

Bu makaledeki örnekler Bash kabuğu için biçimlendirilmiştir. PowerShell veya Komut İstemi gibi başka bir kabuk tercih ediyorsanız, satır devamı karakterlerini buna göre ayarlayın.

Önkoşullar

Ortam değişkenlerini tanımlama

Otomatik dağıtım yolu, bu kılavuz boyunca aşağıdaki ortam değişkenlerini ve kaynak adlarını kullanır. Kılavuzda el ile ilerleyen kullanıcılar tercih ettikleri gibi kendi değişkenlerini ve adlarını kullanabilir.

Kaynak grubu oluşturma

Aşağıdaki örneklerde kullanılan tüm kaynakları yönetmek için bir kaynak grubuna ihtiyacınız vardır. Kaynak grubu oluşturmak için az group create komutunu kullanın:

export RANDOM_ID="$(openssl rand -hex 3)"
export MY_RESOURCE_GROUP_NAME="myACIResourceGroup$RANDOM_ID"

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

Başarılı bir işlem aşağıdaki JSON'a benzer bir çıkış üretmelidir:

Sonuçlar:

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

Yeni sanal ağa dağıtma

Önemli

Kapsayıcı grubu dağıtımları için en az /24 (256 adres) alt ağı kullanın. /24'ten küçük alt ağların (/28 veya /29 gibi) "alt ağ dolu" dağıtım hatalarına neden olduğu bilinmektedir çünkü Azure Container Instances IP adresi eşlemelerini yeniden kullanım için yeterince hızlı bir şekilde serbest bırakamaz. /24 veya daha büyük bir alt ağ kullanmak, kapsayıcıların başlatılamadıkları, yeniden başlatılamadıkları veya durdurulamadıkları durumlarda takılı kalmasını önler.

Yeni bir sanal ağa dağıtmak ve Azure'ın sizin için ağ kaynaklarını otomatik olarak oluşturmasını sağlamak için az container create komutunu yürütürken aşağıdakileri belirtin:

  • Sanal ağın adı
  • CIDR biçiminde sanal ağ adresi ön eki
  • Alt ağ adı
  • CIDR biçiminde alt ağ adresi ön eki

Sanal ağ ve alt ağ adres ön ekleri, sırasıyla sanal ağ ve alt ağ için adres alanlarını belirtir. Bu değerler, örneğin 10.0.0.0/16, Sınıfsız Etki Alanları Arası Yönlendirme (CIDR) gösteriminde temsil edilir. Alt ağlarla çalışma hakkında daha fazla bilgi için bkz: Sanal ağ alt ağı ekleme, değiştirme veya silme.

İlk kapsayıcı grubunuzu bu yöntemle dağıttığınızda, sanal ağı ve alt ağ adlarını veya Azure'ın sizin için otomatik olarak oluşturduğu ağ profilini belirterek aynı alt ağa dağıtabilirsiniz. Azure, alt ağı Azure Container Instances'a devreddiğinden, alt ağa yalnızca kapsayıcı grupları dağıtabilirsiniz.

Örnek

Aşağıdaki az container create komutu yeni bir sanal ağ ve alt ağ için ayarları belirtir. Sanal ağdaki kapsayıcı grubu dağıtımlarının kullanılabildiği bir bölgede oluşturulan kaynak grubunun adını belirtin. Bu komut, statik bir web sayfası sunan küçük bir Node.js web sunucusu çalıştıran genel Microsoft aci-helloworld kapsayıcısını dağıtır. Sonraki bölümde, aynı alt ağa ikinci bir kapsayıcı grubu dağıtacak ve iki kapsayıcı örneği arasındaki iletişimi test edin.

export MY_APP_CONTAINER_NAME="appcontainer"
export MY_VNET_NAME="aci-vnet"
export MY_SUBNET_NAME="aci-subnet"

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

Başarılı bir işlem aşağıdaki JSON'a benzer bir çıkış üretmelidir:

Sonuçlar:

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

Bu yöntemi kullanarak yeni bir sanal ağa dağıtım yaptığınızda, ağ kaynakları oluşturulurken dağıtım birkaç dakika sürebilir. İlk dağıtımdan sonra, aynı alt ağa yapılan sonraki kapsayıcı grubu dağıtımları daha hızlı tamamlanır.

Mevcut sanal ağa dağıt

Kapsayıcı grubunu mevcut bir sanal ağa dağıtmak için:

  1. Mevcut sanal ağınızda bir alt ağ oluşturun, kapsayıcı grubunun zaten dağıtıldığı mevcut bir alt ağı kullanın veya diğer tüm kaynak ve yapılandırmalardan boşaltılmış mevcut bir alt ağı kullanın. Kapsayıcı grupları için kullandığınız alt ağ yalnızca kapsayıcı gruplarını içerebilir. Bir kapsayıcı grubunu bir alt ağa dağıtmadan önce, sağlama işleminden önce alt ağı açıkça devretmelisiniz. Delege edildikten sonra alt ağ yalnızca kapsayıcı grupları için kullanılabilir. Kapsayıcı grupları dışındaki kaynakları temsilcili alt ağa dağıtmaya çalışırsanız işlem başarısız olur.
  2. az container create ile bir kapsayıcı grubu dağıtın ve aşağıdakilerden birini belirtin:
    • Sanal ağ adı ve alt ağ adı
    • Farklı bir kaynak grubundan sanal ağ kullanılmasına izin veren sanal ağ kaynak kimliği ve alt ağ kaynak kimliği

YAML dosyası kullanarak dağıtma

YaML dosyası, Resource Manager şablonu veya Python SDK'sı gibi başka bir programlı yöntem kullanarak kapsayıcı grubunu mevcut bir sanal ağa da dağıtabilirsiniz.

Örneğin, bir YAML dosyası kullanırken, Azure Container Instances'a temsilci olarak atanan bir alt ağ ile bir sanal ağa dağıtabilirsiniz. Aşağıdaki özellikleri belirtin:

  • ipAddress: Kapsayıcı grubu için özel IP adresi ayarları.
    • ports: Varsa açılacak bağlantı noktaları.
    • protocol: Açılan bağlantı noktası için protokol (TCP veya UDP).
  • subnetIds: Dağıtılacak alt ağların kaynak kimlikleri
    • id: Alt ağın kaynak kimliği
    • name: Alt ağın adı

Bu YAML, sanal ağınızda bir kapsayıcı grubu oluşturur. Ad alanlarına kapsayıcı grubu adınızı ve alt ağ kimliği alanına alt ağ kimliğinizi girin. Ad için appcontaineryaml kullanıyoruz. Alt ağ kimliğinizi bulmanız gerekiyorsa ve artık önceki çıkışlara erişiminiz yoksa, görüntülemek için az container show komutunu kullanabilirsiniz. subnetIds altında id alanını arayın.

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

Aşağıdaki Bash komutu otomatik dağıtım yoluna yöneliktir.

export MY_YAML_APP_CONTAINER_NAME="appcontaineryaml"
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"
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

Kapsayıcı grubunu, az container create komutunu kullanarak, --file parametresi için YAML dosyasının adını belirterek dağıtın:

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

Aşağıdaki Bash komutu otomatik dağıtım yoluna yöneliktir.

rm container-instances-vnet.yaml

Dağıtım tamamlandıktan sonra, durumunu görüntülemek için az container show komutunu çalıştırın:

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

Çıktı aşağıdaki örneğe benzemelidir:

Sonuçlar:

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

Kapsayıcı örnekleri arasındaki iletişimi gösterme

Aşağıdaki örnek, daha önce oluşturulan aynı alt ağa üçüncü bir kapsayıcı grubu dağıtır. Alpine Linux görüntüsü kullanarak kendisi ile ilk kapsayıcı örneği arasındaki iletişimi doğrular.

Not

Burada kullanılan Alpine Linux gibi genel Docker görüntülerini çekmek için geçerli olan hız sınırlaması nedeniyle şu biçimde bir hata alabilirsiniz:

(RegistryErrorResponse) 'index.docker.io' docker kayıt defterinden bir hata yanıtı alınır. Daha sonra yeniden deneyin. Kod: RegistryErrorResponse İletisi: 'index.docker.io' docker kayıt defterinden bir hata yanıtı alındı. Daha sonra yeniden deneyin.

Aşağıdaki Bash komutu otomatik dağıtım yoluna yöneliktir.

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

İlk olarak, dağıtmış olduğunuz ilk kapsayıcı grubunun IP adresini (appcontainer) alın:

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

Çıkış, özel alt ağdaki kapsayıcı grubunun IP adresini görüntüler. Örneğin:

Sonuçlar:

10.0.0.4

Şimdi, CONTAINER_GROUP_IP öğesini az container show komutuyla aldığınız IP olarak ayarlayın ve aşağıdaki az container create komutunu çalıştırın. Bu ikinci kapsayıcı olan commchecker, Alpine Linux tabanlı bir imaj çalıştırır ve wget öğesini ilk kapsayıcı grubunun özel alt ağındaki IP adresine karşı yürütür.

export MY_COMM_CHECKER_NAME="commchecker"

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

Bu ikinci kapsayıcı dağıtımı tamamlandıktan sonra, çalıştırdığı wget komutunun çıktısını görebilmek için günlüklerini alın:

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

İkinci kapsayıcı ilk kapsayıcıyla başarıyla iletişim kurarsa, çıkış şuna benzer:

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

Günlük çıktısı, wget öğesinin yerel alt ağdaki özel IP adresini kullanarak ilk kapsayıcıya bağlanabildiğini ve dizin dosyasını ilk kapsayıcıdan indirebildiğini göstermelidir. İki kapsayıcı grubu arasındaki ağ trafiği sanal ağ içinde kaldı.

Kaynakları temizleme

Bu kaynakları kullanmaya devam etmek istemiyorsanız Azure ücretlerinden kaçınmak için bunları silebilirsiniz. Az group delete komutuyla kaynak grubunu silerek bu kılavuzda kullandığınız tüm kaynakları temizleyebilirsiniz . Bu kaynaklar silindikten sonra kurtarılamaz.

Sonraki adımlar