Implementación de XProf Kubernetes para la generación de perfiles distribuidos

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.

Arquitectura del trabajador del agregador de XProf para Kubernetes

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:

Página de destino del agregador de XProf