En este documento, se describe cómo implementar XProf en una configuración distribuida en Kubernetes, con implementaciones separadas para los trabajadores y un agregador.

Requisitos previos
- Un clúster de Kubernetes. Para una configuración mínima en este instructivo, usaremos minikube.
- Es una imagen de Docker de XProf. Consulta Cómo compilar una imagen de Docker de XProf para obtener instrucciones sobre cómo compilar una.
Configuración de Kubernetes
Las siguientes configuraciones de YAML definen las implementaciones y los servicios de Kubernetes para los trabajadores de XProf y un agregador.
La implementación del agregador ejecuta una sola réplica que recibe solicitudes de los usuarios y distribuye tareas de generación de perfiles a las réplicas de trabajadores con una política de turnos rotativos.
La marca --worker_service_address configura el agregador para que envíe solicitudes al servicio de trabajador.
La implementación del trabajador ejecuta varias réplicas, cada una de las cuales expone un puerto gRPC a través de la marca --grpc_port para escuchar las tareas de procesamiento del agregador.
Agregador
Primero, crearemos el archivo agg.yaml y pegaremos el contenido:
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
Trabajador
Para el trabajador, creamos el archivo 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
Configuración de Minikube
Para implementar nuestra ejecución de configuración, haz lo siguiente:
kubectl apply -f worker.yaml
kubectl apply -f agg.yaml
Deberías poder inspeccionar los objetos implementados:
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
Ahora, conectémonos a nuestro agregador:
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.
Ahora puedes acceder a él en tu navegador:
