Skip to content

Latest commit

 

History

History
175 lines (139 loc) · 5.82 KB

README.md

File metadata and controls

175 lines (139 loc) · 5.82 KB

Routing across Knative Services

This example shows how to map multiple Knative services to different paths under a single domain name using the Istio VirtualService concept. Istio is a general-purpose reverse proxy, therefore these directions can also be used to configure routing based on other request data such as headers, or even to map Knative and external resources under the same domain name.

In this sample, we set up two web services: "Search" service and "Login" service, which simply read in an env variable 'SERVICE_NAME' and prints "${SERVICE_NAME} is called". We'll then create a VirtualService with host "example.com", and define routing rules in the VirtualService so that "example.com/search" maps to the Search service, and "example.com/login" maps to the Login service.

Prerequisites

  1. A Kubernetes cluster with Knative Serving installed.
  2. Install Docker.
  3. Acquire a domain name.
    • In this example, we use example.com. If you don't have a domain name, you can modify your hosts file (on Mac or Linux) to map example.com to your cluster's ingress IP.
  4. Check out the code:
go get -d github.com/knative/docs/serving/samples/knative-routing-go

Setup

Build the application container and publish it to a container registry:

  1. Move into the sample directory:
cd $GOPATH/src/github.com/knative/docs
  1. Set your preferred container registry:
export REPO="gcr.io/<YOUR_PROJECT_ID>"

This example shows how to use Google Container Registry (GCR). You will need a Google Cloud Project and to enable the Google Container Registry API.

  1. Use Docker to build your application container:
docker build \
  --tag "${REPO}/serving/samples/knative-routing-go" \
  --file=serving/samples/knative-routing-go/Dockerfile .
  1. Push your container to a container registry:
docker push "${REPO}/serving/samples/knative-routing-go"
  1. Replace the image reference path with our published image path in the configuration file (serving/samples/knative-routing-go/sample.yaml):

    • Manually replace:
      image: github.com/knative/docs/serving/samples/knative-routing-go with image: <YOUR_CONTAINER_REGISTRY>/serving/samples/knative-routing-go

    Or

    • Use run this command:
    perl -pi -e "s@github.com/knative/docs@${REPO}@g" serving/samples/knative-routing-go/sample.yaml
    

Deploy the Service

Deploy the Knative Serving sample:

kubectl apply -f serving/samples/knative-routing-go/sample.yaml

Exploring the Routes

A shared Gateway "knative-shared-gateway" is used within Knative service mesh for serving all incoming traffic. You can inspect it and its corresponding Kubernetes service with:

  • Check the shared Gateway:
kubectl get Gateway -n knative-serving -oyaml
  • Check the corresponding Kubernetes service for the shared Gateway:
kubectl get svc knative-ingressgateway -n istio-system -oyaml
  • Inspect the deployed Knative services with:
kubectl get service.serving.knative.dev

You should see 2 Knative services: search-service and login-service.

Access the Services

  1. Find the shared Gateway IP and export as an environment variable:
export GATEWAY_IP=`kubectl get svc knative-ingressgateway -n istio-system \
-o jsonpath="{.status.loadBalancer.ingress[*]['ip']}"`
  1. Find the "Search" service route and export as an environment variable:
export SERVICE_HOST=`kubectl get route search-service -o jsonpath="{.status.domain}"`
  1. Make a curl request to the service:
curl http://${GATEWAY_IP} --header "Host:${SERVICE_HOST}"

You should see: Search Service is called !

  1. Similarly, you can also directly access "Login" service with:
export SERVICE_HOST=`kubectl get route login-service -o jsonpath="{.status.domain}"`
curl http://${GATEWAY_IP} --header "Host:${SERVICE_HOST}"

You should see: Login Service is called !

Apply Custom Routing Rule

  1. Apply the custom routing rules defined in routing.yaml file with:
kubectl apply -f serving/samples/knative-routing-go/routing.yaml
  1. The routing.yaml file will generate a new VirtualService "entry-route" for domain "example.com". View the VirtualService:
kubectl get VirtualService entry-route -oyaml
  1. Send a request to the "Search" service and the "Login" service by using corresponding URIs. You should get the same results as directly accessing these services.

    • Get the ingress IP:
    export GATEWAY_IP=`kubectl get svc knative-ingressgateway -n istio-system \
    -o jsonpath="{.status.loadBalancer.ingress[*]['ip']}"`
    
    • Send a request to the Search service:
    curl http://${GATEWAY_IP}/search --header "Host:example.com"
    
    • Send a request to the Login service:
    curl http://${GATEWAY_IP}/login --header "Host:example.com"
    

How It Works

When an external request with host "example.com" reaches "knative-shared-gateway" Gateway, the "entry-route" VirtualService will check if it has /search or /login URI. If the URI matches, then the host of request will be rewritten into the host of "Search" service or "Login" service correspondingly. This resets the final destination of the request. The request with updated host will be forwarded to "knative-shared-gateway" Gateway again. The Gateway proxy checks the updated host, and forwards it to "Search" or "Login" service according to its host setting.

Object model

Clean Up

To clean up the sample resources:

kubectl delete -f serving/samples/knative-routing-go/sample.yaml
kubectl delete -f serving/samples/knative-routing-go/routing.yaml