פריסת XProf Kubernetes לניתוח פרופילים מבוזר

במאמר הזה מוסבר איך לפרוס את XProf בהגדרה מבוזרת ב-Kubernetes, באמצעות פריסות נפרדות לעובדים ולמצבר.

ארכיטקטורת XProf Aggregator Worker ל-Kubernetes

דרישות מוקדמות

  • אשכול Kubernetes. במדריך הזה נשתמש ב-minikube כדי להגדיר הגדרה מינימלית.
  • קובץ אימג' של Docker של XProf. הוראות ליצירת קובץ אימג' של XProf Docker מפורטות במאמר בנושא יצירת קובץ אימג' של XProf Docker.

הגדרת Kubernetes

ההגדרות הבאות ב-YAML מגדירות פריסות ושירותים של Kubernetes עבור עובדי XProf ומצבר.

פריסת האגרגטור מפעילה רפליקה אחת שמקבלת בקשות ממשתמשים ומפיצה משימות פרופיל לרפליקות של העובדים באמצעות מדיניות של הקצאת משאבים לפי סדר מחזורי. הדגל --worker_service_address מגדיר את האגרגטור לשליחת בקשות לשירות העובד.

פריסת העובד מפעילה כמה רפליקות, שכל אחת מהן חושפת יציאת gRPC באמצעות הדגל --grpc_port כדי להאזין למשימות עיבוד מהמצבר.

אתר אגרגטור

קודם יוצרים קובץ agg.yaml ומדביקים בו את התוכן:

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.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

כדי לפרוס את ההגדרה שלנו, מריצים:

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

אפשר לבדוק אובייקטים שנפרסו:

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

עכשיו נתחבר לאתר האגרגטור:

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.

עכשיו אפשר לגשת אליו בדפדפן:

דף הנחיתה של אתר אגרגטור XProf