Flow mit Kubernetes bereitstellen#

Zum Bereitstellen eines Flows mit Kubernetes sind vier Schritte erforderlich

  1. Erstellen Sie den Flow im Docker-Format.

  2. Erstellen Sie das Docker-Image.

  3. Erstellen Sie eine Kubernetes-Deployment-YAML-Datei.

  4. Wenden Sie das Deployment an.

Flow im Docker-Format erstellen#

Beachten Sie, dass alle abhängigen Verbindungen erstellt werden müssen, bevor sie im Docker-Format erstellt werden.

# create connection if not created before
pf connection create --file ../../../examples/connections/azure_openai.yml --set api_key=<your_api_key> api_base=<your_api_base> --name open_ai_connection

Verwenden Sie den folgenden Befehl, um einen Flow im Docker-Format zu erstellen

pf flow build --source <path-to-your-flow-folder> --output <your-output-dir> --format docker

Klicken Sie auf die folgende Schaltfläche, um einen Flow im Docker-Format zu erstellen: img

Beachten Sie, dass alle abhängigen Verbindungen erstellt werden müssen, bevor sie als Docker exportiert werden.

Ordnerstruktur im Docker-Format#

Die exportierte Dockerfile und ihre Abhängigkeiten befinden sich im selben Ordner. Die Struktur ist wie folgt:

  • flow: Der Ordner enthält alle Flow-Dateien

  • connections: Der Ordner enthält YAML-Dateien zum Erstellen aller zugehörigen Verbindungen

  • Dockerfile: Die Dockerfile zum Erstellen des Images

  • start.sh: Das Skript, das im CMD der Dockerfile verwendet wird, um den Dienst zu starten

  • runit: Der Ordner enthält alle Runit-Skripte

  • settings.json: Eine JSON-Datei zum Speichern der Einstellungen des Docker-Images

  • README.md: Kurze Einführung in die Dateien

Bereitstellung mit Kubernetes#

Wir verwenden das web-classification-Beispiel, um zu zeigen, wie mit Kubernetes bereitgestellt wird.

Stellen Sie sicher, dass Sie die Verbindung erstellt haben, die für den Flow erforderlich ist. Andernfalls können Sie sich auf die Einrichtung der Verbindung für web-classification beziehen.

Stellen Sie außerdem sicher, dass Sie alle erforderlichen Abhängigkeiten installiert haben. Eine umfassende Liste der Voraussetzungen und Installationsanweisungen finden Sie im Abschnitt „Voraussetzungen“ in der README-Datei von web-classification.

Docker-Image erstellen#

Wie bei anderen Dockerfiles müssen Sie das Image zuerst erstellen. Sie können das Image mit einem beliebigen Namen versehen. In diesem Beispiel verwenden wir web-classification-serve.

Führen Sie dann den folgenden Befehl aus

cd <your-output-dir>
docker build . -t web-classification-serve

Kubernetes-Deployment-YAML-Datei erstellen.#

Die Kubernetes-Deployment-YAML-Datei dient als Leitfaden für die Verwaltung Ihres Docker-Containers in einem Kubernetes-Pod. Sie gibt wichtige Informationen wie das Container-Image, Portkonfigurationen, Umgebungsvariablen und verschiedene Einstellungen klar an. Nachfolgend finden Sie eine einfache Deployment-Vorlage, die Sie einfach an Ihre Bedürfnisse anpassen können.

Hinweis: Sie müssen das Geheimnis zuerst mit base64 kodieren und <encoded_secret> als ‚open-ai-connection-api-key‘ in der Deployment-Konfiguration eingeben. Sie können zum Beispiel die folgenden Befehle unter Linux ausführen

encoded_secret=$(echo -n <your_api_key> | base64)
---
kind: Namespace
apiVersion: v1
metadata:
  name: <your-namespace>
---
apiVersion: v1
kind: Secret
metadata:
  name: open-ai-connection-api-key
  namespace: <your-namespace>
type: Opaque
data:
  open-ai-connection-api-key: <encoded_secret>
---
apiVersion: v1
kind: Service
metadata:
  name: web-classification-service
  namespace: <your-namespace>
spec:
  type: NodePort
  ports:
  - name: http
    port: 8080
    targetPort: 8080
    nodePort: 30123
  selector:
    app: web-classification-serve-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-classification-serve-app
  namespace: <your-namespace>
