EKS 上的 AWS NLB 粘性会话

Posted

技术标签:

【中文标题】EKS 上的 AWS NLB 粘性会话【英文标题】:AWS NLB stickysession on EKS 【发布时间】:2021-11-04 23:28:07 【问题描述】:

我正在尝试在 EKS 环境中应用 NLB 粘性会话。

有 2 个工作节点(EC2)连接到 NLB 目标组,每个节点有 2 个 nginx pod。

我想连接到本地系统上的同一个 pod 进行测试。

但每次尝试使用“curl”命令时,似乎都连接了不同的 pod。

这是我的测试 yaml 文件和测试命令。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: udptest
  labels:
     app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: container
        image: nginx 
        ports:
        - containerPort: 80
      nodeSelector:
        zone: a
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: udptest2
  labels:
     app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: container
        image: nginx 
        ports:
        - containerPort: 80
      nodeSelector:
        zone: c
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-nlb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
#!/bin/bash
number=0

while :
do
    if [ $number -gt 2 ]; then
        break
    fi
curl -L -k -s -o /dev/null -w "%http_code\n" <nlb dns name>
done

我如何通过 NLB 的 sticy session 每次尝试连接到特定的 pod?

【问题讨论】:

【参考方案1】:

据我所知,当服务类型为 LoadBalancer 时,不支持 sessionAffinity 的 ClientIP 值。

您可以使用 Nginx 入口控制器并在那里实现亲和性。

https://kubernetes.github.io/ingress-nginx/examples/affinity/cookie/

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "test-cookie"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/affinity-mode: persistent
    nginx.ingress.kubernetes.io/session-cookie-hash: sha1
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: service
          servicePort: port

好文章:https://zhimin-wen.medium.com/sticky-sessions-in-kubernetes-56eb0e8f257d

【讨论】:

【参考方案2】:

您需要启用它:

annotations:
  service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
  service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: stickiness.enabled=true,stickiness.type=source_ip

【讨论】:

以上是关于EKS 上的 AWS NLB 粘性会话的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 AWS Elastic Beanstalk 中使用应用程序控制的会话粘性吗?

如何使用 Cloudformation 模板在 AWS Elastic Beanstalk 中包含粘性会话

EKS 上的网络负载均衡器与 AWS 负载均衡器控制器

使用 Nginx-Ingress-Controller 在 AWS 上的 EKS 中使用 gRPC

Kubernetes 集群上的粘性会话

EKS中的UDP负载平衡替代方案