Déploiement Kubernetes XProf pour le profilage distribué

Ce document explique comment déployer XProf dans une configuration distribuée sur Kubernetes, en utilisant des déploiements distincts pour les nœuds de calcul et un agrégateur.

Architecture du worker agrégateur XProf pour Kubernetes

Prérequis

  • Un cluster Kubernetes. Pour une configuration minimale dans ce tutoriel, nous utilisons minikube.
  • Une image Docker de XProf. Consultez Créer une image Docker XProf pour savoir comment en créer une.

Configuration Kubernetes

Les configurations YAML suivantes définissent les déploiements et les services Kubernetes pour les nœuds de calcul et un agrégateur XProf.

Le déploiement de l'agrégateur exécute un seul réplica qui reçoit les requêtes des utilisateurs et distribue les tâches de profilage aux réplicas de nœud de calcul à l'aide d'une stratégie de type "round robin". L'indicateur --worker_service_address configure l'agrégateur pour qu'il envoie des requêtes au service de nœud de calcul.

Le déploiement de nœuds de calcul exécute plusieurs répliques, chacune exposant un port gRPC via le flag --grpc_port pour écouter les tâches de traitement de l'agrégateur.

Agrégateur

Commençons par créer le fichier agg.yaml et collons-y le contenu :

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

Nœud de calcul

Pour le worker, nous créons le fichier 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

Configuration de Minikube

Pour déployer notre configuration, exécutez la commande suivante :

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

Vous devriez pouvoir inspecter les objets déployés :

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

Connectons-nous maintenant à notre agrégateur :

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.

Vous pouvez maintenant y accéder dans votre navigateur :

Page de destination de l&#39;agrégateur XProf