Link Search Menu Expand Document

Um den Aufwand zu reduzieren, und die manuelle Verwaltung Ihrer DNS-Zone zu minimieren, kann man ExternalDNS verwenden. ExternalDNS ermöglicht Ihnen DNS-Einträge dynamisch über Kubernetes je nach DNS-Anbieter zu steuern. ExternalDNS ist kein eigenständiger DNS-Server, sondern konfiguriert lediglich DNS-Ressourcen in externen DNS-Providern. Beispielsweise (OpenStack Designate, Amazon Route53, Google Cloud DNS, usw.)

Voraussetzungen

Um diesen Guide erfolgreich abzuschließen brauchen Sie Folgendes:

Konfigurieren Sie Ihre Domäne zur Verwendung von Designate

Delegieren Sie Ihre Domains von Ihrem externen DNS-Anbieter auf unsere folgende DNS-Nameserver, damit Designate die DNS-Ressourcen Ihrer Domaine steuern kann.

dns1.ddns.innovo.cloud
dns2.ddns.innovo.cloud

DNS-Zone in OpenStack-Designate anlegen

Bevor Sie beginnen ExternalDNS zu nutzen, sollen Sie Ihre DNS-Zone manuell in Ihrem DNS-Provider anlegen. In unserem Beispiel wird die Zone foobar.cloud. in OpenStack-Designate mithilfe der OpenStack-CLI-Tools wie folgt angelegt.

PS: Bitte fügen Sie immer am Ende Ihrer Zone einen . an.

$ openstack zone create --email webmaster@foobar.cloud foobar.cloud.
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| action         | CREATE                               |
| attributes     |                                      |
| created_at     | 2018-08-15T06:45:24.000000           |
| description    | None                                 |
| email          | webmaster@foobar.cloud               |
| id             | 036ae6e6-6318-47e1-920f-be518d845fb5 |
| masters        |                                      |
| name           | foobar.cloud.                        |
| pool_id        | bb031d0d-b8ca-455a-8963-50ec70fe57cf |
| project_id     | 2b62bc8ff48445f394d0318dbd058967     |
| serial         | 1534315524                           |
| status         | PENDING                              |
| transferred_at | None                                 |
| ttl            | 3600                                 |
| type           | PRIMARY                              |
| updated_at     | None                                 |
| version        | 1                                    |
+----------------+--------------------------------------+

Prüfen Sie, dass die Zone tatsächlich angelegt wurde:

$ openstack zone list
+--------------------------------------+-----------------------+---------+------------+--------+--------+
| id                                   | name                  | type    |     serial | status | action |
+--------------------------------------+-----------------------+---------+------------+--------+--------+
| 036ae6e6-6318-47e1-920f-be518d845fb5 | foobar.cloud.         | PRIMARY | 1534315524 | ACTIVE | NONE   |
+--------------------------------------+-----------------------+---------+------------+--------+--------+

$ openstack zone show foobar.cloud.
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| action         | NONE                                 |
| attributes     |                                      |
| created_at     | 2018-08-15T06:45:24.000000           |
| description    | None                                 |
| email          | webmaster@foobar.cloud               |
| id             | 036ae6e6-6318-47e1-920f-be518d845fb5 |
| masters        |                                      |
| name           | foobar.cloud.                        |
| pool_id        | bb031d0d-b8ca-455a-8963-50ec70fe57cf |
| project_id     | 2b62bc8ff48445f394d0318dbd058967     |
| serial         | 1534315524                           |
| status         | ACTIVE                               |
| transferred_at | None                                 |
| ttl            | 3600                                 |
| type           | PRIMARY                              |
| updated_at     | 2018-08-15T06:45:30.000000           |
| version        | 2                                    |
+----------------+--------------------------------------+

Die Installation vom ExternalDNS über Helm

Bitte installieren Sie ExternalDNS in ihrem Cluster. In unserem Beispiel nutzen wir wie folgendes Helm für die Installation:

  • Helm-Installation
  • $ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
  • $ helm repo update
  • Legen Sie die Datei values.yaml und passen Sie die Werte dieser an, für weitere Optionen siehe: values-external-dns:
## K8s resources type to be observed for new DNS entries by ExternalDNS
##
sources:
  - service
  - ingress

## DNS provider where the DNS records will be created. Available providers are:
## - aws, azure, cloudflare, coredns, designate, digitalocoean, google, infoblox, rfc2136, transip
##
provider: designate

## Adjust the interval for DNS updates
##
interval: "1m"

## Registry Type. Available types are: txt, noop
## ref: https://github.com/kubernetes-incubator/external-dns/blob/master/docs/proposal/registry.md
##
registry: "txt"

## TXT Registry Identifier, a name that identifies this instance of External-DNS
## This value should not change, while the cluter exists
##
txtOwnerId: "external-dns"

## Modify how DNS records are sychronized between sources and providers (options: sync, upsert-only )
##
policy: sync

## Configure resource requests and limits
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
##
resources:
  limits:
    memory: 50Mi
    cpu: 10m
  requests:
    memory: 50Mi
    cpu: 10m
## Configure your OS Access
##
extraEnv:
  - name: OS_AUTH_URL
    value: https://identity.optimist.innovo.cloud/v3
  - name: OS_REGION_NAME
    value: fra
  - name: OS_USERNAME
    value: "%YOUR_OPENSTACK_USERNAME%"
  - name: OS_PASSWORD
    value: "%YOUR_OPENSTACK_PASSWORD%"
  - name: OS_PROJECT_NAME
    value: "%YOUR_OPENSTACK_PROJECT_NAME%"
  - name: OS_USER_DOMAIN_NAME
    value: Default
  • $ kubectl create namespace external-dns
  • $ helm upgrade --install external-dns -f values.yaml stable/external-dns --namespace=external-dns

Nginx Deployment starten

Um den FQDN bzw. die Domain zu testen, legen Sie beispielsweise dieses Deployment als nginx.yaml an:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    external-dns.alpha.kubernetes.io/hostname: nginx.foobar.cloud
    external-dns.alpha.kubernetes.io/ttl: "60"
spec:
  selector:
    app: nginx
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

Nachdem Sie diese Deklarationsdatei angelegt haben, wenden Sie diese an:

kubectl apply -f nginx.yaml

Verifizieren Sie die Ergebnisse

Überprüfen Sie Ihre DNS-Ressourcen in OpenStack. Sie sollten eine ähnliche Liste mit den entsprechenden DNS-Einträgen sehen.

openstack recordset list foobar.cloud.

Warten Sie ein paar Minuten und testen Sie dann die Verfügbarkeit über das Internet. Rufen Sie Ihrer Webseite auf. Dort sollten Sie Folgendes in Ihrem Browser sehen.

nginx

Zusammenfassung

Folgende Inhaltspunkte wurden erfolgreich durchgeführt:

  • Was ist ExternalDNS und wie die im Kubernetes-Cluster zu installieren ist.
  • Die Konfiguration vom ExternalDNS über Helm, um OpenStack Designate anzusprechen
  • Erstellung eines Nginx-Deployments und das Testen der Konnektivität

Herzlichen Glückwunsch! Dies sind alle notwendigen Schritte, um in Kubernetes dynamische DNS-Ressourcen zu steuern.