Setting up a custom domain

By default, Knative Serving routes use example.com as the default domain. The
fully qualified domain name for a route by default is
{route}.{namespace}.{default-domain}.

To change the {default-domain} value there are a few steps involved:

Edit using kubectl

Edit the domain configuration config-map to replace example.com with your
own domain, for example mydomain.com:

kubectl edit cm config-domain --namespace knative-serving

This command opens your default text editor and allows you to edit the config
map.

apiVersion:v1data:example.com:""kind:ConfigMap[...]

Edit the file to replace example.com with the domain you’d like to use and
save your changes. In this example, we configure mydomain.com for all
routes:

apiVersion:v1data:mydomain.com:""kind:ConfigMap[...]

Apply from a file

You can also apply an updated domain configuration:

Create a new file, config-domain.yaml and paste the following text,
replacing the example.org and example.com values with the new domain you
want to use:

apiVersion:v1kind:ConfigMapmetadata:name:config-domainnamespace:knative-servingdata:# These are example settings of domain.# example.org will be used for routes having app=prod.example.org:|
selector:app:prod# Default value for domain, for routes that does not have app=prod labels.# Although it will match all routes, it is the least-specific rule so it# will only be used if no other domain matches.example.com:""

Apply updated domain configuration to your cluster:

kubectl apply --filename config-domain.yaml

Deploy an application

If you have an existing deployment, Knative will reconcile the change made to
the configuration map and automatically update the host name for all of the
deployed services and routes.

Deploy an app (for example,
helloworld-go), to your
cluster as normal. You can retrieve the URL in Knative Route “helloworld-go”
with the following command:

kubectl get route helloworld-go --output jsonpath="{.status.url}"

You should see the full customized domain: helloworld-go.default.mydomain.com.

And you can check the IP address of your Knative gateway by running:

# In Knative 0.2.x and prior versions, the `knative-ingressgateway` service was used instead of `istio-ingressgateway`.exportINGRESSGATEWAY=knative-ingressgateway
# The use of `knative-ingressgateway` is deprecated in Knative v0.3.x.# Use `istio-ingressgateway` instead, since `knative-ingressgateway`# will be removed in Knative v0.4.if kubectl get configmap config-istio -n knative-serving &> /dev/null;thenexportINGRESSGATEWAY=istio-ingressgateway
fi
kubectl get svc $INGRESSGATEWAY --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"

Local DNS setup

You can map the domain to the IP address of your Knative gateway in your local
machine with:

# In Knative 0.2.x and prior versions, the `knative-ingressgateway` service was used instead of `istio-ingressgateway`.INGRESSGATEWAY=knative-ingressgateway
# The use of `knative-ingressgateway` is deprecated in Knative v0.3.x.# Use `istio-ingressgateway` instead, since `knative-ingressgateway`# will be removed in Knative v0.4.if kubectl get configmap config-istio -n knative-serving &> /dev/null;thenINGRESSGATEWAY=istio-ingressgateway
fiexportGATEWAY_IP=`kubectl get svc $INGRESSGATEWAY --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"`# helloworld-go is the generated Knative Route of "helloworld-go" sample.# You need to replace it with your own Route in your project.exportDOMAIN_NAME=`kubectl get route helloworld-go --output jsonpath="{.status.url}"| cut -d'/' -f 3`# Add the record of Gateway IP and domain name into file "/etc/hosts"echo -e "$GATEWAY_IP\t$DOMAIN_NAME"| sudo tee -a /etc/hosts

You can now access your domain from the browser in your machine and do some
quick checks.

Set static IP for Knative Gateway

Update your DNS records

To publish your domain, you need to update your DNS provider to point to the IP
address for your service ingress.

Create a wildcard record
for the namespace and custom domain to the ingress IP Address, which would
enable hostnames for multiple services in the same namespace to work without
creating additional DNS entries.

*.default.mydomain.com 59 IN A 35.237.28.44

Create an A record to point from the fully qualified domain name to the IP
address of your Knative gateway. This step needs to be done for each Knative
Service or Route created.

helloworld-go.default.mydomain.com 59 IN A 35.237.28.44

If you are using Google Cloud DNS, you can find step-by-step instructions in the
Cloud DNS quickstart.

Once the domain update has propagated, you can access your app using the fully
qualified domain name of the deployed route, for example
http://helloworld-go.default.mydomain.com