2

使用 GKE 和 Cloud Run映射自定义域的说明适用于 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-ingressgatewayLoadBalancer 设置为保留的静态 IP,并将我的域指向 LoadBalancer。但是,这只会导致503s.

为什么我不能只指向istio-ingressgatewayLoadBalancer 并VirtualService为我提供一条路线?

4

3 回答 3

3

Firebase Hosting 与 Cloud Run的集成允许您将不同的子路径重写到不同的 Cloud Run 服务。配置看起来像:

{
  "hosting": {
    "rewrites": [
      {"source": "/api/**", "run": {"serviceId": "api"}},
      {"source": "/charts/*.svg", "run": {"serviceId": "chartgen"}},
      {"source": "**", "run": {"serviceId": "ssr"}}
    ]
  }
}
于 2019-04-13T05:06:59.667 回答
0

Cloud Run 的域映射功能无法实现这种路由。

域映射仅允许您将域或子域映射到服务,它们不允许您映射路由。

例如,您可以映射myapp.com到服务my-servicelogin.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

于 2019-04-13T04:51:14.090 回答
0

可以使用 aVirtualService重新路由使用相同域及其到多个服务的路径的流量。

istio-ingressgateway现在是默认的 Knative 服务主机名(我使用的是较旧的 Knative 版本,knative-ingressgateway此后已被删除)。

  1. 不要使用. _ gcloud beta run domain-mappings create ...M:1 服务:域映射不是必需的。
  2. 获取EXTERNAL-IP您的istio-ingressgateway LoadBalancer( kubectl get svc istio-ingressgateway -n istio-system) 使用的并将您的域指向它(例如myapp.com
  3. kubectl get svc使用(在EXTERNAL-IP - ie下列出istio-ingressgateway.istio-system.svc.cluster.local)获取 Knative 服务主机名
  4. 应用VirtualService将其路由目的地映射到的a istio-ingressgateway.istio-system.svc.cluster.local
# e.g. routing.yaml (`kubectl apply -f routing.yaml`)
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: istio-ingressgateway.istio-system.svc.cluster.local
        weight: 100
  - match:
    - uri:
        prefix: "/logout"
    rewrite:
      authority: logout-service.default.myapp.com
    route:
      - destination:
          host: istio-ingressgateway.istio-system.svc.cluster.local
        weight: 100
于 2019-04-15T14:14:46.140 回答