spec:
  selector:
    matchLabels:
      app: web-classification-serve-app
  template:
    metadata:
      labels:
        app: web-classification-serve-app
    spec:
      containers:
      - name: web-classification-serve-container
        image: <your-docker-image>
        imagePullPolicy: Never
        ports:
        - containerPort: 8080
        env:
        - name: OPEN_AI_CONNECTION_API_KEY
          valueFrom:
            secretKeyRef:
              name: open-ai-connection-api-key
              key: open-ai-connection-api-key

Deployment anwenden.#

Bevor Sie Ihre Anwendung bereitstellen können, stellen Sie sicher, dass Sie einen Kubernetes-Cluster eingerichtet und kubectl installiert haben, falls dies noch nicht geschehen ist. In dieser Dokumentation verwenden wir Minikube als Beispiel. Um den Cluster zu starten, führen Sie den folgenden Befehl aus

minikube start

Sobald Ihr Kubernetes-Cluster betriebsbereit ist, können Sie mit der Bereitstellung Ihrer Anwendung fortfahren, indem Sie den folgenden Befehl verwenden

kubectl apply -f deployment.yaml

Dieser Befehl erstellt die notwendigen Pods, um Ihre Anwendung innerhalb des Clusters auszuführen.

Hinweis: Sie müssen <pod_name> unten durch Ihren spezifischen pod_name ersetzen. Sie können diesen abrufen, indem Sie kubectl get pods -n web-classification ausführen.

Flow-Service-Protokolle des Containers abrufen#

Der Befehl kubectl logs wird verwendet, um die Protokolle eines Containers abzurufen, der in einem Pod ausgeführt wird. Dies kann für die Fehlerbehebung, Überwachung und Diagnose von Anwendungen, die in einem Kubernetes-Cluster bereitgestellt werden, nützlich sein.

kubectl -n <your-namespace> logs <pod-name>

Verbindungen#

Wenn der Dienst Verbindungen beinhaltet, werden alle zugehörigen Verbindungen als YAML-Dateien exportiert und in Containern neu erstellt. Geheimnisse in Verbindungen werden nicht direkt exportiert. Stattdessen exportieren wir sie als Referenz auf Umgebungsvariablen.

$schema: https://azuremlschemas.azureedge.net/promptflow/latest/OpenAIConnection.schema.json
type: open_ai
name: open_ai_connection
module: promptflow.connections
api_key: ${env:OPEN_AI_CONNECTION_API_KEY} # env reference

Sie müssen die Umgebungsvariablen im Container einrichten, damit die Verbindungen funktionieren.

Testen des Endpunkts#

  • Option 1

    Nachdem Sie den Dienst gestartet haben, können Sie eine Verbindung zwischen einem lokalen Port und einem Port im Pod herstellen. Dies ermöglicht es Ihnen, den Endpunkt bequem von Ihrem lokalen Terminal aus zu testen. Führen Sie dazu den folgenden Befehl aus

    kubectl port-forward <pod_name> <local_port>:<container_port> -n <your-namespace>
    

    Mit der Portweiterleitung können Sie den curl-Befehl verwenden, um den Endpunkt-Test zu starten

    curl https://:<local_port>/score --data '{"url":"https://play.google.com/store/apps/details?id=com.twitter.android"}' -X POST  -H "Content-Type: application/json"
    
  • Option 2

    minikube service web-classification-service --url -n <your-namespace> läuft als Prozess und erstellt einen Tunnel zum Cluster. Der Befehl stellt den Dienst direkt für jedes Programm zur Verfügung, das auf dem Host-Betriebssystem ausgeführt wird.

    Der obige Befehl ruft die URL eines Dienstes ab, der innerhalb eines Minikube Kubernetes-Clusters ausgeführt wird (z. B. http://:<assigned_port>), den Sie anklicken können, um mit dem Flow-Dienst in Ihrem Webbrowser zu interagieren. Alternativ können Sie den folgenden Befehl zum Testen des Endpunkts verwenden

    Hinweis: Minikube verwendet seinen eigenen externen Port anstelle von nodePort, um auf den Dienst zu lauschen. Ersetzen Sie also <assigned_port> durch den oben erhaltenen Port.

    curl https://:<assigned_port>/score --data '{"url":"https://play.google.com/store/apps/details?id=com.twitter.android"}' -X POST  -H "Content-Type: application/json"
    

Nächste Schritte#

  • Probieren Sie das Beispiel hier aus.