从 ingress 迁移到 istio 时出现 404 Not Found
404 Not Found when migrating from ingress to istio
我正在尝试从入口迁移到 istio 网关 + 虚拟服务路由,但我一直收到 404 Not Found
错误。
应访问该应用程序的唯一 link 是使用本地配置的 my-todos.com
。
我在这里错过了什么?
注意:入口控制器工作正常。最初,istio.yaml
文件中的 todo-lb.default.svc.cluster.local
只是设置为 todo-lb
,代表配置的负载均衡器,仍然没有成功。
这是 ingress.yaml
文件(从中迁移):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: todo-ingress
spec:
rules:
- host: my-todos.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: todo-lb
port:
number: 3001
- path: /api
pathType: Prefix
backend:
service:
name: {{ .Values.api.apiName }}
port:
number: {{ .Values.api.apiPort }}
这里是 istio.yaml
文件(迁移到):
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: todo-istio-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- my-todos.com
# - "*"
tls:
httpsRedirect: true
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: tls-secret
hosts:
- my-todos.com
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: todo-lb
spec:
hosts:
- my-todos.com
# - "*"
gateways:
- todo-istio-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: todo-lb.default.svc.cluster.local
port:
number: 3001
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: todo-api
spec:
hosts:
- my-todos.com
# - "*"
gateways:
- todo-istio-gateway
http:
- match:
- uri:
prefix: /api
route:
- destination:
host: {{ .Values.api.apiName }}
port:
number: {{ .Values.api.apiPort }}
据我所知,您的虚拟服务中的网关配置有误,这就是它可能无法正常工作的原因。
如果网关与虚拟服务不在同一个命名空间中,您必须在虚拟服务中指定
检查spec.gateways
部分
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo-Mongo
spec:
gateways:
- some-config-namespace/my-gateway # can omit the namespace if gateway is in same
namespace as virtual service.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
因此请将您的 todo-istio-gateway 移至默认命名空间。
或使用
gateways:
- istio-system/todo-istio-gateway
检查几件事是否有帮助:
- 您的应用程序是否部署在默认命名空间中?
- 你的应用 injected 吗?
除了@Jakub 的回答之外,还有一个原因会导致您收到 404 错误。您当前在虚拟服务中的入口规则如下所示:
Hostname
Path
Route
my-todos.com
/
Forward to todo-lb.default.svc.cluster.local
my-todos.com
/api
Forward to {{ .Values.api.apiName }}
在Istio中,以上每一个都是一个ingress规则。如果在 Istio ingress-gateway
中,规则是按上述顺序添加的,那么所有 URL 路径包括前缀 /api 都会被路由到第一个服务,即 todo-lb.default
。最好像这样创建一个虚拟服务,然后查看路由是否按预期工作。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: todo-api
spec:
hosts:
- my-todos.com
gateways:
- <namespace>/todo-istio-gateway
http:
- match:
- uri:
prefix: /api
route:
- destination:
host: {{ .Values.api.apiName }}
port:
number: {{ .Values.api.apiPort }}
- match:
- uri:
prefix: /
route:
- destination:
host: todo-lb.default
port:
number: 3001
我正在尝试从入口迁移到 istio 网关 + 虚拟服务路由,但我一直收到 404 Not Found
错误。
应访问该应用程序的唯一 link 是使用本地配置的 my-todos.com
。
我在这里错过了什么?
注意:入口控制器工作正常。最初,istio.yaml
文件中的 todo-lb.default.svc.cluster.local
只是设置为 todo-lb
,代表配置的负载均衡器,仍然没有成功。
这是 ingress.yaml
文件(从中迁移):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: todo-ingress
spec:
rules:
- host: my-todos.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: todo-lb
port:
number: 3001
- path: /api
pathType: Prefix
backend:
service:
name: {{ .Values.api.apiName }}
port:
number: {{ .Values.api.apiPort }}
这里是 istio.yaml
文件(迁移到):
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: todo-istio-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- my-todos.com
# - "*"
tls:
httpsRedirect: true
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: tls-secret
hosts:
- my-todos.com
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: todo-lb
spec:
hosts:
- my-todos.com
# - "*"
gateways:
- todo-istio-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: todo-lb.default.svc.cluster.local
port:
number: 3001
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: todo-api
spec:
hosts:
- my-todos.com
# - "*"
gateways:
- todo-istio-gateway
http:
- match:
- uri:
prefix: /api
route:
- destination:
host: {{ .Values.api.apiName }}
port:
number: {{ .Values.api.apiPort }}
据我所知,您的虚拟服务中的网关配置有误,这就是它可能无法正常工作的原因。
如果网关与虚拟服务不在同一个命名空间中,您必须在虚拟服务中指定
检查spec.gateways
部分
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo-Mongo
spec:
gateways:
- some-config-namespace/my-gateway # can omit the namespace if gateway is in same
namespace as virtual service.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
因此请将您的 todo-istio-gateway 移至默认命名空间。
或使用
gateways:
- istio-system/todo-istio-gateway
检查几件事是否有帮助:
- 您的应用程序是否部署在默认命名空间中?
- 你的应用 injected 吗?
除了@Jakub 的回答之外,还有一个原因会导致您收到 404 错误。您当前在虚拟服务中的入口规则如下所示:
Hostname | Path | Route |
---|---|---|
my-todos.com | / | Forward to todo-lb.default.svc.cluster.local |
my-todos.com | /api | Forward to {{ .Values.api.apiName }} |
在Istio中,以上每一个都是一个ingress规则。如果在 Istio ingress-gateway
中,规则是按上述顺序添加的,那么所有 URL 路径包括前缀 /api 都会被路由到第一个服务,即 todo-lb.default
。最好像这样创建一个虚拟服务,然后查看路由是否按预期工作。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: todo-api
spec:
hosts:
- my-todos.com
gateways:
- <namespace>/todo-istio-gateway
http:
- match:
- uri:
prefix: /api
route:
- destination:
host: {{ .Values.api.apiName }}
port:
number: {{ .Values.api.apiPort }}
- match:
- uri:
prefix: /
route:
- destination:
host: todo-lb.default
port:
number: 3001