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.

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 :
