Skip to main content

Enable Automatic Route Creation

This article was written May 2020. Product versions, commands and screenshots may have changed since then. Please verify against the current documentation.

Red Hat Service Mesh 1.1 allows you to enable a "Automatic Route Creation" which will take care about the routes for a specific Gateway. Instead of defining * for hosts, a list of domains can be defined. The Istio OpenShift Routing (ior) synchronizes the routes and creates them inside the Istio namespace. If a Gateway is deleted, the routes will also be removed again.

This new features makes the manual creation of the route obsolete, as it was explained here: Openshift 4 and Service Mesh 4 - Ingress with custom domain

Enable Automatic Route Creation

Before this feature can be used, it must be enabled. To do so the ServiceMeshContolPlace, typically found in the namespace istio-system must be modified. Add the line ior_enabled: true to the istio-ingressgate configuration.

...
spec:
  istio:
    gateways:
      istio-egressgateway:
        autoscaleEnabled: false
      istio-ingressgateway:
        autoscaleEnabled: false
        ior_enabled: true
...

Verify current service

Let’s check our tutorial application, if it is still working.

oc project tutorial

export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')
curl $GATEWAY_URL/customer

customer => preference => recommendation v1 from 'f11b097f1dd0': 30

Let’s review and remove the current used Gateway. As you can see the hosts is set to '*'

oc get istio-io

oc get gateway.networking.istio.io/customer-gateway -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"networking.istio.io/v1alpha3","kind":"Gateway","metadata":{"annotations":{},"name":"customer-gateway","namespace":"tutorial"},"spec":{"selector":{"istio":"ingressgateway"},"servers":[{"hosts":["*"],"port":{"name":"http","number":80,"protocol":"HTTP"}}]}}
  creationTimestamp: "2020-05-13T07:52:20Z"
  generation: 1
  name: customer-gateway
  namespace: tutorial
  resourceVersion: "41370056"
  selfLink: /apis/networking.istio.io/v1alpha3/namespaces/tutorial/gateways/customer-gateway
  uid: 96e82ed9-e870-493c-941f-bfa83c892b94
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - '*'
    port:
      name: http
      number: 80
      protocol: HTTP

Create a new Gateway

First let’s remove the current Gateway

oc delete gateway.networking.istio.io/customer-gateway

Now lets create a new Gateway, but this time we define some names for the hosts section:

cat <<'EOF' > Gateway-ior.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: customer-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - www.example.com
    - svc.example.com
EOF

oc apply -f Gateway-ior.yaml -n tutorial

When you now check the routes, 2 new routes have been added:

oc get routes -n istio-system
NAME                              HOST/PORT                                                           PATH   SERVICES               PORT    TERMINATION          WILDCARD
...
tutorial-customer-gateway-kmqrl   www.example.com                                                            istio-ingressgateway   http2                        None
tutorial-customer-gateway-ks7q7   svc.example.com                                                            istio-ingressgateway   http2                        None

To test the connectivity, you need to be sure that the hosts, used in the Gateway, are resolvable. If they are then you can access your service:

curl www.example.com/customer
customer => preference => recommendation v1 from 'f11b097f1dd0': 31

curl svc.example.com/customer
customer => preference => recommendation v1 from 'f11b097f1dd0': 32

Discussion

← Previous
Use arrow keys to navigate
Next →
←
→