Развернуть геопространственную зону потребления (GCZ) на службе Kubernetes Azure (AKS)

Зона геопространственного потребления OSDU (GCZ) — это служба, которая обеспечивает расширенное управление и использование геопространственных данных. GCZ упрощает обработку сведений на основе расположения. Он абстрагирует технические сложности, позволяя программным приложениям получать доступ к геопространственным данным без необходимости иметь дело с сложными деталями. Предоставляя готовые службы карт, GCZ упрощает простую интеграцию с приложениями с поддержкой OSDU.

В этом руководстве показано, как развернуть службу геопространственного потребления (GCZ), интегрированную с Azure Data Manager для энергетики (ADME).


Предварительные условия

Создание регистрации приложений в идентификаторе Microsoft Entra

Чтобы развернуть GCZ, необходимо создать регистрацию приложений в идентификаторе Microsoft Entra. Регистрация приложений используется для проверки подлинности API GCZ с помощью Azure Data Manager для энергетики, чтобы создать кэш геопространственных данных.

  1. Инструкции по созданию регистрации приложений см. в разделе "Создание регистрации приложений" в идентификаторе Microsoft Entra.

  2. Предоставьте разрешение на регистрацию приложений для чтения соответствующих данных в Azure Data Manager для энергетики. Дополнительные инструкции см. в статье о добавлении участников в группу OSDU.

