【发布时间】:2020-04-03 22:47:56
【问题描述】:
目前,我正在尝试使用两个 负载平衡器 在 Google Cloud 上创建一个 Kubernetes 集群:一个用于后端(在 Spring boot 中),另一个用于前端(在 Angular 中),其中每个服务 (负载均衡器)与 2 个副本(pod)通信。为此,我创建了以下入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-ingress
spec:
rules:
- http:
paths:
- path: /rest/v1/*
backend:
serviceName: sample-backend
servicePort: 8082
- path: /*
backend:
serviceName: sample-frontend
servicePort: 80
上面提到的入口可以使前端应用程序与后端应用程序提供的 REST API 进行通信。但是,由于后端提供的身份验证机制,我必须创建粘性会话,以便每个用户都与同一个 POD 进行通信。澄清一下,如果一个用户在 POD #1 中进行身份验证,则 POD #2 将无法识别 cookie。
为了解决这个问题,我读到 Nginx-ingress 设法处理这种情况,我通过此处提供的步骤进行安装:https://kubernetes.github.io/ingress-nginx/deploy/ using Helm。
您可以在下面找到我正在尝试构建的架构的图表:
使用以下服务(我只是粘贴其中一项服务,另一项类似):
apiVersion: v1
kind: Service
metadata:
name: sample-backend
spec:
selector:
app: sample
tier: backend
ports:
- protocol: TCP
port: 8082
targetPort: 8082
type: LoadBalancer
我声明了以下入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-nginx-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/affinity-mode: persistent
nginx.ingress.kubernetes.io/session-cookie-hash: sha1
nginx.ingress.kubernetes.io/session-cookie-name: sample-cookie
spec:
rules:
- http:
paths:
- path: /rest/v1/*
backend:
serviceName: sample-backend
servicePort: 8082
- path: /*
backend:
serviceName: sample-frontend
servicePort: 80
之后,我运行kubectl apply -f sample-nginx-ingress.yaml 来应用入口,它被创建并且它的状态是好的。但是,当我访问出现在“端点”列中的 URL 时,浏览器无法连接到该 URL。
我做错什么了吗?
编辑 1
** 更新服务和入口配置**
经过一些帮助,我设法通过 Ingress Nginx 访问了这些服务。上面这里有配置:
Nginx 入口
路径不应包含“”,这与默认 Kubernetes 入口不同,默认 Kubernetes 入口必须具有“”来路由我想要的路径。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: sample-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "sample-cookie"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
rules:
- http:
paths:
- path: /rest/v1/
backend:
serviceName: sample-backend
servicePort: 8082
- path: /
backend:
serviceName: sample-frontend
servicePort: 80
服务
此外,服务的类型不应是“LoadBalancer”,而是“ClusterIP”,如下所示:
apiVersion: v1
kind: Service
metadata:
name: sample-backend
spec:
selector:
app: sample
tier: backend
ports:
- protocol: TCP
port: 8082
targetPort: 8082
type: ClusterIP
但是,我仍然无法在我的 Kubernetes 集群中实现粘性会话,一旦我仍然得到 403,甚至 cookie 名称都没有被替换,所以我猜注释没有按预期工作。
【问题讨论】:
-
你的
Service是什么类型的?是LoadBalancer还是NodePort? -
它们是负载均衡器。
-
那么您是从公开为 GCP 负载均衡器的端点的 ip 地址访问您的服务吗? ...这意味着您没有使用您的
Ingress...为此,您必须在 GKE 上拥有NodePort类型的服务。 -
或者“端点”列是什么意思?您应该通过 Ingress Controller 访问您的服务。
-
@DawidKruk 你有:------------------------------------ ------------------------------------------------------- NGINX 入口控制器版本:0.26。 1 构建:git-2de5a893a 存储库:github.com/kubernetes/ingress-nginx nginx 版本:openresty/1.15.8.2 ------------------------------- ------------------------------------------------跨度>
标签: cookies kubernetes load-balancing nginx-ingress sticky-session