【发布时间】:2021-09-01 04:09:05
【问题描述】:
我在内部 GKE 集群上有 REST API Web 服务,我想通过内部 HTTP 负载平衡公开它。
让我们将此服务称为“蓝色”服务: 我想在以下映射中公开它:
http://api.xxx.yyy.internal/blue/isalive -> http://blue-service/isalive
http://api.xxx.yyy.internal/blue/v1/get -> http://blue-service/v1/get
http://api.xxx.yyy.internal/blue/v1/create -> http://blue-service/v1/create
http://api.xxx.yyy.internal/ -> http://blue-service/ (expose Swagger)
我省略了部署 yaml,因为它与讨论不太相关。
但我的服务 yaml 看起来像这样:
apiVersion: v1
kind: Service
metadata:
name: blue-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
selector:
app: blue-service
我的 Ingress 配置如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: blue-ingress
annotations:
kubernetes.io/ingress.class: "gce-internal"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: api.xxx.yyy.internal
http:
paths:
- path: /blue/*
backend:
serviceName: blue-service
servicePort: 80
但是,我收到所有请求的 404。 /blue/v1/get、/blue/v1/create 和 /blue/isalive 返回 404。
在我的“蓝色”应用程序中,我记录了我所有的 notFound 请求,我可以清楚地看到我的 URI 没有被重写,到达应用程序的请求是 /blue/v1/get、/blue/v1/create 和 /blue/isalive。
Ingress 配置中缺少什么?我该如何修复这些重写?
【问题讨论】:
-
您的重写目标无法工作,因为您没有在
spec.rules[0].http.paths[0].path中捕获任何表达式。见kubernetes.github.io/ingress-nginx/examples/rewrite/… -
如果我将路径更改为 ''/blue(/|$)(.*)",我会从负载均衡器收到以下信息:错误 400:字段 'resource' 的值无效:'{ “名称”:“k8s2-um-a0tq0oxi-default-blue-ingress-w0chp90v”,“hostRule”:[{“主机”:[“api.putin ....”。路径模式无效,无效
-
GCE 入口控制器不支持重写注释(见github.com/kubernetes/ingress-gce/issues/109)。您可以安装支持此功能的 nginx 入口控制器。将来,您还应该能够使用目前处于预览状态的新网关控制器 (cloud.google.com/kubernetes-engine/docs/concepts/gateway-api)。
-
您也可以安装 Istio 或 Anthos Service Mesh 并使用 Istio VirtualService 资源。
标签: nginx kubernetes url-rewriting google-kubernetes-engine kubernetes-ingress