Развертывание диаграммы HELM для геопространственной зоны потребления (GCZ)

  1. Клонируйте репозиторий GCZ в локальную среду:

    git clone https://community.opengroup.org/osdu/platform/consumption/geospatial.git
    
  2. Измените каталог в папку geospatial :

    cd geospatial/devops/azure/charts/geospatial
    
  3. Определите переменные для развертывания:

    # OSDU / Azure Identity Configuration
    export AZURE_DNS_NAME="<YOUR_OSDU_INSTANCE_FQDN>"  # Example: osdu-ship.msft-osdu-test.org
    export AZURE_TENANT_ID="<TENANT_ID_of_target_OSDU_deployment>"   # Entra ID tenant ID. Example: aaaabbbb-0000-cccc-1111-dddd2222eeee
    export AZURE_CLIENT_ID="<CLIENT_ID_of_target_OSDU_deployment>"  # App Registration client ID that was created earlier in `Create an App Registration in Microsoft Entra ID`. Example: 00001111-aaaa-2222-bbbb-3333cccc4444
    export AZURE_CLIENT_SECRET="<CLIENT_SECRET_of_target_OSDU_deployment>"  # App Registration client secret that was created earlier in `Create an App Registration in Microsoft Entra ID`. Example: Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
    export CLIENT_SECRET_B64=$(echo -n "$AZURE_CLIENT_SECRET" | base64 -w0)
    export AZURE_APP_ID="<CLIENT_ID_of_the_adme-app-id_for_authentication>" # Client ID of the App Registration that was used to create your ADME instance. Example: 00001111-aaaa-2222-bbbb-3333cccc4444
    export AZURE_KEY_VAULT_URL="<YOUR_AZURE_KEYVAULT_URL>"
    
    # OAuth Redirect URL
    export CALLBACK_URL="<CALLBACK_URL_configured_in_Entra_ID_App>"  # Example: http://localhost:8080
    export PRIVATE_NETWORK="true"
    
    # Container Registry + GCZ Images
    export AZURE_ACR="msosdu.azurecr.io"
    export GCZ_PROVIDER_IMAGE_NAME="geospatial-provider"
    export GCZ_PROVIDER_IMAGE_TAG="0.28.2"
    export GCZ_TRANSFORMER_IMAGE_NAME="geospatial-transformer"
    export GCZ_TRANSFORMER_IMAGE_TAG="0.28.2"
    
    # Istio Configuration (Enable ONLY if Istio exists on AKS)
    export ISTIO_ENABLED="false"
    export ISTIO_GCZ_DNS_HOST="<YOUR_GCZ_ISTIO_HOSTNAME>"   # Example: gcz.contoso.com
    export ISTIO_GATEWAY_NAME="<YOUR_ISTIO_GATEWAY_NAME>"   # Example: istio-system/ingressgateway
    
    # Data Partition for GCZ
    export DATA_PARTITION_ID="<YOUR_DATA_PARTITION_ID>"  # Example: opendes
    
    # AKS Deployment Configuration
    export RESOURCE_GROUP="<YOUR_AKS_RESOURCE_GROUP>"
    export AKS_NAME="<YOUR_AKS_CLUSTER_NAME>"
    export NAMESPACE="ignite"  # Recommended default namespace
    export GCZ_IGNITE_SERVICE="osdu-gcz-service-gridgain-headless"  # Default Ignite Service name
    export GCZ_IGNITE_NAMESPACE="$NAMESPACE"
    
    # Helm Release Settings
    export CHART="osdu-gcz-service"
    export CHART_VERSION="1.28.0"
    export VERSION="0.28.2"
    
    # GCZ Config Loader JS Absolute Path
    export CONFIG_LOADER_JS_PATH=$(realpath ./../../../../gcz-provider/gcz-provider-core/config/configLoader.js)
    
    

  1. Создайте диаграмму HELM:

    cat > osdu_gcz_custom_values.yaml << EOF
    global:
      provider:
        entitlementsGroupsURL: "https://${AZURE_DNS_NAME}/api/entitlements/v2/groups"
        image:
          repository: "$AZURE_ACR"
          name: "$GCZ_PROVIDER_IMAGE_NAME"
          tag: "$GCZ_PROVIDER_IMAGE_TAG"
        gcz_ignite_service: $GCZ_IGNITE_SERVICE
        service:
          port: 8083
          targetPort: 8083
        configuration:
          privateNetwork: "$PRIVATE_NETWORK"
      transformer:
        image:
          repository: "$AZURE_ACR"
          name: "$GCZ_TRANSFORMER_IMAGE_NAME"
          tag: "$GCZ_TRANSFORMER_IMAGE_TAG"
        serviceAccount: "osdu-gcz-service-gridgain"
        service:
          port: 8080
          targetPort: 8080
        configuration:
          dataPartitionId: $DATA_PARTITION_ID
          clientId: $AZURE_CLIENT_ID
          tenantId: $AZURE_TENANT_ID
          callbackURL: $CALLBACK_URL
          keyvaultURL: $AZURE_KEY_VAULT_URL
          searchQueryURL: "https://${AZURE_DNS_NAME}/api/search/v2/query"
          searchCursorURL: "https://${AZURE_DNS_NAME}/api/search/v2/query_with_cursor"
          schemaURL: "https://${AZURE_DNS_NAME}/api/schema-service/v1/schema"
          entitlementsURL: "https://${AZURE_DNS_NAME}/api/entitlements/v2"
          fileRetrievalURL: "https://${AZURE_DNS_NAME}/api/dataset/v1/retrievalInstructions"
          crsconvertorURL: "https://${AZURE_DNS_NAME}/api/crs/converter/v3/convertTrajectory"
          storageURL: "https://${AZURE_DNS_NAME}/api/storage/v2/records"
          partitionURL: "http://partition.osdu-azure/api/partition/v1"
          clientSecret: $CLIENT_SECRET_B64
          gcz_persistence_enabled: true
          azureAppResourceId: $AZURE_APP_ID
          gcz_ignite_service: $GCZ_IGNITE_SERVICE
      istio:
        enabled: $ISTIO_ENABLED
        gateways:
          - istio-system/$ISTIO_GATEWAY_NAME
        cors: {}
        dns_host: ${ISTIO_GCZ_DNS_HOST}
    EOF
    

  1. Измените тип службы на LoadBalancer для файлов конфигурации служб provider.

    cat > ../provider/templates/service.yaml << EOF
    apiVersion: v1
    kind: Service
    metadata:
     name: gcz-provider
     namespace: {{ .Release.Namespace }}
     annotations:
       service.beta.kubernetes.io/azure-load-balancer-internal: "{{ $.Values.global.provider.configuration.privateNetwork }}"
    spec:
     selector:
      app: provider
     ports:
     - port: {{ .Values.global.provider.service.port | default 8083 }}
       protocol: TCP
       targetPort: 8083
     type: LoadBalancer
    EOF
    

  1. Измените тип службы на LoadBalancer для файлов конфигурации служб transformer.

    cat > ../transformer/templates/service.yaml << EOF
    apiVersion: v1
    kind: Service
    metadata:
     name: gcz-transformer
     namespace: {{ .Release.Namespace }}
     annotations:
       service.beta.kubernetes.io/azure-load-balancer-internal: "{{ $.Values.global.transformer.configuration.privateNetwork }}"
    spec:
     selector:
      app: transformer
     ports:
     - port: {{ .Values.global.transformer.service.port | default 8080 }}
       protocol: TCP
       targetPort: {{ .Values.global.transformer.service.targetPort | default 8080 }}
     type: LoadBalancer
    EOF
    

  1. Просмотрите файл application.yml конфигурации преобразователя, чтобы убедиться, что включены правильные схемы.

    nano ../transformer/application.yml
    

  1. Просмотрите файл koop-config.jsonконфигурации поставщика.

    nano ../provider/koop-config.json
    

  1. Аутентификация в кластере Azure Kubernetes Service (AKS):

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME --admin
    

  1. Создание пространства имен AKS:

    kubectl create namespace $NAMESPACE
    
  2. Развертывание зависимостей HELM:

    helm dependency build
    

  1. Разверните диаграмму GCZ HELM:

    helm upgrade -i "$CHART" . -n $NAMESPACE \
     -f osdu_gcz_custom_values.yaml \
     --set-file global.provider.configLoaderJs="../../../../gcz-provider/gcz-provider-core/config/configLoader.js" \
    

  1. Проверьте развертывание:
    kubectl get pods -n $NAMESPACE
    

