1

我正在尝试使用 linkerd 解决 gRPC 负载平衡问题,但只有当所有服务都部署在同一节点上时,请求才会均匀分布。如果我在不同的节点上部署服务器,所有请求都将被定向到其中一个。

https://imgur.com/a/F2GcbuY

gRPC 服务和客户端都是 .Net 应用程序。Kubernetes 版本为 v1.12.3。Linkerd 版本是 stable-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

4

1 回答 1

1

要配置Linkerd服务网格,每个节点都会有一个 Linkerd。节点之间不会service-to-service直接通信,只允许Linkerd与另一个 Linkerd 通信。Linkerd 将与在同一节点中创建的服务进行通信。

在您的情况下,您的 Kubernetes 服务将与Linkerd 对话,然后 Linkerd 会将其请求分发给所有其他 Linkerd。这就是请求在节点之间分布的方式。然后上游 Linkerd 将在其节点上的服务之间分发请求。

在此处输入图像描述

要获得更多信息,请检查:linkerd-as-a-service-mesh

于 2018-12-23T05:41:58.890 回答