docs/serving/using-a-custom-domain.md

153 lines
4.9 KiB
Markdown

# 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
1. Edit the domain configuration config-map to replace `example.com`
with your own domain, for example `mydomain.com`:
```shell
kubectl edit cm config-domain -n knative-serving
```
This command opens your default text editor and allows you to edit the config map.
```yaml
apiVersion: v1
data:
example.com: ""
kind: ConfigMap
[...]
```
1. 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:
```yaml
apiVersion: v1
data:
mydomain.com: ""
kind: ConfigMap
[...]
```
## Apply from a file
You can also apply an updated domain configuration:
1. 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:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-domain
namespace: knative-serving
data:
# 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: ""
```
1. Apply updated domain configuration to your cluster:
```shell
kubectl apply -f 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`](./samples/helloworld-go/README.md)), to
your cluster as normal. You can check the customized domain in Knative Route "helloworld-go" with
the following command:
```shell
kubectl get route helloworld-go -o jsonpath="{.status.domain}"
```
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:
```shell
kubectl get svc knative-ingressgateway -n istio-system -o 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:
```shell
export GATEWAY_IP=`kubectl get svc knative-ingressgateway -n istio-system -o 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.
export DOMAIN_NAME=`kubectl get route helloworld-go -o jsonpath="{.status.domain}"`
# 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.
## Publish your Domain
Follow these steps to make your domain publicly accessible:
### Set static IP for Knative Gateway
You might want to [set a static IP for your Knative gateway](gke-assigning-static-ip-address.md),
so that the gateway IP does not change each time your cluster is restarted.
### 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](https://support.google.com/domains/answer/4633759)
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.
```dns
*.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.
```dns
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](https://cloud.google.com/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`
---
Except as otherwise noted, the content of this page is licensed under the
[Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/),
and code samples are licensed under the
[Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0).