mirror of https://github.com/knative/docs.git
Remove GKE / GCP specific docs (#3731)
This commit is contained in:
parent
9258df348b
commit
7fcd22f69b
|
|
@ -1,99 +0,0 @@
|
||||||
---
|
|
||||||
title: "Assigning a static IP address for Knative on Kubernetes Engine"
|
|
||||||
linkTitle: "Assigning static IPs - GKE"
|
|
||||||
weight: 35
|
|
||||||
type: "docs"
|
|
||||||
---
|
|
||||||
|
|
||||||
# Assigning a static IP address for Knative on Kubernetes Engine
|
|
||||||
|
|
||||||
If you are running Knative on Google Kubernetes Engine and want to use a
|
|
||||||
[custom domain](./using-a-custom-domain.md) with your apps, you need to
|
|
||||||
configure a static IP address to ensure that your custom domain mapping doesn't
|
|
||||||
break.
|
|
||||||
|
|
||||||
Knative configures an Istio Gateway CRD named `knative-ingress-gateway` under
|
|
||||||
the `knative-serving` namespace to serve all incoming traffic within the Knative
|
|
||||||
service mesh. The IP address to access the gateway is the external IP address of
|
|
||||||
the "istio-ingressgateway" service under the `istio-system` namespace.
|
|
||||||
Therefore, in order to set a static IP for the gateway you must to set the
|
|
||||||
external IP address of the `istio-ingressgateway` service to a static IP.
|
|
||||||
|
|
||||||
If you have configured a
|
|
||||||
[custom ingress gateway](./setting-up-custom-ingress-gateway.md), replace
|
|
||||||
`istio-ingressgateway` with the name of your gateway service in the steps below.
|
|
||||||
|
|
||||||
## Step 1: Reserve a static IP address
|
|
||||||
|
|
||||||
You can reserve a regional static IP address using the Google Cloud SDK or the
|
|
||||||
Google Cloud Platform console.
|
|
||||||
|
|
||||||
Using the Google Cloud SDK:
|
|
||||||
|
|
||||||
1. Enter the following command, replacing IP_NAME and REGION with appropriate
|
|
||||||
values. For example, select the `us-west1` region if you deployed your
|
|
||||||
cluster to the `us-west1-c` zone:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud beta compute addresses create IP_NAME --region=REGION
|
|
||||||
```
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud beta compute addresses create knative-ip --region=us-west1
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Enter the following command to get the newly created static IP address:
|
|
||||||
```shell
|
|
||||||
gcloud beta compute addresses list
|
|
||||||
```
|
|
||||||
|
|
||||||
In the
|
|
||||||
[GCP console](https://console.cloud.google.com/networking/addresses/add?_ga=2.97521754.-475089713.1523374982):
|
|
||||||
|
|
||||||
1. Enter a name for your static address.
|
|
||||||
1. For **IP version**, choose IPv4.
|
|
||||||
1. For **Type**, choose **Regional**.
|
|
||||||
1. From the **Region** drop-down, choose the region where your Knative cluster
|
|
||||||
is running.
|
|
||||||
|
|
||||||
For example, select the `us-west1` region if you deployed your cluster to
|
|
||||||
the `us-west1-c` zone.
|
|
||||||
|
|
||||||
1. Leave the **Attached To** field set to `None` since we'll attach the IP
|
|
||||||
address through a config-map later.
|
|
||||||
1. Copy the **External Address** of the static IP you created.
|
|
||||||
|
|
||||||
## Step 2: Update the external IP of `istio-ingressgateway` service
|
|
||||||
|
|
||||||
Run following command to configure the external IP of the `istio-ingressgateway`
|
|
||||||
service to the static IP that you reserved:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
INGRESSGATEWAY=istio-ingressgateway
|
|
||||||
kubectl patch svc $INGRESSGATEWAY --namespace istio-system --patch '{"spec": { "loadBalancerIP": "<your-reserved-static-ip>" }}'
|
|
||||||
```
|
|
||||||
|
|
||||||
## Step 3: Verify the static IP address of `istio-ingressgateway` service
|
|
||||||
|
|
||||||
Run the following command to ensure that the external IP of the ingressgateway
|
|
||||||
service has been updated:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl get svc $INGRESSGATEWAY --namespace istio-system
|
|
||||||
```
|
|
||||||
|
|
||||||
The output should show the assigned static IP address under the EXTERNAL-IP
|
|
||||||
column:
|
|
||||||
|
|
||||||
```
|
|
||||||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
|
||||||
xxxxxxx-ingressgateway LoadBalancer 12.34.567.890 98.765.43.210 80:32380/TCP,443:32390/TCP,32400:32400/TCP 5m
|
|
||||||
```
|
|
||||||
|
|
||||||
> Note: Updating the external IP address can take several minutes.
|
|
||||||
|
|
||||||
The [external IP address](https://console.cloud.google.com/networking/addresses/list) should have a value now in the `In use by` column and should not be `None` anymore:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
@ -1,267 +0,0 @@
|
||||||
---
|
|
||||||
title: "Configuring HTTPS with cert-manager and Google Cloud DNS"
|
|
||||||
linkTitle: "Configuring HTTPS with Cloud DNS"
|
|
||||||
weight: 63
|
|
||||||
type: "docs"
|
|
||||||
---
|
|
||||||
|
|
||||||
# Configuring HTTPS with cert-manager and Google Cloud DNS
|
|
||||||
|
|
||||||
You can use cert-manager with Knative to automatically provision TLS
|
|
||||||
certificates from Let's Encrypt and use
|
|
||||||
[Google Cloud DNS](https://cloud.google.com/dns/) to handle HTTPS requests and
|
|
||||||
validate DNS challenges.
|
|
||||||
|
|
||||||
The following guide demonstrates how you can setup Knative to handle secure
|
|
||||||
HTTPS requests on Google Cloud Platform, specifically using cert-manager for TLS
|
|
||||||
certificates and [Google Cloud DNS](https://cloud.google.com/dns/) as the DNS
|
|
||||||
provider.
|
|
||||||
|
|
||||||
Learn more about using TLS certificates in Knative:
|
|
||||||
|
|
||||||
- [Configuring HTTPS with TLS certificates](./using-a-tls-cert.md)
|
|
||||||
- [Enabling automatic TLS certificate provisioning](./using-auto-tls.md)
|
|
||||||
|
|
||||||
## Before you begin
|
|
||||||
|
|
||||||
You must meet the following prerequisites to configure Knative with cert-manager
|
|
||||||
and Cloud DNS:
|
|
||||||
|
|
||||||
- You must have a
|
|
||||||
[GCP project ID with owner privileges](https://console.cloud.google.com/cloud-resource-manager).
|
|
||||||
- [Google Cloud DNS](https://cloud.google.com/dns/docs/how-to) must set up and
|
|
||||||
configure for your domain.
|
|
||||||
- You must have a Knative cluster with the following requirements:
|
|
||||||
- Knative Serving running.
|
|
||||||
- The Knative cluster must be running on Google Cloud Platform. For details
|
|
||||||
about installing the Serving component, see the
|
|
||||||
[Knative installation guides](../install/).
|
|
||||||
- Your Knative cluster must be configured to use a
|
|
||||||
[custom domain](./using-a-custom-domain.md).
|
|
||||||
- [cert-manager v1.0.0 or higher installed](./installing-cert-manager.md)
|
|
||||||
- Your DNS provider must be setup and configured to your domain.
|
|
||||||
|
|
||||||
## Creating a service account and using a Kubernetes secret
|
|
||||||
|
|
||||||
To allow cert-manager to access and update the DNS record, you must create a
|
|
||||||
service account in GCP, add the key in a Kubernetes secret, and then add that
|
|
||||||
secret to your Knative cluster.
|
|
||||||
|
|
||||||
Note that several example names are used in the following commands, for example
|
|
||||||
secret or file names, which can all be changed to your liking.
|
|
||||||
|
|
||||||
1. Create a service account in GCP with `dns.admin` project role by running the
|
|
||||||
following commands, where `<your-project-id>` is the ID of your GCP project:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# Set this to your GCP project ID
|
|
||||||
export PROJECT_ID=<your-project-id>
|
|
||||||
|
|
||||||
# Name of the service account you want to create.
|
|
||||||
export CLOUD_DNS_SA=cert-manager-cloud-dns-admin
|
|
||||||
gcloud --project $PROJECT_ID iam service-accounts \
|
|
||||||
create $CLOUD_DNS_SA \
|
|
||||||
--display-name "Service Account to support ACME DNS-01 challenge."
|
|
||||||
|
|
||||||
# Fully-qualified service account name also has project-id information.
|
|
||||||
export CLOUD_DNS_SA=$CLOUD_DNS_SA@$PROJECT_ID.iam.gserviceaccount.com
|
|
||||||
|
|
||||||
# Bind the role dns.admin to this service account, so it can be used to support
|
|
||||||
# the ACME DNS01 challenge.
|
|
||||||
gcloud projects add-iam-policy-binding $PROJECT_ID \
|
|
||||||
--member serviceAccount:$CLOUD_DNS_SA \
|
|
||||||
--role roles/dns.admin
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Download the service account key by running the following commands:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# Make a temporary directory to store key
|
|
||||||
KEY_DIRECTORY=`mktemp -d`
|
|
||||||
|
|
||||||
# Download the secret key file for your service account.
|
|
||||||
gcloud iam service-accounts keys create $KEY_DIRECTORY/cloud-dns-key.json \
|
|
||||||
--iam-account=$CLOUD_DNS_SA
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Create a Kubernetes secret and then add that secret to your Knative cluster
|
|
||||||
by running the following commands:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# Upload that as a secret in your Kubernetes cluster.
|
|
||||||
kubectl create secret --namespace cert-manager generic cloud-dns-key \
|
|
||||||
--from-file=key.json=$KEY_DIRECTORY/cloud-dns-key.json
|
|
||||||
|
|
||||||
# Delete the local secret
|
|
||||||
rm -rf $KEY_DIRECTORY
|
|
||||||
```
|
|
||||||
|
|
||||||
## Adding your service account to cert-manager
|
|
||||||
|
|
||||||
Create a `ClusterIssuer` configuration file to define how cert-manager obtains
|
|
||||||
TLS certificates and how the requests are validated with Cloud DNS.
|
|
||||||
|
|
||||||
1. Run the following command to create the `ClusterIssuer` configuration. The
|
|
||||||
following creates the `letsencrypt-issuer` `ClusterIssuer`, that includes
|
|
||||||
your Let's Encrypt account info, `DNS-01` challenge type, and Cloud DNS
|
|
||||||
provider info, including your `cert-manager-cloud-dns-admin` service account.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl apply --filename - <<EOF
|
|
||||||
apiVersion: cert-manager.io/v1
|
|
||||||
kind: ClusterIssuer
|
|
||||||
metadata:
|
|
||||||
name: letsencrypt-issuer
|
|
||||||
spec:
|
|
||||||
acme:
|
|
||||||
server: https://acme-v02.api.letsencrypt.org/directory
|
|
||||||
# This will register an issuer with LetsEncrypt. Replace
|
|
||||||
# with your admin email address.
|
|
||||||
email: myemail@gmail.com
|
|
||||||
privateKeySecretRef:
|
|
||||||
# Set privateKeySecretRef to any unused secret name.
|
|
||||||
name: letsencrypt-issuer
|
|
||||||
solvers:
|
|
||||||
- dns01:
|
|
||||||
clouddns:
|
|
||||||
# Set this to your GCP project-id
|
|
||||||
project: $PROJECT_ID
|
|
||||||
# Set this to the secret that we publish our service account key
|
|
||||||
# in the previous step.
|
|
||||||
serviceAccountSecretRef:
|
|
||||||
name: cloud-dns-key
|
|
||||||
key: key.json
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Ensure that `letsencrypt-issuer` is created successfully by running the
|
|
||||||
following command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl get clusterissuer --namespace cert-manager letsencrypt-issuer --output yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
Result: The `Status.Conditions` should include `Ready=True`. For example:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
status:
|
|
||||||
acme:
|
|
||||||
uri: https://acme-v02.api.letsencrypt.org/acme/acct/40759665
|
|
||||||
conditions:
|
|
||||||
- lastTransitionTime: 2018-08-23T01:44:54Z
|
|
||||||
message: The ACME account was registered with the ACME server
|
|
||||||
reason: ACMEAccountRegistered
|
|
||||||
status: "True"
|
|
||||||
type: Ready
|
|
||||||
```
|
|
||||||
|
|
||||||
## Add `letsencrypt-issuer` to your ingress secret to configure your certificate
|
|
||||||
|
|
||||||
To configure how Knative uses your TLS certificates, you create a `Certificate`
|
|
||||||
to add `letsencrypt-issuer` to the `istio-ingressgateway-certs` secret.
|
|
||||||
|
|
||||||
Note that `istio-ingressgateway-certs` will be overridden if the secret already
|
|
||||||
exists.
|
|
||||||
|
|
||||||
1. Run the following commands to create the `my-certificate` `Certificate`,
|
|
||||||
where `<your-domain.com>` is your domain:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# Change this value to the domain you want to use.
|
|
||||||
export DOMAIN=<your-domain.com>
|
|
||||||
|
|
||||||
kubectl apply --filename - <<EOF
|
|
||||||
apiVersion: cert-manager.io/v1
|
|
||||||
kind: Certificate
|
|
||||||
metadata:
|
|
||||||
name: my-certificate
|
|
||||||
namespace: istio-system
|
|
||||||
spec:
|
|
||||||
secretName: istio-ingressgateway-certs
|
|
||||||
issuerRef:
|
|
||||||
name: letsencrypt-issuer
|
|
||||||
kind: ClusterIssuer
|
|
||||||
dnsNames:
|
|
||||||
- "*.default.$DOMAIN"
|
|
||||||
- "*.other-namespace.$DOMAIN"
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Ensure that `my-certificate` is created successfully by running the following
|
|
||||||
command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl get certificate --namespace istio-system my-certificate --output yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
Result: The `Status.Conditions` should include `Ready=True`. For example:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
status:
|
|
||||||
acme:
|
|
||||||
order:
|
|
||||||
url: https://acme-v02.api.letsencrypt.org/acme/order/40759665/45358362
|
|
||||||
conditions:
|
|
||||||
- lastTransitionTime: 2018-08-23T02:28:44Z
|
|
||||||
message: Certificate issued successfully
|
|
||||||
reason: CertIssued
|
|
||||||
status: "True"
|
|
||||||
type: Ready
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: If `Status.Conditions` is `Ready=False`, that indicates a failure to
|
|
||||||
obtain a certificate, which should be explained in the accompanying error
|
|
||||||
message.
|
|
||||||
|
|
||||||
## Configuring the Knative ingress gateway
|
|
||||||
|
|
||||||
To configure the `knative-ingress-gateway` to use the TLS certificate that you
|
|
||||||
created, append the `tls:` section to the end of your HTTPS port configuration.
|
|
||||||
|
|
||||||
Run the following commands to configure Knative to use HTTPS connections and
|
|
||||||
send a `301` redirect response for all HTTP requests:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl apply --filename - <<EOF
|
|
||||||
apiVersion: networking.istio.io/v1alpha3
|
|
||||||
kind: Gateway
|
|
||||||
metadata:
|
|
||||||
name: knative-ingress-gateway
|
|
||||||
namespace: knative-serving
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
istio: ingressgateway
|
|
||||||
servers:
|
|
||||||
- port:
|
|
||||||
number: 80
|
|
||||||
name: http
|
|
||||||
protocol: HTTP
|
|
||||||
hosts:
|
|
||||||
- "*"
|
|
||||||
tls:
|
|
||||||
# Sends 301 redirect for all http requests.
|
|
||||||
# Omit to allow http and https.
|
|
||||||
httpsRedirect: true
|
|
||||||
- port:
|
|
||||||
number: 443
|
|
||||||
name: https
|
|
||||||
protocol: HTTPS
|
|
||||||
hosts:
|
|
||||||
- "*"
|
|
||||||
tls:
|
|
||||||
mode: SIMPLE
|
|
||||||
privateKey: /etc/istio/ingressgateway-certs/tls.key
|
|
||||||
serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
Congratulations, you can now access your Knative services with secure HTTPS
|
|
||||||
connections. Your Knative cluster is configured to use cert-manager to manually
|
|
||||||
obtain TLS certificates but see the following section about automating that
|
|
||||||
process.
|
|
||||||
|
|
||||||
## Configure Knative for automatic certificate provisioning
|
|
||||||
|
|
||||||
You can update your Knative configuration to automatically obtain and renew TLS
|
|
||||||
certificates before they expire. To learn more about automatic certificates, see
|
|
||||||
[Enabling automatic TLS certificate provisioning](./using-auto-tls.md).
|
|
||||||
|
|
@ -1,429 +0,0 @@
|
||||||
---
|
|
||||||
title: "Using ExternalDNS on Google Cloud Platform to automate DNS setup"
|
|
||||||
#linkTitle: "OPTIONAL_ALTERNATE_NAV_TITLE"
|
|
||||||
weight: 70
|
|
||||||
type: "docs"
|
|
||||||
---
|
|
||||||
|
|
||||||
# Using ExternalDNS on Google Cloud Platform to automate DNS setup
|
|
||||||
|
|
||||||
[ExternalDNS](https://github.com/kubernetes-incubator/external-dns) is a tool
|
|
||||||
that synchronizes exposed Kubernetes Services and Ingresses with DNS providers.
|
|
||||||
|
|
||||||
This doc explains how to set up ExternalDNS within a Knative cluster using
|
|
||||||
[Google Cloud DNS](https://cloud.google.com/dns/) to automate the process of
|
|
||||||
publishing the Knative domain.
|
|
||||||
|
|
||||||
## Set up environtment variables
|
|
||||||
|
|
||||||
Run the following command to configure the environment variables
|
|
||||||
|
|
||||||
```shell
|
|
||||||
export PROJECT_NAME=<your-google-cloud-project-name>
|
|
||||||
|
|
||||||
export CUSTOM_DOMAIN=<your-custom-domain-used-in-knative>
|
|
||||||
|
|
||||||
export CLUSTER_NAME=<knative-cluster-name>
|
|
||||||
|
|
||||||
export CLUSTER_ZONE=<knative-cluster-zone>
|
|
||||||
```
|
|
||||||
|
|
||||||
## Set up Kubernetes Engine cluster with CloudDNS read/write permissions
|
|
||||||
|
|
||||||
There are two ways to set up a Kubernetes Engine cluster with CloudDNS
|
|
||||||
read/write permissions.
|
|
||||||
|
|
||||||
### Cluster with Cloud DNS scope
|
|
||||||
|
|
||||||
You can create a GKE cluster with Cloud DNS scope by entering the following
|
|
||||||
command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud container clusters create $CLUSTER_NAME \
|
|
||||||
--zone=$CLUSTER_ZONE \
|
|
||||||
--cluster-version=latest \
|
|
||||||
--machine-type=n1-standard-4 \
|
|
||||||
--enable-autoscaling --min-nodes=1 --max-nodes=10 \
|
|
||||||
--enable-autorepair \
|
|
||||||
--scopes=service-control,service-management,compute-rw,storage-ro,cloud-platform,logging-write,monitoring-write,pubsub,datastore,"https://www.googleapis.com/auth/ndev.clouddns.readwrite" \
|
|
||||||
--num-nodes=3
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that by using this way, any pod within the cluster will have permissions to
|
|
||||||
read/write CloudDNS.
|
|
||||||
|
|
||||||
### Cluster with Cloud DNS Admin Service Account credential
|
|
||||||
|
|
||||||
1. Create a GKE cluster without Cloud DNS scope by entering the following
|
|
||||||
command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud container clusters create $CLUSTER_NAME \
|
|
||||||
--zone=$CLUSTER_ZONE \
|
|
||||||
--cluster-version=latest \
|
|
||||||
--machine-type=n1-standard-4 \
|
|
||||||
--enable-autoscaling --min-nodes=1 --max-nodes=10 \
|
|
||||||
--enable-autorepair \
|
|
||||||
--scopes=service-control,service-management,compute-rw,storage-ro,cloud-platform,logging-write,monitoring-write,pubsub,datastore \
|
|
||||||
--num-nodes=3
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Create a new service account for Cloud DNS admin role.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# Name of the service account you want to create.
|
|
||||||
export CLOUD_DNS_SA=cloud-dns-admin
|
|
||||||
|
|
||||||
gcloud --project $PROJECT_NAME iam service-accounts \
|
|
||||||
create $CLOUD_DNS_SA \
|
|
||||||
--display-name "Service Account to support ACME DNS-01 challenge."
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Bind the role `dns.admin` to the newly created service account.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
# Fully-qualified service account name also has project-id information.
|
|
||||||
export CLOUD_DNS_SA=$CLOUD_DNS_SA@$PROJECT_NAME.iam.gserviceaccount.com
|
|
||||||
|
|
||||||
gcloud projects add-iam-policy-binding $PROJECT_NAME \
|
|
||||||
--member serviceAccount:$CLOUD_DNS_SA \
|
|
||||||
--role roles/dns.admin
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Download the secret key file for your service account.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud iam service-accounts keys create ~/key.json \
|
|
||||||
--iam-account=$CLOUD_DNS_SA
|
|
||||||
```
|
|
||||||
|
|
||||||
5. Upload the service account credential to your cluster. This command uses the
|
|
||||||
secret name `cloud-dns-key`, but you can choose a different name.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl create secret generic cloud-dns-key \
|
|
||||||
--from-file=key.json=$HOME/key.json
|
|
||||||
```
|
|
||||||
|
|
||||||
6. Delete the local secret
|
|
||||||
|
|
||||||
```shell
|
|
||||||
rm ~/key.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Now your cluster has the credential of your CloudDNS admin service account. And
|
|
||||||
it can be used to access your Cloud DNS. You can enforce the access of the
|
|
||||||
credentail secret within your cluster, so that only the pods that have the
|
|
||||||
permission to get the credential secret can access your Cloud DNS.
|
|
||||||
|
|
||||||
## Set up Knative
|
|
||||||
|
|
||||||
1. Follow the [instruction](../install/) to install Knative on your
|
|
||||||
cluster.
|
|
||||||
1. Configure Knative to use your custom domain.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl edit cm config-domain --namespace knative-serving
|
|
||||||
```
|
|
||||||
|
|
||||||
This command opens your default text editor and allows you to edit the config
|
|
||||||
map.
|
|
||||||
|
|
||||||
```
|
|
||||||
apiVersion: v1
|
|
||||||
data:
|
|
||||||
example.com: ""
|
|
||||||
kind: ConfigMap
|
|
||||||
[...]
|
|
||||||
```
|
|
||||||
|
|
||||||
Edit the file to replace `example.com` with your custom domain (the value of
|
|
||||||
`$CUSTOM_DOMAIN`) and save your changes. In this example, we use domain
|
|
||||||
`external-dns-test.my-org.do` for all routes:
|
|
||||||
|
|
||||||
```
|
|
||||||
apiVersion: v1
|
|
||||||
data:
|
|
||||||
external-dns-test.my-org.do: ""
|
|
||||||
kind: ConfigMap
|
|
||||||
[...]
|
|
||||||
```
|
|
||||||
|
|
||||||
## Set up ExternalDNS
|
|
||||||
|
|
||||||
This guide uses Google Cloud Platform as an example to show how to set up
|
|
||||||
ExternalDNS. You can find detailed instructions for other cloud providers in the
|
|
||||||
[ExternalDNS documentation](https://github.com/kubernetes-incubator/external-dns#deploying-to-a-cluster).
|
|
||||||
|
|
||||||
### Create a DNS zone for managing DNS records
|
|
||||||
|
|
||||||
Skip this step if you already have a zone for managing the DNS records of your
|
|
||||||
custom domain.
|
|
||||||
|
|
||||||
A DNS zone which will contain the managed DNS records needs to be created.
|
|
||||||
|
|
||||||
Use the following command to create a DNS zone with
|
|
||||||
[Google Cloud DNS](https://cloud.google.com/dns/):
|
|
||||||
|
|
||||||
```shell
|
|
||||||
export DNS_ZONE_NAME=<dns-zone-name>
|
|
||||||
|
|
||||||
gcloud dns managed-zones create $DNS_ZONE_NAME \
|
|
||||||
--dns-name $CUSTOM_DOMAIN \
|
|
||||||
--description "Automatically managed zone by kubernetes.io/external-dns"
|
|
||||||
```
|
|
||||||
|
|
||||||
Make a note of the nameservers that were assigned to your new zone.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud dns record-sets list \
|
|
||||||
--zone $DNS_ZONE_NAME \
|
|
||||||
--name $CUSTOM_DOMAIN \
|
|
||||||
--type NS
|
|
||||||
```
|
|
||||||
|
|
||||||
You should see output similar to the following assuming your custom domain is
|
|
||||||
`external-dns-test.my-org.do`:
|
|
||||||
|
|
||||||
```
|
|
||||||
NAME TYPE TTL DATA
|
|
||||||
external-dns-test.my-org.do. NS 21600 ns-cloud-e1.googledomains.com.,ns-cloud-e2.googledomains.com.,ns-cloud-e3.googledomains.com.,ns-cloud-e4.googledomains.com.
|
|
||||||
```
|
|
||||||
|
|
||||||
In this case, the DNS nameservers are `ns-cloud-{e1-e4}.googledomains.com`.
|
|
||||||
Yours could differ slightly, e.g. {a1-a4}, {b1-b4} etc.
|
|
||||||
|
|
||||||
If this zone has the parent zone, you need to add NS records of this zone into
|
|
||||||
the parent zone so that this zone can be found from the parent. Assuming the
|
|
||||||
parent zone is `my-org-do` and the parent domain is `my-org.do`, and the parent
|
|
||||||
zone is also hosted at Google Cloud DNS, you can follow these steps to add the
|
|
||||||
NS records of this zone into the parent zone:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud dns record-sets transaction start --zone "my-org-do"
|
|
||||||
gcloud dns record-sets transaction add ns-cloud-e{1..4}.googledomains.com. \
|
|
||||||
--name "external-dns-test.my-org.do." --ttl 300 --type NS --zone "my-org-do"
|
|
||||||
gcloud dns record-sets transaction execute --zone "my-org-do"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Deploy ExternalDNS
|
|
||||||
|
|
||||||
Firstly, choose the manifest of ExternalDNS.
|
|
||||||
|
|
||||||
Use below manifest if you set up your cluster with
|
|
||||||
[CloudDNS scope](#cluster-with-cloud-dns-scope).
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ServiceAccount
|
|
||||||
metadata:
|
|
||||||
name: external-dns
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: ClusterRole
|
|
||||||
metadata:
|
|
||||||
name: external-dns
|
|
||||||
rules:
|
|
||||||
- apiGroups: [""]
|
|
||||||
resources: ["services"]
|
|
||||||
verbs: ["get", "watch", "list"]
|
|
||||||
- apiGroups: [""]
|
|
||||||
resources: ["pods"]
|
|
||||||
verbs: ["get", "watch", "list"]
|
|
||||||
- apiGroups: ["extensions"]
|
|
||||||
resources: ["ingresses"]
|
|
||||||
verbs: ["get", "watch", "list"]
|
|
||||||
- apiGroups: [""]
|
|
||||||
resources: ["nodes"]
|
|
||||||
verbs: ["list"]
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: ClusterRoleBinding
|
|
||||||
metadata:
|
|
||||||
name: external-dns-viewer
|
|
||||||
roleRef:
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
kind: ClusterRole
|
|
||||||
name: external-dns
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: external-dns
|
|
||||||
namespace: default
|
|
||||||
---
|
|
||||||
apiVersion: extensions/v1beta1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: external-dns
|
|
||||||
spec:
|
|
||||||
strategy:
|
|
||||||
type: Recreate
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: external-dns
|
|
||||||
spec:
|
|
||||||
serviceAccountName: external-dns
|
|
||||||
containers:
|
|
||||||
- name: external-dns
|
|
||||||
image: registry.opensource.zalan.do/teapot/external-dns:latest
|
|
||||||
args:
|
|
||||||
- --source=service
|
|
||||||
- --domain-filter=$CUSTOM_DOMAIN # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
|
|
||||||
- --provider=google
|
|
||||||
- --google-project=$PROJECT_NAME # Use this to specify a project different from the one external-dns is running inside
|
|
||||||
- --policy=sync # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
|
|
||||||
- --registry=txt
|
|
||||||
- --txt-owner-id=my-identifier
|
|
||||||
```
|
|
||||||
|
|
||||||
Or use below manifest if you set up your cluster with
|
|
||||||
[CloudDNS service account credential](#cluster-with-cloud-dns-admin-service-account-credential).
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ServiceAccount
|
|
||||||
metadata:
|
|
||||||
name: external-dns
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: ClusterRole
|
|
||||||
metadata:
|
|
||||||
name: external-dns
|
|
||||||
rules:
|
|
||||||
- apiGroups: [""]
|
|
||||||
resources: ["services"]
|
|
||||||
verbs: ["get", "watch", "list"]
|
|
||||||
- apiGroups: [""]
|
|
||||||
resources: ["pods,secrets"]
|
|
||||||
verbs: ["get", "watch", "list"]
|
|
||||||
- apiGroups: ["extensions"]
|
|
||||||
resources: ["ingresses"]
|
|
||||||
verbs: ["get", "watch", "list"]
|
|
||||||
- apiGroups: [""]
|
|
||||||
resources: ["nodes"]
|
|
||||||
verbs: ["list"]
|
|
||||||
---
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: ClusterRoleBinding
|
|
||||||
metadata:
|
|
||||||
name: external-dns-viewer
|
|
||||||
roleRef:
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
kind: ClusterRole
|
|
||||||
name: external-dns
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: external-dns
|
|
||||||
namespace: default
|
|
||||||
---
|
|
||||||
apiVersion: extensions/v1beta1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: external-dns
|
|
||||||
spec:
|
|
||||||
strategy:
|
|
||||||
type: Recreate
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: external-dns
|
|
||||||
spec:
|
|
||||||
volumes:
|
|
||||||
- name: google-cloud-key
|
|
||||||
secret:
|
|
||||||
secretName: cloud-dns-key
|
|
||||||
serviceAccountName: external-dns
|
|
||||||
containers:
|
|
||||||
- name: external-dns
|
|
||||||
image: registry.opensource.zalan.do/teapot/external-dns:latest
|
|
||||||
volumeMounts:
|
|
||||||
- name: google-cloud-key
|
|
||||||
mountPath: /var/secrets/google
|
|
||||||
env:
|
|
||||||
- name: GOOGLE_APPLICATION_CREDENTIALS
|
|
||||||
value: /var/secrets/google/key.json
|
|
||||||
args:
|
|
||||||
- --source=service
|
|
||||||
- --domain-filter=$CUSTOM_DOMAIN # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
|
|
||||||
- --provider=google
|
|
||||||
- --google-project=$PROJECT_NAME # Use this to specify a project different from the one external-dns is running inside
|
|
||||||
- --policy=sync # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
|
|
||||||
- --registry=txt
|
|
||||||
- --txt-owner-id=my-identifier
|
|
||||||
```
|
|
||||||
|
|
||||||
Then use the following command to apply the manifest you chose to install
|
|
||||||
ExternalDNS
|
|
||||||
|
|
||||||
```shell
|
|
||||||
cat <<EOF | kubectl apply --filename -
|
|
||||||
<your-chosen-manifest>
|
|
||||||
EOF
|
|
||||||
```
|
|
||||||
|
|
||||||
You should see ExternalDNS is installed by running:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl get deployment external-dns
|
|
||||||
```
|
|
||||||
|
|
||||||
### Configuring Knative Gateway service
|
|
||||||
|
|
||||||
In order to publish the Knative Gateway service, the annotation
|
|
||||||
`external-dns.alpha.kubernetes.io/hostname: '*.$CUSTOM_DOMAIN` needs to be added
|
|
||||||
into Knative gateway service:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
INGRESSGATEWAY=istio-ingressgateway
|
|
||||||
|
|
||||||
kubectl edit svc $INGRESSGATEWAY --namespace istio-system
|
|
||||||
```
|
|
||||||
|
|
||||||
This command opens your default text editor and allows you to add the annotation
|
|
||||||
to `istio-ingressgateway` service. After you've added your annotation, your
|
|
||||||
file may look similar to this (assuming your custom domain is
|
|
||||||
`external-dns-test.my-org.do`):
|
|
||||||
|
|
||||||
```
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
annotations:
|
|
||||||
external-dns.alpha.kubernetes.io/hostname: '*.external-dns-test.my-org.do'
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
### Verify ExternalDNS works
|
|
||||||
|
|
||||||
After roughly two minutes, check that a corresponding DNS record for your
|
|
||||||
service was created.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
gcloud dns record-sets list --zone $DNS_ZONE_NAME --name "*.$CUSTOM_DOMAIN."
|
|
||||||
```
|
|
||||||
|
|
||||||
You should see output similar to:
|
|
||||||
|
|
||||||
```
|
|
||||||
NAME TYPE TTL DATA
|
|
||||||
*.external-dns-test.my-org.do. A 300 35.231.248.30
|
|
||||||
*.external-dns-test.my-org.do. TXT 300 "heritage=external-dns,external-dns/owner=my-identifier,external-dns/resource=service/istio-system/istio-ingressgateway"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Verify domain has been published
|
|
||||||
|
|
||||||
You can check if the domain has been published to the Internet be entering the
|
|
||||||
following command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
host test.external-dns-test.my-org.do
|
|
||||||
```
|
|
||||||
|
|
||||||
You should see the below result after the domain is published:
|
|
||||||
|
|
||||||
```
|
|
||||||
test.external-dns-test.my-org.do has address 35.231.248.30
|
|
||||||
```
|
|
||||||
|
|
||||||
> Note: The process of publishing the domain to the Internet can take several
|
|
||||||
> minutes.
|
|
||||||
|
|
@ -99,10 +99,6 @@ nav:
|
||||||
- Feature/Extension Flags: serving/feature-flags.md
|
- Feature/Extension Flags: serving/feature-flags.md
|
||||||
- Configuring the ingress gateway: serving/setting-up-custom-ingress-gateway.md
|
- Configuring the ingress gateway: serving/setting-up-custom-ingress-gateway.md
|
||||||
- Setting up a custom domain: serving/using-a-custom-domain.md
|
- Setting up a custom domain: serving/using-a-custom-domain.md
|
||||||
- GKE Topics:
|
|
||||||
- Assigning static IPs - GKE: serving/gke-assigning-static-ip-address.md
|
|
||||||
- Using ExternalDNS on Google Cloud Platform to automate DNS setup: serving/using-external-dns-on-gcp.md
|
|
||||||
- Configuring HTTPS with Cloud DNS: serving/using-cert-manager-on-gcp.md
|
|
||||||
- Code samples:
|
- Code samples:
|
||||||
- Overview: serving/samples/README.md
|
- Overview: serving/samples/README.md
|
||||||
- Routing and managing traffic: serving/samples/blue-green-deployment.md
|
- Routing and managing traffic: serving/samples/blue-green-deployment.md
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue