我有一个旧应用程序,我们已经开始在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的请求都需要路由到每个客户端的同一容器。您可以看到我尝试添加上游哈希注释。这似乎可以确保从一个客户端向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添加到服务中但到目前为止,似乎没有任何效果。目标是将对任一路径的所有请求路由到任何一个客户端的同一吊舱。任何帮助将不胜感激。
答案 0 :(得分:1)
会话持久性设置仅在您设置kube代理设置时才起作用,以便它仅将请求转发到本地Pod,而不转发给集群中的随机Pod。
您可以通过将服务级别设置设置为:
service.spec.externalTrafficPolicy:本地
您可以在此处阅读更多内容:
https://kubernetes.io/docs/tutorials/services/source-ip/
完成此操作后,您的入口注释应该可以工作。我仅使用外部负载均衡器进行了此测试,但是未使用入口进行测试。
使其他所有内容保持一致并具有此服务定义应该起作用
apiVersion: v1
kind: Service
metadata:
name: app
spec:
externalTrafficPolicy: Local
selector:
app: my-app
ports:
- name: web
port: 8080
protocol: TCP
targetPort: 8080
- name: service
port: 8081
protocol: TCP
targetPort: 8081