Теперь вы увидите поды для служб provider, transformer, и gridgain.

  1. Затем запишите внешние IP-адреса для provider служб и transformer служб. Эти IP-адреса используются для подключения к конечным точкам API GCZ.

    kubectl get service -n $NAMESPACE
    

  1. Проверьте конечную точку gcz-provider путем перенаправления портов:

    kubectl port-forward -n $NAMESPACE service/gcz-provider 8083:8083
    curl "http://localhost:8083/ignite-provider/FeatureServer/layers/info"
    

  1. При возникновении проблем с конечной точкой gcz-provider попробуйте перезапустить развертывание:

    kubectl rollout restart deployment gcz-provider -n $NAMESPACE
    

  1. Проверьте конечную точку gcz-преобразователя путем перенаправления портов:

    kubectl port-forward -n $NAMESPACE service/gcz-transformer 8080:8080
    curl "http://localhost:8080/gcz/transformer/admin/v3/api-docs"
    

  1. При возникновении проблем с конечной точкой gcz-преобразователя попробуйте перезапустить развертывание:

    kubectl rollout restart deployment gcz-transformer -n $NAMESPACE
    

Внимание

Если вы хотите обновить файлы конфигурации (например, application.yml или koop-config.json), необходимо обновить конфигурацию AKS (configmap), а затем удалить существующие pods для служб provider и transformer. Модули pod повторно создаются с новой конфигурацией. Если изменить конфигурацию с помощью API GCZ, изменения не будут сохраняться после перезапуска pod.

Публикация API GCZ публично (необязательно)

Если вы хотите публично предоставлять API GCZ, вы можете использовать Azure Управление API (APIM). Azure Управление API позволяет безопасно предоставлять службу GCZ в Интернет, так как служба GCZ еще не имеет встроенной проверки подлинности и авторизации. С помощью APIM мы можем добавлять политики для защиты, мониторинга и управления API.

Предварительные условия

Внимание

Экземпляр Azure API Management необходимо внедрить в виртуальную сеть, которая может быть маршрутизирована в кластер AKS, чтобы иметь возможность взаимодействовать с API GCZ.

Добавьте API GCZ в систему управления API Azure

Скачивание спецификаций GCZ OpenAPI

  1. Скачайте две спецификации OpenAPI на локальный компьютер.

  2. Откройте каждый файл спецификации OpenAPI в текстовом редакторе и замените servers раздел соответствующими IP-адресами подсистемы балансировки нагрузки AKS GCZ Services.

    servers:
      - url: "http://<GCZ-Service-LoadBalancer-IP>/ignite-provider"
    

Добавить API GCZ в API Management Azure

  1. Перейдите к службе управления API Azure в портале Azure.

  2. В области навигации слева выберите API.

  3. Выберите Add API Key (Добавить ключ API).

  4. Выберите OpenAPI.

  5. Выберите Выберите файл и загрузите gcz-openapi-provider.yaml файл.

  6. В поле суффикса URL-адреса API введите ignite-provider.

  7. Нажмите кнопку создания.

  8. Повторите шаги для gcz-openapi-transformer.yaml файла, но используйте gcz/transformer/admin в качестве суффикса URL-адреса API.

    Добавление API GCZ в APIM

Настройка политик

Затем необходимо настроить политики для проверки веб-маркеров JSON (JWT).

Потребуются следующие сведения:

  • Ваш идентификатор клиента Microsoft Entra ID.
  • Идентификатор клиента Azure Data Manager для энергетики (или идентификатор клиента для выдачи токена, если он отдельный).

Примечание.

Если у вас есть несколько регистраций приложений, выдающих токены, можно добавить несколько <application-id> элементов в элемент <client-application-ids>.

  1. В новом Geospatial Consumption Zone - Provider API убедитесь, что выбрано все операции.

  2. В разделе "Входящий трафик" выберите ... , а затем редактор кода.

  3. Вставьте следующее определение политики в редакторе:

    <policies>
        <!-- Throttle, authorize, validate, cache, or transform the requests -->
        <inbound>
            <base />
            <validate-azure-ad-token tenant-id="%tenant-id%" failed-validation-httpcode="401">
            <client-application-ids>
                <application-id>%client-id%</application-id>
            </client-application-ids>
        </inbound>
        <!-- Control if and how the requests are forwarded to services  -->
        <backend>
            <base />
        </backend>
        <!-- Customize the responses -->
        <outbound>
            <base />
        </outbound>
        <!-- Handle exceptions and customize error responses  -->
        <on-error>
            <base />
        </on-error>
    </policies>
    
  4. Замените %tenant-id% на идентификатор клиента Microsoft Entra ID и %client-id% на идентификатор клиента Azure Data Manager для Energy.

  5. Выберите Сохранить.

  6. Повторите шаги для Geospatial Consumption Zone - Transformer API.