将一个自定义域映射到许多服务的正确方法是什么?

时间:2019-04-12 16:47:41

标签: google-cloud-run

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路由给我?

3 个答案:

答案 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)。

  1. 不要不要使用gcloud beta run domain-mappings create ...。 M:1服务:域映射不是必需的。
  2. 获取EXTERNAL-IPistio-ingressgateway LoadBalancer)使用的kubectl get svc istio-ingressgateway -n istio-system并将您的域指向该域(例如myapp.com
  3. 使用kubectl get svc(在EXTERNAL-IP-即istio-ingressgateway.istio-system.svc.cluster.local下列出)获取Knative服务主机名
  4. 应用将其路由目的地映射到VirtualService的{​​{1}}:
istio-ingressgateway.istio-system.svc.cluster.local