Azure Container Apps ile kural tabanlı yönlendirmeyi kullanma

Bu makalede, Azure Container Apps ile kural tabanlı yönlendirmeyi kullanmayı öğreneceksiniz. Kural tabanlı yönlendirme ile kapsayıcı uygulamalar ortamınızda tam etki alanı adı (FQDN) oluşturursunuz. Ardından, bu FQDN isteklerini her isteğin yoluna bağlı olarak farklı kapsayıcı uygulamalarına yönlendirmek için kuralları kullanırsınız.

Yönlendirme ve yetkilendirme modeli

HTTP rota yapılandırmaları (httpRouteConfigs) Container Apps ortam seviyesinde çalışır. Bir rota, hedef uygulamanın bireysel giriş ayarından bağımsız olarak, aynı ortamdaki herhangi bir konteyner uygulamasını hedefleyebilir. Rotanın FQDN'si ortamın alan adı altında yayımlandığından, bir rota istekleri iç giriş () kullanan bir konteyner uygulamasına ileten bir kamuya açık giriş noktası sağlayabilir.external: false Bu davranış, birden fazla uygulamanın tek bir ana bilgisayar altında oluşturulmasını sağlar.

HTTP rota yapılandırmaları için verilen izinler, bireysel konteyner uygulamalarından ziyade yönetilen ortama göre kapsamlıdır. Bir rota oluşturmak, güncellemek veya silmek için ortamın izni gereklidir Microsoft.App/managedEnvironments/httpRouteConfigs/write . Hedef konteyner uygulaması için ekstra izin gerekmez. Bu davranış, ortamın paylaşılan bir güven sınırı olmasıyla tutarlıdır; burada bir ortamdaki tüm konteyner uygulamaları aynı müşteriye aittir. Çevre kapsamında bir rolü olan ve httpRouteConfigs/write izin içeren herhangi bir yönetici, örneğin çevredeki katkı sağlayıcı, o ortamdaki herhangi bir konteyner uygulamasını hedefleyen rotalar oluşturabilir.

Important

HTTP rota yapılandırması, uygulamayı rota hedefi olarak yapılandırırsanız, dahili giriş (external: false) kullanan bir konteyner uygulamasını ortaya çıkarabilir. Bu external: false ayar, uygulamanın kendi FQDN'sinin görünürlüğünü kontrol eder. Bu yapılandırmayı kullanarak, ortam uygulamanın ortam düzeyinde bir rota üzerinden trafik almasını engellemez. Bir konteyner uygulamasının ortam dışından ulaşılmaz olmasını sağlamak için, onu herhangi bir HTTP rota yapılandırmasında hedef olarak referans vermeyin. Bunun yerine, uygulamayı kamuya açık rotası olmayan ayrı bir ortama yerleştirin veya gelen trafiği kısıtlamak için ağ düzeyinde kontroller kullanın.

Önkoşullar

Kurulum

  1. Cli'dan Azure'da oturum açmak için aşağıdaki komutu çalıştırın.

    az login
    
  2. CLI'nın en son sürümünü çalıştırdığınızdan emin olmak için yükseltme komutunu çalıştırın.

    az upgrade
    

    Hâlihazırda kullanılmakta olan modüller hakkında herhangi bir uyarıyı dikkate almayın.

  3. Geçerli uzantı veya modül yüklendikten sonra, Microsoft.App ve Microsoft.OperationalInsights ad alanlarını kaydedin.

    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

Ortam değişkenlerini oluşturma

Aşağıdaki ortam değişkenlerini oluşturun.

CONTAINER_APP_1_NAME="my-container-app-1"
CONTAINER_APP_1_IMAGE="mcr.microsoft.com/k8se/quickstart:latest"
CONTAINER_APP_1_TARGET_PORT="80"
CONTAINER_APP_2_NAME="my-container-app-2"
CONTAINER_APP_2_IMAGE="mcr.microsoft.com/dotnet/samples:aspnetapp"
CONTAINER_APP_2_TARGET_PORT="8080"
LOCATION="eastus"
RESOURCE_GROUP="my-container-apps"
ENVIRONMENT_NAME="my-container-apps-env"
ROUTE_CONFIG_NAME="my-route-config"

