路由

什么是 Route

RouteFunction 定义的一部分。Route 定义了来自 Gateway 监听器的流量如何路由到函数。

RouteGatewayRef 中指定了它将附加到的 Gateway,使其能够从 Gateway 接收流量。

一旦创建了同步 Function,函数控制器将:

  • 查找 openfunction 命名空间中名为 openfunctionGateway,然后如果函数中没有定义 route.gatewayRef,则附加到此 Gateway
  • 如果函数中没有定义 route.hostnames,则根据 Gateway.spec.hostTemplate 自动生成 route.hostnames
  • 如果函数中没有定义 route.rules,则根据路径 / 自动生成 route.rules
  • 根据 Route 创建一个 HTTPRoute 自定义资源。BackendRefs 将自动链接到相应的 Knative 服务修订版,并将 HTTPRouteLabelKey 标签添加到此 HTTPRoute
  • 创建服务 {{.Name}}.{{.Namespace}}.svc.cluster.local,此服务定义了从集群内部访问函数的入口。
  • 如果 route.gatewayRef 引用的 Gateway 发生变化,将更新 HTTPRoute

部署同步 Function 后,你将能够在 Function 的状态字段中找到 Function 地址和 Route 状态,例如:

status:
  addresses:
    - type: External
      value: http://function-sample-serving-only.default.ofn.io/
    - type: Internal
      value: http://function-sample-serving-only.default.svc.cluster.local/
  build:
    resourceHash: "14903236521345556383"
    state: Skipped
  route:
    conditions:
      - message: Valid HTTPRoute
        reason: Valid
        status: "True"
        type: Accepted
    hosts:
      - function-sample-serving-only.default.ofn.io
      - function-sample-serving-only.default.svc.cluster.local
    paths:
      - type: PathPrefix
        value: /
  serving:
    lastSuccessfulResourceRef: serving-znk54
    resourceHash: "10715302888241374768"
    resourceRef: serving-znk54
    service: serving-znk54-ksvc-nbg6f
    state: Running

基于主机的路由

基于主机 是默认的路由模式。当 route.hostnames 未定义时, 将根据 gateway.spec.hostTemplate 自动生成 route.hostnames。 如果 route.rules 未定义,将根据路径 / 自动生成 route.rules

kubectl apply -f - <<EOF
apiVersion: core.openfunction.io/v1beta2
kind: Function
metadata:
  name: function-sample
spec:
  version: "v1.0.0"
  image: "openfunctiondev/v1beta1-http:latest"
  serving:
    template:
      containers:
        - name: function
          imagePullPolicy: Always
    triggers:
      http:
        route:
          gatewayRef:
            name: openfunction
            namespace: openfunction
EOF

如果你正在使用默认的 OpenFunction Gateway,函数的外部地址将如下:

http://function-sample.default.ofn.io/

基于路径的路由

如果你在函数中定义了 route.hostnames,将根据 gateway.spec.pathTemplate 自动生成 route.rules

kubectl apply -f - <<EOF
apiVersion: core.openfunction.io/v1beta2
kind: Function
metadata:
  name: function-sample
spec:
  version: "v1.0.0"
  image: "openfunctiondev/v1beta1-http:latest"
  serving:
    template:
      containers:
        - name: function
          imagePullPolicy: Always
    triggers:
      http:
        route:
          gatewayRef:
            name: openfunction
            namespace: openfunction
           hostnames:
           - "sample.ofn.io"
EOF

如果你正在使用默认的 OpenFunction Gateway,函数的外部地址将如下:

http://sample.default.ofn.io/default/function-sample/

基于主机和路径的路由

你可以同时定义主机名和路径,以自定义流量应如何路由到你的函数。

kubectl apply -f - <<EOF
apiVersion: core.openfunction.io/v1beta2
kind: Function
metadata:
  name: function-sample
spec:
  version: "v1.0.0"
  image: "openfunctiondev/v1beta1-http:latest"
  serving:
    template:
      containers:
        - name: function
          imagePullPolicy: Always
    triggers:
      http:
        route:
          gatewayRef:
            name: openfunction
            namespace: openfunction
          rules:
            - matches:
                - path:
                    type: PathPrefix
                    value: /v2/foo
          hostnames:
          - "sample.ofn.io"
EOF

如果你正在使用默认的 OpenFunction Gateway,函数的外部地址将如下:

http://sample.default.ofn.io/v2/foo/