Linkerd загружает службы gRPC неожиданным образом
Я пытаюсь решить проблему балансировки нагрузки gRPC с помощью linkerd, но запросы будут равномерно распределяться только тогда, когда все службы развернуты на одном узле. Если я разверну серверы на другом узле, все запросы будут направлены на один из них.
И служба 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 сервисам.
1 ответ
Для настройки сетки сервиса Linkerd каждый узел будет иметь Linkerd. Здесь не будет service-to-service
прямая связь через узлы, только Linkerd разрешено общаться с другим Linkerd. А Linkerd будет связываться со службами, которые создаются в одном узле.
В вашем случае вы, служба Kubernetes, будете общаться с Linkerd, затем Linkerd распространит свой запрос среди всех других Linkerd. Вот как запросы распределяются по узлам. Затем восходящий Linkerd будет распределять запросы между службами на своем узле.
Чтобы получить больше, проверьте это: linkerd-as-a-service-mesh