将mapping-custom-domains与带有Cloud Run的GKE配合使用的说明对于1:1域:服务映射可以很好地工作。但是,如果我想拥有1:M domain:services并与URI匹配,该怎么办?
myapp.com/login >> login-service
myapp.com/logout >> logout-service
第二个域映射创建语句将出错,因为域在服务之间必须是唯一的:
$ gcloud beta run domain-mappings create --service login-service --domain myapp.com --cluster mycluster --cluster-location europe-west2-a
Creating......done.
RECORD TYPE CONTENTS
A XX.XXX.XXX.XX
$ gcloud beta run domain-mappings create --service login-service --domain myapp.com --cluster mycluster --cluster-location europe-west2-a
ERROR: ... "message": domainmappings.domains.cloudrun.com \"myapp.com\" already exists ...
以前,当使用手动创建的Knative环境时,我可以通过Istio VirtualService
实现此目标:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: entry-route
namespace: default
spec:
- knative-ingress-gateway.knative-serving.svc.cluster.local
# Set host to the domain name that you own.
hosts:
- myapp.com
http:
- match:
- uri:
prefix: "/login"
rewrite:
authority: login-service.default.myapp.com
route:
- destination:
host: knative-ingressgateway.istio-system.svc.cluster.local
weight: 100
- match:
- uri:
prefix: "/logout"
rewrite:
authority: logout-service.default.myapp.com
route:
- destination:
host: knative-ingressgateway.istio-system.svc.cluster.local
weight: 100
但是尽管我可以使用Cloud Run在GKE上应用它,但是所有内容都路由到映射到域的服务。
我还尝试了删除创建的gcloud beta run domain-mappings
,将istio-ingressgateway
LoadBalancer设置为保留的静态IP,并将我的域指向LoadBalancer。但是,这只会导致503s
。
为什么我不能仅指向istio-ingressgateway
LoadBalancer并让VirtualService
路由给我?
答案 0 :(得分:3)
Firebase Hosting integration with Cloud Run允许您将不同的子路径重写为不同的Cloud Run服务。配置看起来像:
{
"hosting": {
"rewrites": [
{"source": "/api/**", "run": {"serviceId": "api"}},
{"source": "/charts/*.svg", "run": {"serviceId": "chartgen"}},
{"source": "**", "run": {"serviceId": "ssr"}}
]
}
}
答案 1 :(得分:0)
Cloud Run的域映射功能无法实现这种路由。
域映射仅允许您将域或子域映射到服务,而不允许您映射路由。
例如,您可以将myapp.com
映射到服务my-service
,或将login.myapp.com
映射到服务login-service
。
但是您无法将myapp.com/login
映射到服务login-service
。
为此,您需要将myapp.com
映射到服务my-service
,然后,该服务将查看请求路径并调用另一个服务login-service
。
或者,如果您在GKE上使用Cloud RUn,则可以将Cloud Run服务放在Google Cloud Load Balancer后面,该服务允许您使用urlMaps。
答案 2 :(得分:0)
可以使用VirtualService
使用相同的域及其通往多个服务的路径来重新路由流量。
istio-ingressgateway
现在是默认的Knative服务主机名(我使用的是较旧的Knative版本和knative-ingressgateway
has since been removed)。
gcloud beta run domain-mappings create ...
。 M:1服务:域映射不是必需的。EXTERNAL-IP
(istio-ingressgateway LoadBalancer
)使用的kubectl get svc istio-ingressgateway -n istio-system
并将您的域指向该域(例如myapp.com
)kubectl get svc
(在EXTERNAL-IP
-即istio-ingressgateway.istio-system.svc.cluster.local
下列出)获取Knative服务主机名VirtualService
的{{1}}:istio-ingressgateway.istio-system.svc.cluster.local