我正在尝试在 k8s 集群上使用 linkerd 实现 gRPC 消息的负载平衡。
k8s 集群是使用 microk8s 设置的。k8s 是 1.23.3 版本,linkerd 是 stable-2.11.1 版本。
我有一个服务器和一个客户端应用程序,都是 c# 代码。客户端通过流发送 100 条消息,服务器以消息响应。服务器位于复制 3 次的部署中。
在部署旁边有一个 NodePort 服务,因此客户端可以访问服务器。
部署.yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: greeter
labels:
app: greeter
spec:
replicas: 3
selector:
matchLabels:
app: greeter
template:
metadata:
labels:
app: greeter
spec:
containers:
- name: greeter
image: grpc-service-image
imagePullPolicy: "Always"
ports:
- containerPort: 80
resources:
limits:
cpu: "0.5"
---
apiVersion: v1
kind: Service
metadata:
name: greeter
labels:
app: greeter
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 31111
protocol: TCP
selector:
app: greeter
为了启动服务器部署,我使用命令确保将 linkerd 注入到部署中:
cat deployment.yaml | linkerd inject - | kubectl apply -f -
此设置能够在客户端和服务之间进行通信。但是通信总是到同一个 pod。
所以我的问题:
- 我在某处读到负载平衡是在客户端完成的,这是真的吗?这是否意味着我需要添加入口才能使负载平衡正常工作?或者负载平衡如何与 linkerd 和 gRPC 一起工作?
- 负载平衡是否适用于 NodePort 设置,或者这不是必需的?
- 关于如何解决这个问题的任何建议?