【发布时间】:2020-07-26 13:34:09
【问题描述】:
我有一个我们已经开始在 Kubernetes 中运行的遗留应用程序。该应用程序侦听两个不同的端口,一个用于一般网页,另一个用于 Web 服务。从长远来看,我们可能会尝试更改其中的一些内容,但目前我们正在尝试让遗留应用程序按原样运行。当前配置为两个端口提供单一服务:
apiVersion: v1
kind: Service
metadata:
name: app
spec:
selector:
app: my-app
ports:
- name: web
port: 8080
protocol: TCP
targetPort: 8080
- name: service
port: 8081
protocol: TCP
targetPort: 8081
然后我使用单个入口根据路径将流量路由到正确的服务端口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: app
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
spec:
rules:
- host: myapp.test.com
http:
paths:
- backend:
serviceName: app
servicePort: 8080
path: /app
- backend:
serviceName: app
servicePort: 8081
path: /service
这非常适合路由。进入入口的请求会根据路径路由到正确的服务端口。但是,我遇到的问题是,要让这个遗留应用程序工作,对端口 8080 和 8081 的请求需要路由到每个客户端的同一个 pod。您可以看到我尝试添加 upstream-hash-by 注释。这似乎确保了一个客户端对 8080 的所有请求都发送到同一个 pod,并且一个客户端对 8081 的所有请求都发送到同一个 pod,但对于任何一个客户端来说,这些请求都不是同一个 pod。当我使用单个 pod 实例运行时,一切都很好,但是当我开始启动额外的 pod 时,一些客户端将 /app 请求路由到一个 pod 并将 /service 请求路由到另一个 pod,并且在这个当前不起作用的应用程序中。我在入口中尝试了其他注释,包括 nginx.ingress.kubernetes.io/affinity: "cookie" 和 nginx.ingress.kubernetes.io/affinity-mode: "persistent" 以及尝试将 sessionAffinity: ClientIP 添加到服务但到目前为止似乎没有任何效果。目标是任何一个客户端对任一路径的所有请求都被路由到同一个 pod。任何帮助将不胜感激。
【问题讨论】:
标签: kubernetes kubernetes-ingress nginx-ingress kubernetes-service