我找不到指定当附属部署使用多个副本扩展时 Kubernetes 服务行为方式的文档。
我假设有某种负载平衡。是否与服务类型有关?
此外,我希望在服务转发的请求中具有某种关联性(即,如果可能,所有具有特定后缀的请求应始终映射到同一个 pod,等等)。这是可以实现的吗?我见过的关闭是Ambassador,但这是服务级别的亲和力,而不是 pod 级别。
load-balancing kubernetes session-affinity kubernetes-ingress kubernetes-service
OpenShift 容器平台 3.11
假设在同一命名空间中设置了一个客户端 Pod 和三个相同的服务器 Pod。服务器 Pod 可通过以下服务获得:
apiVersion: v1
kind: Service
metadata:
name: server
spec:
ports:
- name: "8200"
port: 8200
targetPort: 8200
selector:
test.service: server
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800 # default
Run Code Online (Sandbox Code Playgroud)
该sessionAffinity: ClientIP
声明规定,只要客户端具有相同的 IP,其请求就会转发到同一服务器 pod(除非达到 timeoutSeconds)。这个设置按预期工作了几个月,直到请求突然分配到两个服务器 Pod 之间。重新启动客户端 Pod 暂时解决了该问题,并且请求仅在一段时间内转发到一个服务器 Pod。然而几天后,同样的问题又出现了。
我的问题:是否有任何有关 OpenShift 服务的信息,并sessionAffinity: ClientIP
解释了为什么来自同一客户端且 IP 未更改的请求可能会“突然”分布在两个服务器 Pod 之间?
一些额外的上下文:
客户端 Pod 在连接到服务器 Pod 时会收到会话令牌(不是 Cookie)。会话令牌缓存在服务器 Pod 内部,但不在服务器 Pod 之间共享。因此,当客户端连接到不同的服务器时,它将收到会话令牌的权限被拒绝。然后客户端请求一个新的会话令牌。如果客户端的请求被转发到同一个服务器 Pod,并且仅有时服务器发生更改(例如,因为第一个服务器崩溃),则上述设置可以正常工作。但是,如果客户端的请求分布在两个或多个服务器之间,则会话令牌将在每第二个或第三个请求时失效。
这是我的问题:我在 kubernetes yaml 文件中定义了 3 个服务:
我需要有状态服务的会话关联性,但不需要无状态服务或前端服务。我需要会话亲和力基于 cookie,而不是基于 clientIP。
mydomain/stateful ===> Front-End Service (3 pods) ===> Stateful Service (3 pods, need session affinity)
mydomain/stateless ===> Front-End Service (3 pods) ===> Stateless Service (3 pods, do not need session affinity)
Run Code Online (Sandbox Code Playgroud)
我尝试使用 Ingress 服务,但我不知道如何使用它作为 Kubernetes 集群内两个服务之间的代理。我看到的所有示例都展示了如何使用 Ingress 作为来自集群外部的请求的路由器。
到目前为止,这是我的 poc.yaml:
####################################################################
######################### STATEFUL BACKEND #########################
# Deployment for pocbackend containers, listening on port 3000
apiVersion: apps/v1
kind: Deployment
metadata:
name: stateful-deployment
spec:
replicas: 3
selector:
matchLabels:
app: stateful-backend
tier: …
Run Code Online (Sandbox Code Playgroud) session-cookies kubernetes sticky-session session-affinity kubernetes-ingress
TL;DR:我想在 K8s 中通过 SSL 直通的 nginx-ingress 控制器设置基于 cookie 的会话关联 - 这可以完成吗?
大家好,
我有一个正在运行的 Azure Kubernetes 服务 (AKS) (1.11.3),并配置了NGINX-Ingress控制器以将请求路由到我的应用程序的 ClusterIP 服务(至少有 2 个正在运行的 Pod)。
我已在入口控制器上成功配置 SSL 直通,以便 TLS 在 Pod 处终止,这样我就可以使用 HTTP2(根据本文)。现在我想设置会话亲和性(使用 Cookie),以便将连接路由到同一 pod 以实现有状态行为(登录到应用程序)。
为此,我尝试在入口对象上使用以下注释:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
Run Code Online (Sandbox Code Playgroud)
但是,我没有看到第一个请求返回的“路由”cookie。我已经解决了此处描述的问题,并确保入口设置正确。然后我在文档中发现了这条消息:
由于 SSL 直通在 OSI 模型 (TCP) 的第 4 层上工作,而不是在第 7 层 (HTTP) 上工作,因此使用 SSL 直通会使 Ingress 对象上设置的所有其他注释无效。
问:这是否意味着无法通过 SSL 直通使用会话亲和性?Ingress 无法识别连接/cookie(因为它是 SSL 加密的)并将其定向到之前关联的 pod?