Routing across multiple Knative services - Go

    In this sample, we set up two web services: 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.

    1. A Kubernetes cluster with Knative Serving installed.
    2. Install .
    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.
      • If you have configured a custom domain for your Knative installation, we will refer to it as <YOUR_DOMAIN_NAME> in the rest of this document
    4. Check out the code:

    Setup

    To check the domain name, run the following command:

    1. kubectl get cm -n knative-serving config-domain -o yaml

    Then, check the value for data. The domain name should be in the format of <YOUR_DOMAIN_NAME>: "", if it is available.

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

    1. Move into the sample directory:
    1. cd $GOPATH/src/github.com/knative/docs
    1. Set your preferred container registry:

    If you use Google Container Registry (GCR), you will need to enable the in your GCP project.

    1. export REPO="gcr.io/<YOUR_PROJECT_ID>"

    If you use Docker Hub as your docker image registry, replace with your dockerhub username and run the following command:

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

      • Manually replace: image: github.com/knative/docs/docs/serving/samples/knative-routing-go with image: ${REPO}/knative-routing-go If you manually changed the .yaml file, you must replace ${REPO} with the correct path on your local machine.

      Or

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

    Exploring the Routes

    A shared Gateway knative-ingress-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:
    1. kubectl get Gateway --namespace knative-serving --output yaml
    • Check the corresponding Kubernetes service for the shared Gateway:
    1. kubectl get svc $INGRESSGATEWAY --namespace istio-system --output yaml
    • Inspect the deployed Knative services with:
    1. kubectl get ksvc

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

    1. Find the shared Gateway IP and export as an environment variable:
    1. INGRESSGATEWAY=istio-ingressgateway
    2. export GATEWAY_IP=`kubectl get svc $INGRESSGATEWAY --namespace istio-system \
    3. --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"`
    1. # kubectl get route search-service --output=custom-columns=NAME:.metadata.name,URL:.status.url
    2. NAME URL
    3. search-service http://search-service.default.example.com
    1. Make a curl request to the service:
    1. curl http://${GATEWAY_IP} --header "Host:search-service.default.example.com"

    You should see: Search Service is called !

    1. Similarly, you can also directly access “Login” service with:
    1. curl http://${GATEWAY_IP} --header "Host:login-service.default.example.com"

    You should see: Login Service is called !

    1. Apply the custom routing rules defined in routing.yaml file with:

    If you have configured a custom domain name for your service, please replace all mentions of “example.com” in routing.yaml with “<YOUR_DOMAIN_NAME>” for spec.hosts and spec.http.rewrite.authority.

    In addition, you need to verify how your domain template is defined. By default, we use the format of {{.Name}}.{{.Namespace}}, like search-service.default and login-service.default. However, some Knative environments may use other format like {{.Name}}-{{.Namespace}}. You can find out the format by running the command:

    1. kubectl get cm -n knative-serving config-network -o yaml

    Then look for the value for domainTemplate. If it is {{.Name}}-{{.Namespace}}.{{.Domain}}, you need to change search-service.default into search-service-default and into login-service-default as well in routing.yaml.

    1. The routing.yaml file will generate a new VirtualService entry-route for domain example.com or your own domain name. View the VirtualService:
    1. kubectl get VirtualService entry-route --output yaml
    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:

      1. INGRESSGATEWAY=istio-ingressgateway
      2. export GATEWAY_IP=`kubectl get svc $INGRESSGATEWAY --namespace istio-system \
      3. --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"`
      1. curl http://${GATEWAY_IP}/search --header "Host: example.com"

      or

      1. curl http://${GATEWAY_IP}/search --header "Host: <YOUR_DOMAIN_NAME>"

      for the case using your own domain.

    • Send a request to the Login service:

      1. curl http://${GATEWAY_IP}/login --header "Host: example.com"

      or

        for the case using your own domain.

      How It Works

      When an external request with host example.com or your own domain name reaches knative-ingress-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-ingress-gateway Gateway again. The Gateway proxy checks the updated host, and forwards it to or Login service according to its host setting.

      To clean up the sample resources: