我使用 AWS 网络负载均衡器作为我的部署的 k8s 服务。我使用 NLB 而不是 ALB 的原因是我需要一个静态主机来在 Elastic Kubernetes Service (EKS) 中公开我的服务。我部署的NLB使用的是这样的yaml:
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-type: external
name: my-nlb
namespace: my-ns
spec:
ports:
- name: webport
port: 80
protocol: TCP
targetPort: 80
selector:
app: my-app
type: LoadBalancer
问题是,当我使用 2 个副本进行部署时,并检查它们是否被 NLB 选择。我做了一些测试,例如:
ab -c 100 -n 3000 http://AWS-NLB-Hostname
似乎所有请求都发送到同一个 pod。
我知道NLB正在使用哈希进行负载平衡,这是否意味着它会将来自同一IP的所有请求加载到同一目标?如果是这样(或不是),我应该做什么来解决这个问题?
因为我的服务是无状态的,所以我希望所有请求在所有 Pod 之间保持平衡。
我的猜测是,这正在按预期工作,并且您在 alb 上启用了会话粘性,或者 aws-load-balancer-controller 默认为会话粘性。
显然你可以通过使用强制 ip 来使用 ab 来验证这一点