Kapsayıcı uygulamaları oluşturun

  1. İlk kapsayıcı uygulamanızı oluşturmak için aşağıdaki komutu çalıştırın. Bu kapsayıcı uygulaması Container Apps hızlı başlangıç görüntüsünü kullanır.

    az containerapp up \
      --name $CONTAINER_APP_1_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_APP_1_IMAGE \
      --target-port $CONTAINER_APP_1_TARGET_PORT \
      --ingress external \
      --query properties.configuration.ingress.fqdn
    
  2. İkinci kapsayıcı uygulamanızı oluşturmak için aşağıdaki komutu çalıştırın. Bu kapsayıcı uygulaması ASP.NET hızlı başlangıç görüntüsünü kullanır.

    az containerapp up \
      --name $CONTAINER_APP_2_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_APP_2_IMAGE \
      --target-port $CONTAINER_APP_2_TARGET_PORT \
      --ingress external \
      --query properties.configuration.ingress.fqdn
    
  3. HTTP yol yapılandırması oluşturma.

    Aşağıdaki dosyayı oluşturun ve olarak routing.ymlkaydedin.

    rules:
      - description: App 1 rule
        routes:
          - match:
              prefix: /app1
            action:
              prefixRewrite: /
        targets:
          - containerApp: my-container-app-1
      - description: App 2 rule
        routes:
          - match:
              path: /app2
            action:
              prefixRewrite: /
          - match:
              path: /
        targets:
          - containerApp: my-container-app-2
    

    Bu yapılandırma, HTTP trafiği için iki yönlendirme kuralı tanımlar.

    Uyarı

    Yönlendirme kurallarının sırası önemlidir.

    Daha belirli öneklerin, daha az belirli öneklerden önce gelmesi gerekir.

    Örneğin, ilk kural /api ön eki ile eşleşiyorsa, ikinci kural /api/v1 ön ekini kullansa bile bu kullanılır.

    Mülkiyet Açıklama
    description Kural için insan tarafından okunabilir etiket
    routes.match.prefix Eşleşecek URL yolu ön eki. Örneğin, /api.
    routes.action.prefixRewrite İletmeden önce eşleşen ön ekin yerine ne koyabilirsiniz?
    targets.containerApp Eşleşen yol isteğinin gönderildiği kapsayıcı uygulamasının adı.

    Bu kurallar, etki alanınızdaki farklı yolların farklı kapsayıcı uygulamalarına yönlendirilmesine olanak sağlarken, hedef uygulamaya ulaşmadan önce istek yolunu da değiştirir.

    Yollarınızı etkileyebilecek, listelenmeyen diğer özellikler şunlardır.

    Mülkiyet Açıklama
    route.match.path Tam eşleşme yol tanımı.
    route.match.pathSeparatedPrefix Herhangi bir metin yerine '/' sınırlarındaki yolları eşleştirir. Örneğin, değeri /product olarak ayarlarsanız, /product/1 üzerinde eşleşir, ancak /product1 üzerinde eşleşmez.
    route.match.caseSensitive Yol desenlerinin büyük/küçük harf duyarlılığıyla eşleşip eşleşmediğini denetler.
    target.label Kapsayıcı uygulamasında belirli bir etiketli düzeltmeye yönlendirme.
    target.revision Kapsayıcı uygulamasında belirli bir düzeltmeye yönlendirme.
  4. HTTP yol yapılandırmasını oluşturmak için aşağıdaki komutu çalıştırın.

    az containerapp env http-route-config create \
      --http-route-config-name $ROUTE_CONFIG_NAME \
      --resource-group $RESOURCE_GROUP \
      --name $ENVIRONMENT_NAME \
      --yaml routing.yml \
      --query properties.fqdn
    

    HTTP yol yapılandırmanızın tam nitelikli etki alanı adı (FQDN) şu örneğe benzer: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io

  1. Her iki kapsayıcı uygulamanın da zaten var olduğundan emin olun.

  2. Aşağıdaki Bicep dosyasını oluşturun ve routing.bicep dosya adı olarak kaydedin.

    resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2024-10-02-preview' = {
      name: 'my-container-apps-env'
      location: 'eastus'
      tags: {}
      properties: {
        workloadProfiles: [
            {
                workloadProfileType: 'Consumption'
                name: 'Consumption'
            }
        ]
      }
    }
    
    resource httpRouteConfig 'Microsoft.App/managedEnvironments/httpRouteConfigs@2024-10-02-preview' = {
      parent: containerAppsEnvironment
      name: 'my-route-config'
      location: 'eastus'
      properties: {
        rules: [
            {
                description: 'App 1 rule'
                routes: [
                    {
                        match: {
                            prefix: '/app1'
                        }
                        action: {
                            prefixRewrite: '/'
                        }
                    }
                ]
                targets: [
                    {
                        containerApp: 'my-container-app-1'
                    }
                ]
            }
            {
                description: 'App 2 rule'
                routes: [
                    {
                        match: {
                            path: '/app2'
                        }
                        action: {
                            prefixRewrite: '/'
                        }
                    }
                    {
                        match: {
                            path: '/'
                        }
                    }
                ]
                targets: [
                    {
                        containerApp: 'my-container-app-2'
                    }
                ]
            }
        ]
      }
    }
    
    output fqdn string = httpRouteConfig.properties.fqdn
    
  3. Bicep dosyasını aşağıdaki komutla dağıtın:

    az deployment group create `
      --name $ROUTE_CONFIG_NAME `
      --resource-group $RESOURCE_GROUP `
      --template-file routing.bicep
    
  4. Çıktıda, HTTP yol yapılandırmanızın tam etki alanı adını (FQDN) içeren outputs öğesini bulun. Örneğin:

        "outputs": {
          "fqdn": {
            "type": "String",
            "value": "my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io"
          }
        },
    

HTTP yol yapılandırmasını doğrulama

  1. HTTP yol yapılandırması FQDN'nize /app1 yolu ile gidin.

    Örneğin: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app1.

    Container Apps hızlı başlangıç görüntüsünü görürsünüz.

  2. HTTP yol yapılandırması FQDN'nize /app2 yolu ile gidin.

    Örneğin: my-route-config.ambitiouspebble-11ba6155.eastus.azurecontainerapps.io/app2.

    ASP.NET hızlı başlangıç görüntüsünü görürsünüz.

Kaynakları temizleme

Bu uygulamayı kullanmaya devam etmeyecekseniz, bu hızlı başlangıçta oluşturulan tüm kaynaklarla birlikte kaynak grubunu silmek için aşağıdaki komutu çalıştırın.

Dikkat

Aşağıdaki komut, belirtilen kaynak grubunu ve içindeki tüm kaynakları siler. Bu hızlı başlangıcın kapsamı dışındaki kaynaklar belirtilen kaynak grubunda varsa, bunlar da silinir.

az group delete --name my-container-apps