我正在尝试使用linkerd解决gRPC负载平衡问题,但是仅当所有服务都部署在同一节点上时,请求才会平均分配。如果我在其他节点上部署服务器,则所有请求都将定向到其中一个。
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
在不同节点上部署服务时,如何使负载平衡起作用?
更新:
我将链接器注入到客户端,它现在开始分发请求,但是负载平衡器仍然忽略了其中一项服务。
更新:
我将服务规模扩大到了5,客户3,发生了一些有趣的事情。所有服务现在都接收请求,但是对于每个客户端,他们的请求将分配给其中四个服务。
答案 0 :(得分:0)
要配置 Linkerd 服务网格,每个节点将具有一个Linkerd。节点之间将没有service-to-service
直接通信,仅允许 Linkerd 与另一个Linkerd进行通信。 Linkerd将与在同一节点中创建的服务进行通信。
在您的情况下,您的Kubernetes服务将与 Linkerd 对话,然后Linkerd会将其请求分发给所有其他Linkerd。这就是在节点之间分配请求的方式。然后上游Linkerd将在其节点上的服务之间分配请求。
要获取更多信息,请检查以下内容:linkerd-as-a-service-mesh