如何使用 url 中的前缀路由访问这两个服务,这意味着当我导航到 /v1 时,只有 V1 版本应该出现而没有 404,而当我导航到 /v2 时,应该只有 V2 版本出现向上
我假设您的问题是您的 DestinationRule,在 v2 名称中,您的标签是 version: v1,它应该是 version: v2,这就是为什么您来自 /v1 和 /v2 的请求只发送到您的 pod 的 v1 版本。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: test-destinationrule
spec:
host: test-1
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v1 <---
应该是
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: test-destinationrule
spec:
host: test-1
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
当我尝试访问此 Ingress Gateway IP 时,我在控制台中遇到 404 错误说 http://ingress-gateway-ip/favicon.ico
它按设计工作,您没有为/ 指定路径,只是为/v1 和/v2 指定路径。
如果您希望能够访问,则必须为 / 添加另一个匹配项
- match:
- uri:
prefix: /
route:
- destination:
host: test-1
有 2 个 nginx pod 的工作示例,看看。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v1
spec:
selector:
matchLabels:
version: v1
replicas: 1
template:
metadata:
labels:
app: frontend
version: v1
spec:
containers:
- name: nginx1
image: nginx
ports:
- containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v2
spec:
selector:
matchLabels:
version: v2
replicas: 1
template:
metadata:
labels:
app: frontend
version: v2
spec:
containers:
- name: nginx2
image: nginx
ports:
- containerPort: 80
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello nginx2 > /usr/share/nginx/html/index.html"]
---
apiVersion: v1
kind: Service
metadata:
name: test-1
labels:
app: frontend
spec:
ports:
- name: http-front
port: 80
protocol: TCP
selector:
app: frontend
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: simpleexample
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: http
number: 80
protocol: HTTP
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-virtualservice
spec:
gateways:
- simpleexample
hosts:
- '*'
http:
- match:
- uri:
prefix: /v1
rewrite:
uri: /
route:
- destination:
host: test-1
port:
number: 80
subset: v1
- match:
- uri:
prefix: /v2
rewrite:
uri: /
route:
- destination:
host: test-1
port:
number: 80
subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: test-destinationrule
spec:
host: test-1
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
卷曲的结果:
curl -v ingress-gateway-ip/
404 Not Found
there is no path specified for that in virtual service
curl -v ingress-gateway-ip/v1
HTTP/1.1 200 OK
Hello nginx1
curl -v ingress-gateway-ip/v2
HTTP/1.1 200 OK
Hello nginx2
编辑
问题是所有样式和js在重写时都不能被浏览器在“/”处读取
@Rinor here已经解释过了
我会在此处添加此 Istio in practise 教程,它很好地解释了处理该问题的方法,即为您的依赖项(js、css 等)添加更多路径。
让我们分解应该路由到前端的请求:
确切路径 / 应该路由到前端以获取 Index.html
前缀路径 /static/* 应该被路由到前端以获取前端所需的任何静态文件,例如 层叠样式表 和 JavaScript 文件强>。
匹配正则表达式 ^.*.(ico|png|jpg)$ 的路径应路由到前端,因为它是页面需要显示的图像。
http:
- match:
- uri:
exact: /
- uri:
exact: /callback
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
route:
- destination:
host: frontend
port:
number: 80
如果您还有其他问题,请告诉我。