XProf-Kubernetes-Deployment für verteiltes Profiling

In diesem Dokument wird beschrieben, wie Sie XProf in einer verteilten Einrichtung in Kubernetes bereitstellen und dabei separate Deployments für Worker und einen Aggregator verwenden.

XProf Aggregator Worker-Architektur für Kubernetes

Vorbereitung

  • Einen Kubernetes-Cluster. Für eine minimale Einrichtung in diesem Tutorial verwenden wir minikube.
  • Ein Docker-Image von XProf. Eine Anleitung zum Erstellen eines XProf-Docker-Images finden Sie unter XProf-Docker-Image erstellen.

Kubernetes-Konfiguration

Die folgenden YAML-Konfigurationen definieren Kubernetes-Deployments und -Services für XProf-Worker und einen Aggregator.

Für die Aggregatorbereitstellung wird ein einzelnes Replikat ausgeführt, das Nutzeranfragen empfängt und Profiling-Aufgaben mithilfe einer Round-Robin-Richtlinie an die Worker-Replikate verteilt. Mit dem Flag --worker_service_address wird der Aggregator so konfiguriert, dass Anfragen an den Worker-Dienst gesendet werden.

Für die Worker-Bereitstellung werden mehrere Replikate ausgeführt, die jeweils einen gRPC-Port über das Flag --grpc_port zur Verfügung stellen, um auf Verarbeitungsaufgaben vom Aggregator zu warten.

Dienstleister

Erstellen wir zuerst die Datei agg.yaml und fügen wir den Inhalt ein:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xprof-aggregator-deployment
  labels:
    app: xprof-aggregator-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xprof-aggregator-app
  template:
    metadata:
      labels:
        app: xprof-aggregator-app
    spec:
      containers:
      - name: aggregator-container
        image: xprof:2.21.3
        imagePullPolicy: Never
        env:
        - name: GRPC_LB_POLICY
          value: "round_robin"
        - name: GRPC_DNS_RESOLVER
          value: "native"
        args:
          - "--port=10000"
          - "--worker_service_address=dns:///xprof-worker-service.default.svc.cluster.local:8891"
          - "-gp=50051"
          - "--hide_capture_profile_button"
        ports:
        - containerPort: 10000

---
apiVersion: v1
kind: Service
metadata:
  name: xprof-agg-service
  labels:
    app: xprof-aggregator-app
spec:
  selector:
    app: xprof-aggregator-app
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 10000
    nodePort: 30001

Worker

Für den Worker erstellen wir die Datei worker.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xprof-worker-deployment
  labels:
    app: xprof-worker-app
spec:
  replicas: 4
  selector:
    matchLabels:
      app: xprof-worker-app
  template:
    metadata:
      labels:
        app: xprof-worker-app
    spec:
      containers:
      - name: worker-container
        image: xprof:2.21.3
        imagePullPolicy: Never
        args:
          - "--port=9999"
          - "-gp=8891"
          - "--hide_capture_profile_button"
        ports:
        - containerPort: 8891

---
apiVersion: v1
kind: Service
metadata:
  name: xprof-worker-service
  labels:
    app: xprof-worker-app
spec:
  selector:
    app: xprof-worker-app
  clusterIP: None
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8891

Minikube einrichten

Führen Sie Folgendes aus, um unsere Einrichtung bereitzustellen:

kubectl apply -f worker.yaml
kubectl apply -f agg.yaml

Sie sollten bereitgestellte Objekte prüfen können:

kubectl get services
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes             ClusterIP   10.96.0.1      <none>        443/TCP          13h
xprof-agg-service      NodePort    10.96.13.172   <none>        8080:30001/TCP   13h
xprof-worker-service   ClusterIP   None           <none>        80/TCP           13h

Stellen wir nun eine Verbindung zu unserem Aggregator her:

minikube service xprof-agg-service --url
http://127.0.0.1:50609
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

Sie können jetzt in Ihrem Browser darauf zugreifen:

XProf-Aggregator-Landingpage