目前,我正在尝试在 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/使用 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 名称都没有被替换,所以我猜注释没有按预期工作。