Kubernetes Nginx跨端口的入口会话亲和力

时间:2020-04-13 21:40:12

标签: kubernetes kubernetes-ingress nginx-ingress kubernetes-service

我有一个旧应用程序,我们已经开始在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添加到服务中但到目前为止,似乎没有任何效果。目标是将对任一路径的所有请求路由到任何一个客户端的同一吊舱。任何帮助将不胜感激。

1 个答案:

答案 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