Kubernetes nginx 入口会话亲和性

Kubernetes nginx 入口会话亲和性

总结:我无法使用 Kubernetes 中的会话亲和性官方 nginx ingress helm 图表。我尝试过以下说明:

粘性会话 - nginx 入口控制器
在 Kubernetes 上使用会话亲和性

我也尝试过阅读服务处理。但是,我没有得到任何效果,请求被指向我的后端服务,然后由其无头服务进行负载平衡。

有关我的情况的更多信息:我有一个公共 API,在 Kubernetes 中运行三个 Pod,前面有一个 nginx 入口。集群在 AWS 上,并使用以下方式设置警察

对于第三方用户,我设置了摘要身份验证以便能够返回一些敏感数据。我使用了这个摘要认证包

一切都很好,在开发中运行良好。

然而,在我部署系统并为其提供三个无状态 pod 之后,第一个摘要请求将最终出现在一个 pod 上,而客户端的响应将最终出现在另一个 pod 上,从而破坏功能。

我遗漏了什么?我只想要客户端的 IP 地址始终将其请求发送到我部署中的单个 pod 上。

谢谢!

答案1

我找到了答案,你知道吗!当然,这是我自己的错。

问题是我尝试配置 nginx ingress 图表,但这不是解决问题的方法。nginx ingress 仅提供功能 - 您自己运行的服务提供所请求的行为。

在我部署的服务中,我有一个ingress-statement。在那里添加 cookies 注释解决了我的问题。

此外,内波穆森在评论中告知我,cookie即使是机器人用户,亲和力也会起作用。

下面是我自己的依赖于 nginx ingress 的服务的完整 Helm 图表:

# Default values for chart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
image:
  repository: [redacted]
  tag: [redacted]
  pullPolicy: IfNotPresent
  imagePullSecret: [redacted] # Must be registered with the namespace.
service:
  name: api
  type: ClusterIP
  externalPort: 8080
  internalPort: 8080
  livenessProbe: /alive
  readinessProbe: /ready
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: "cookie" # THIS WAS THE REQUIRED LINE.
    #kubernetes.io/tls-acme: 'true' # Kube Lego to obtain Let's Encrypt SSL certificates
  hosts:
    - [redacted]
  tls:
    - secretName: tls
      hosts:
        - [redacted]
hpa:
  minReplicas: 3
  maxReplicas: 10
  cpuAvg: 65
resources:
  limits:
    cpu: 200m
    memory: 512Mi
  requests:
    cpu: 100m
    memory: 128Mi
env:
- name: APPLICATION_ENV
  value: "production"
- name: TZ
  value: "Europe/Stockholm"

相关内容