Linkerd загружает службы gRPC неожиданным образом

Я пытаюсь решить проблему балансировки нагрузки gRPC с помощью linkerd, но запросы будут равномерно распределяться только тогда, когда все службы развернуты на одном узле. Если я разверну серверы на другом узле, все запросы будут направлены на один из них.

https://imgur.com/a/F2GcbuY

И служба gRPC, и клиент являются приложением.Net. Kubernetes версия v1.12.3. Версия Linkerd стабильна -2.1.0.

Вот конфигурация моей службы gRPC:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: demogrpc-deploy
  name: demogrpc
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demogrpc
  template:
    metadata:
      labels:
        app: demogrpc
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - topologyKey: kubernetes.io/hostname
            labelSelector:
              matchLabels:
                app: demogrpc
      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - image: 192.168.99.25:30000/demogrpchost:1.0.9
        imagePullPolicy: Always
        name: demogrpc
        env:
        - name: GRPC_HOST
          value: "127.0.0.1"
        - name: SERVICE_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: GRPC_PORT
          value: "8000"
        ports:
        - containerPort: 8000
          name: grpc
      imagePullSecrets:
      - name: kubernetes-registry
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demogrpc
  name: demogrpc
spec:
  clusterIP: None
  ports:
  - port: 8000
    targetPort: 8000
  selector:
    app: demogrpc

Как заставить балансировку нагрузки работать, когда службы развернуты на разных узлах?


Обновить:

Я ввел linkerd в мой клиент, и теперь он начал распределять запросы, но один из сервисов по-прежнему игнорируется балансировщиком нагрузки.


Обновить:

Я увеличил количество услуг до 5, а клиентов - 3, и произошло нечто интересное. Все сервисы получают запросы сейчас, но для каждого клиента их запросы распределяются по 4 сервисам.

https://imgur.com/dXdjTsR

1 ответ

Для настройки сетки сервиса Linkerd каждый узел будет иметь Linkerd. Здесь не будет service-to-service прямая связь через узлы, только Linkerd разрешено общаться с другим Linkerd. А Linkerd будет связываться со службами, которые создаются в одном узле.

В вашем случае вы, служба Kubernetes, будете общаться с Linkerd, затем Linkerd распространит свой запрос среди всех других Linkerd. Вот как запросы распределяются по узлам. Затем восходящий Linkerd будет распределять запросы между службами на своем узле.

Чтобы получить больше, проверьте это: linkerd-as-a-service-mesh

Другие вопросы по тегам