目前,我正在尝试在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中进行身份验证,则cookie将不被POD#2识别。
为了解决这个问题,我阅读到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
来应用ingress,它被创建且状态为OK。但是,当我访问“Endpoints”列中出现的URL时,浏览器无法连接到该URL。
我做错了什么吗?
编辑1
**已更新服务和ingress配置**
在得到一些帮助后,我成功地通过Ingress Nginx访问了服务。这里是配置:
Nginx Ingress
路径不应包含“”,与默认的Kubernetes ingress不同,后者必须具有“”以路由我想要的路径。
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
? - JonasNGINX Ingress 控制器 发布版本: 0.26.1 构建版本: git-2de5a893a 代码仓库: https://github.com/kubernetes/ingress-nginx nginx 版本: openresty/1.15.8.2
- migueltaoliveira