ACR_NAME="<YOUR_ACR_NAME>"
# OTEL Collector
docker pull otel/opentelemetry-collector-contrib:latest
docker tag otel/opentelemetry-collector-contrib:latest ${ACR_NAME}.azurecr.io/otel/opentelemetry-collector-contrib:latest
docker push ${ACR_NAME}.azurecr.io/otel/opentelemetry-collector-contrib:latest
# Zipkin
docker pull openzipkin/zipkin:latest
docker tag openzipkin/zipkin:latest ${ACR_NAME}.azurecr.io/openzipkin/zipkin:latest
docker push ${ACR_NAME}.azurecr.io/openzipkin/zipkin:latest
# Prometheus
docker pull prom/prometheus:latest
docker tag prom/prometheus:latest ${ACR_NAME}.azurecr.io/prom/prometheus:latest
docker push ${ACR_NAME}.azurecr.io/prom/prometheus:latest
# Aspire Dashboard
docker pull mcr.microsoft.com/dotnet/aspire-dashboard:latest
docker tag mcr.microsoft.com/dotnet/aspire-dashboard:latest ${ACR_NAME}.azurecr.io/dotnet/aspire-dashboard:latest
docker push ${ACR_NAME}.azurecr.io/dotnet/aspire-dashboard:latest
cd /helm-otel-chd
helm package .
helm push <helm-chart-name>-<version>.tgz oci://<ACR_NAME>.azurecr.io/<target_repo>
|
|
Ersetzen Sie alle <PLACEHOLDER>-Werte in helm-otel-chd/values-azure.yaml.
|
acrToken:
enabled: true
registry: "<YOUR_ACR_NAME>.azurecr.io"
tokenName: "<TOKEN_NAME>"
tokenPassword: "<TOKEN_PASSWORD>"
secretName: "<SECRET_NAME>"
otelCollector:
image:
repository: <YOUR_ACR_NAME>.azurecr.io/otel/opentelemetry-collector-contrib
prometheus:
image:
repository: <YOUR_ACR_NAME>.azurecr.io/prom/prometheus
zipkin:
image:
repository: <YOUR_ACR_NAME>.azurecr.io/openzipkin/zipkin
aspireDashboard:
image:
repository: <YOUR_ACR_NAME>.azurecr.io/dotnet/aspire-dashboard
az aks get-credentials \
--resource-group <AKS_RESOURCE_GROUP> \
--name <AKS_NAME>
kubectl get namespace
helm upgrade --install <release_name> \
oci://<ACR_NAME>.azurecr.io/<PATH_TO_HELM_REPO> \
--version <VERSION> -n <NAMESPACE> --create-namespace -f values-azure.yaml
otel:
enableOtelCollector: true
otelExporterEndpoint: "otel-collector-chd.cbai-otel.svc.cluster.local:4317"
|
|
Der vollständige FQDN, <service>.<namespace>.svc.cluster.local, ist erforderlich, da cb-ai-service im cb-ai-service Namespace ausgeführt wird, während der OTel-Stack im cbai-otel Namespace ausgeführt wird.
|
exporters:
zipkin:
endpoint: "http://ZIPKIN_SERVICE:9411/api/v2/spans"
format: json
exporters:
prometheus:
endpoint: "0.0.0.0:8889"
namespace: "cbai"
send_timestamps: true
resource_to_telemetry_conversion:
enabled: true
exporters:
"otlp/aspire":
endpoint: "ASPIRE_SERVICE:18889"
tls:
insecure: true
cd /helm-chd
helm package .
helm push <helm-chart-name>-<version>.tgz oci://<ACR_NAME>.azurecr.io/<target_repo>
# -------------------------------
# ACR Token Configuration
# -------------------------------
acrToken:
enabled: true
registry: "<ACR_NAME>.azurecr.io"
tokenName: "<ACR_TOKEN_USERNAME>"
tokenPassword: "<ACR_TOKEN_PASSWORD>"
secretName: "<secret_name>"
# -------------------------------
# Image Configuration
# -------------------------------
image:
domain: "<ACR_NAME>.azurecr.io"
repository: "<repository_name>"
pullPolicy: IfNotPresent
tag: "<IMAGE_TAG>"
# -------------------------------
# Workload Identity
# -------------------------------
workloadIdentity:
enabled: true
clientId: "<USER_ASSIGNED_MANAGED_IDENTITY_CLIENT_ID>"
tenantId: "<AZURE_TENANT_ID>"
tokenExpirationSeconds: 3600
# -------------------------------
# Azure Configuration
# -------------------------------
azure:
openai:
baseUrl: "https://<OPENAI_RESOURCE_NAME>.openai.azure.com/"
auth:
tenantId: "<AZURE_TENANT_ID>"
audience: "<APP_REGISTRATION_CLIENT_ID>"
az aks get-credentials \
--resource-group <AKS_RESOURCE_GROUP> \
--name <AKS_NAME>
helm upgrade --install cb-ai-service \
oci://<ACR_NAME>.azurecr.io/<PATH_TO_HELM_REPO> \
--version <VERSION> -n <NAMESPACE> -f values-azure-customer-hosted.yaml
az ad app credential reset \
--id <client_id> \
--display-name "cbai-client-secret" \
--years 1
python get_customer_hosted_token.py \
--client-id "<client_id>" \
--client-secret "<client_secret>" \
--tenant-id "<tenant_id>" \
--scope "api://<client_id>/.default" \
--json
|
Parameter
|
Beschreibung
|
|---|---|
|
--client-id
|
Anwendungs-ID (Client-ID) aus der Azure-App-Registrierung.
|
|
--client-secret
|
Zuvor erstelltes Client-Geheimnis.
|
|
--tenant-id
|
Azure AD-Mandanten-ID
|
|
--scope
|
API-Umfang. Dieser muss mit der in Helm konfigurierten Zielgruppe übereinstimmen.
|
|
--json
|
Geben Sie das Token im JSON-Format aus.
|
curl --location 'http://<SERVICE_IP>/cb-ai-service/requirement-evaluation/v1' --header 'Accept-Language: string' --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'Authorization: Bearer <TOKEN>' --data '{
"requirement": {
"summary": "Advanced Navigation",
"description": {
"value": "Die Batteriesoll dem Bordcomputer dem Autos eine Spannung von fast 28 VDC liefern.",
"valueType": "TEXT"
}
},
"standards": [
"INCOSE_RULES_4_0"
],
"ruleFilters": {
"INCOSE_RULES_4_0": {
"en": "R34,R18-R34,R12",
"de": "R7,R33,R27"
}
}
}'
|
|
Es wird empfohlen bei neuen Bereitstellungen zunächst mit Pay‑As‑You‑Go‑SKUs wie DataZoneStandard oder GlobalStandard zu beginnen und erst in einem nachfolgenden Terraform‑apply auf PTU umzusteigen, sobald die Bereitstellung stabil ist.
Die Bereitstellung von PTU‑Modellen dauert im Vergleich zu Pay-As-You-Go‑Bereitstellungen länger. Wenn Terraform das Cognitive‑Services‑Konto, den privaten Endpunkt, die private DNS‑Zone und die PTU‑Bereitstellung in einem einzigen "apply" erstellt, kann die Bereitstellung der PTU in Azure 5–20 Minuten oder länger dauern – selbst nachdem Terraform bereits eine erfolgreiche Bereitstellung gemeldet hat. Während dieser Zeit ist die DNS‑Auflösung des privaten Endpunkts für die PTU‑Bereitstellung noch nicht vollständig propagiert, was dazu führt, dass API‑Aufrufe vom cb‑ai‑service fehlschlagen.
Fehler in cb-ai-service pod Protokollen oder curl:
{"event": "Error code: 403 - {'error': {'code': '403', 'message': 'Traffic is not from an approved private endpoint.'}}", "dd.trace_id": "ecfb4368512eba7e0b2a0aa20caf24a3", "dd.span_id": "563883118223141984", "timestamp": "2026-04-06 04:16:45", "level": "error", "logger": "cbai.cb_ai_service.exception_handlers"}
Dies ist ein Zeitproblem. Die Private-Link-Integration der PTU-Bereitstellung wird weiterhin propagiert, während Anforderungen gesendet werden. In den meisten Fällen behebt sich der Fehler nach 45–60 Minuten von selbst, abhängig von der Azure‑Bereitstellungsdauer.
|