Как автоматически управлять записями DNS из DigitalOcean Kubernetes с использованием ExternalDNS

Автор выбрал Free и Open Source Fund, чтобы получить пожертвование как часть Write for DOnations program.

Вступление

При развертывании веб-приложений в Kubernetes вы обычно используете Services и Ingresses для предоставления приложений за пределами кластера на вашем желаемый домен. Это включает ручную настройку не только входящего, но и DNS-записей у вашего провайдера, что может быть трудоемким и подверженным ошибкам процессом. Это может стать препятствием по мере усложнения вашего приложения; при изменении внешнего IP-адреса необходимо соответствующим образом обновить записи DNS.

Чтобы преодолеть это, Kubernetes sig-network team создали ExternalDNS с целью автоматического управления внешними записями DNS из кластера Kubernetes. После развертывания ExternalDNS работает в фоновом режиме и почти не требует дополнительной настройки. Каждый раз, когда Сервис или Вход создается или изменяется, ExternalDNS будет обновлять записи сразу.

В этом руководстве вы будете устанавливать ExternalDNS в свой кластер DigitalOcean Kubernetes через Helm и настраивать его для использования DigitalOcean в качестве поставщика DNS. Затем вы развернете образец веб-приложения с Ingress и будете использовать ExternalDNS, чтобы указать его для вашего доменного имени. В конце концов, у вас будет автоматизированная система управления записями DNS для Сервисов и Инжрессов.

Предпосылки

  • Кластер DigitalOcean Kubernetes с вашим соединением, настроенным как значение по умолчанию + kubectl +. Инструкции по настройке + kubectl + показаны в шаге * Подключиться к вашему кластеру * при создании кластера. Чтобы создать кластер Kubernetes в DigitalOcean, см. Https://www.digitalocean.com/docs/kubernetes/quickstart/[Kubernetes Quickstart].

  • Менеджер пакетов Helm установлен на вашем локальном компьютере, а Tiller установлен на вашем кластере. Для этого выполните шаги 1 и 2 из https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-package-manager[How Учебное пособие по установке программного обеспечения на кластеры Kubernetes с помощью диспетчера пакетов Helm.

  • Nginx Ingress Controller установлен в вашем кластере с помощью Helm для использования ExternalDNS с Ingress Resources. Чтобы сделать это, следуйте https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-on-digitalocean-kubernetes-using-helm[How, чтобы настроить вход Nginx на DigitalOcean Kubernetes Использование шлема. Вам необходимо установить для свойства + publishService + значение + true + согласно инструкциям в шаге 2.

  • Ключ API DigitalOcean (токен личного доступа) с разрешениями на чтение и запись. Чтобы создать его, посетите страницу How для создания токена личного доступа.

  • Полностью зарегистрированное доменное имя. Этот урок будет использовать ++ повсюду. Вы можете купить доменное имя на Namecheap, получить его бесплатно на Freenom или используйте регистратор домена по вашему выбору.

Шаг 1 - Установка ExternalDNS с помощью Helm

В этом разделе вы будете устанавливать ExternalDNS в свой кластер с помощью Helm и настраивать его для работы со службой DNS DigitalOcean.

Чтобы переопределить некоторые настройки по умолчанию для диаграммы ExternalDNS Helm, вам необходимо создать файл + values.yaml +, который вы передадите в Helm во время установки. На компьютере, который вы используете для доступа к кластеру в предварительных условиях, создайте файл, выполнив:

nano externaldns-values.yaml

Добавьте следующие строки:

externaldns-values.yaml

rbac:
 create: true

provider: digitalocean

digitalocean:
 apiToken:

interval: "1m"

policy: sync # or upsert-only

# domainFilters: [ '' ]

В первом блоке вы включаете создание манифеста RBAC (Role Based Access Control), который должен быть включен в кластерах Kubernetes с поддержкой RBAC, таких как DigitalOcean. В следующей строке вы устанавливаете DNS-провайдер на DigitalOcean. Затем в следующем блоке вы добавите свой токен DigitalOcean API, заменив ++.

Следующая строка устанавливает интервал, с которым ExternalDNS будет запрашивать изменения в Ingresses и Services. Вы можете установить его на более низкое значение, чтобы быстрее распространять изменения в DNS.

Параметр + policy + определяет, будет ли ExternalDNS вставлять только записи DNS (+ upsert-only +) или создавать и удалять их по мере необходимости (+ sync +). К счастью, начиная с версии 0.3, ExternalDNS поддерживает концепцию владения, создавая сопутствующие TXT записи, в которых он хранит информацию о создаваемых доменах, ограничивая область действия только те, что он создал.

Параметр + domainFilters + используется для ограничения доменов, которыми может управлять ExternalDNS. Вы можете раскомментировать его и ввести свои домены в виде массива строк, но в этом нет необходимости.

Когда вы закончите редактирование, сохраните и закройте файл.

Теперь установите ExternalDNS в ваш кластер, выполнив следующую команду:

helm install stable/external-dns --name external-dns -f externaldns-values.yaml

Вывод будет выглядеть примерно так:

OutputNAME:   external-dns
LAST DEPLOYED: ...
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                           READY  STATUS             RESTARTS  AGE
external-dns-69c545655f-xqjjf  0/1    ContainerCreating  0         0s

==> v1/Secret
NAME          TYPE    DATA  AGE
external-dns  Opaque  1     0s

==> v1/Service
NAME          TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
external-dns  ClusterIP    <none>       7979/TCP  0s

==> v1/ServiceAccount
NAME          SECRETS  AGE
external-dns  1        0s

==> v1beta1/ClusterRole
NAME          AGE
external-dns  0s

==> v1beta1/ClusterRoleBinding
NAME          AGE
external-dns  0s

==> v1beta1/Deployment
NAME          READY  UP-TO-DATE  AVAILABLE  AGE
external-dns  0/1    1           0          0s


NOTES:
...

Вы можете проверить создание ExternalDNS, выполнив следующую команду:

kubectl --namespace=default get pods -l "app=external-dns,release=external-dns" -w
OutputNAME                            READY   STATUS              RESTARTS   AGE
external-dns-69bfcf8ccb-7j4hp   0/1        0          3s

Вы установили ExternalDNS в свой кластер Kubernetes. Затем вы развернете пример веб-приложения, откроете его с помощью Nginx Ingress и позволите ExternalDNS автоматически указать ваше доменное имя на соответствующий балансировщик нагрузки.

Шаг 2. Развертывание и демонстрация примера веб-приложения

В этом разделе вы развернете фиктивное веб-приложение в своем кластере, чтобы показать его с помощью вашего Ingress. Затем вы настроите ExternalDNS для автоматической настройки DNS-записей. В итоге у вас будут записи DNS для вашего домена, указывающие на балансировщик нагрузки входного файла.

Развертываемое вами фиктивное веб-приложение https://hub.docker.com/r/hashicorp/http-echo/ [+ http-echo +] от Hashicorp. Это веб-сервер в памяти, который возвращает сообщение, которое вы ему даете. Вы будете хранить его манифесты Kubernetes в файле с именем + echo.yaml +. Создайте его и откройте для редактирования:

nano echo.yaml

Добавьте следующие строки в ваш файл:

echo.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: echo-ingress
spec:
 rules:
 - host:
   http:
     paths:
     - backend:
         serviceName: echo
         servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: echo
spec:
 ports:
 - port: 80
   targetPort: 5678
 selector:
   app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo
spec:
 selector:
   matchLabels:
     app: echo
 replicas: 3
 template:
   metadata:
     labels:
       app: echo
   spec:
     containers:
     - name: echo
       image: hashicorp/http-echo
       args:
       - "-text=Echo!"
       ports:
       - containerPort: 5678

В этой конфигурации вы определяете Развертывание, Вход и Сервис. Развертывание состоит из трех реплик приложения + http-echo + с переданным пользовательским сообщением (+ Echo! +). Сервис определен, чтобы разрешить доступ к Блокам в Развертывании через порт + 80 +. Вход настроен для предоставления службы в вашем домене.

Замените ++ вашим доменом, затем сохраните и закройте файл.

Теперь вам не нужно настраивать DNS-записи для домена вручную. ExternalDNS сделает это автоматически, как только вы примените конфигурацию к Kubernetes.

Чтобы применить конфигурацию, выполните следующую команду:

kubectl create -f echo.yaml

Вы увидите следующий вывод:

Outputingress.extensions/echo-ingress created
service/echo created
deployment.apps/echo created

Вам нужно будет немного подождать, пока ExternalDNS заметит изменения и создаст соответствующие записи DNS. Параметр «+ интервал » в диаграмме Хелма определяет продолжительность времени, в течение которого вам нужно ждать создания записи DNS. В ` values.yaml +` длина интервала по умолчанию установлена ​​на 1 минуту.

Вы можете посетить панель управления DigitalOcean, чтобы увидеть записи A и TXT.

изображение: https: //assets.digitalocean.com/articles/kubernetes_externaldns/externaldns.png [Панель управления - Сгенерированные записи DNS]

По истечении указанного промежутка времени войдите в свой домен с помощью + curl +:

curl

Вы увидите следующий вывод:

OutputEcho!

Это сообщение подтверждает, что вы настроили ExternalDNS и создали необходимые записи DNS для указания на Балансировщик нагрузки контроллера входа Nginx. Если вы видите сообщение об ошибке, дайте ему время. Или вы можете попробовать получить доступ к своему домену через браузер, где вы увидите + Echo! +.

Вы протестировали ExternalDNS, развернув пример приложения с Ingress. Вы также можете наблюдать новые записи DNS в вашей панели управления DigitalOcean. На следующем шаге вы откроете Сервис на своем доменном имени.

Шаг 3 - (Необязательно) Предоставление приложения с помощью службы

В этом необязательном разделе вы будете использовать Службы с ExternalDNS вместо Ingresses. ExternalDNS позволяет вам делать разные ресурсы Kubernetes доступными для DNS-серверов. Использование сервисов аналогично процессу Ingresses с измененной конфигурацией для этого альтернативного ресурса.

Поскольку вы будете настраивать Сервис, содержащийся в + echo.yaml +, вам больше не понадобится + echo-ingress +. Удалите его, используя следующую команду:

kubectl delete ing echo-ingress

Выход будет:

Outputingress.extensions/echo-ingress deleted

ExternalDNS удалит существующие записи DNS, созданные на предыдущем шаге. В оставшейся части шага вы можете использовать тот же домен, который вы использовали ранее.

Затем откройте файл + echo.yaml + для редактирования:

nano echo.yaml

Замените содержимое файла следующими строками:

echo.yaml

apiVersion: v1
kind: Service
metadata:
 name: echo


spec:

 ports:
 - port: 80
   targetPort: 5678
 selector:
   app: echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: echo
spec:
 selector:
   matchLabels:
     app: echo
 replicas: 3
 template:
   metadata:
     labels:
       app: echo
   spec:
     containers:
     - name: echo
       image: hashicorp/http-echo
       args:
       - "-text=Echo!"
       ports:
       - containerPort: 5678

Вы удалили Ingress из файла для предыдущей настройки и изменили тип службы на + LoadBalancer +. Кроме того, вы добавили аннотацию, указав имя домена для ExternalDNS.

Примените изменения к кластеру, выполнив следующую команду:

kubectl apply -f echo.yaml

Выход будет:

Outputservice/echo configured
deployment.apps/echo configured

Вы можете наблюдать, как балансировщик нагрузки службы становится доступным, запустив:

kubectl get svc echo -w

Вы увидите вывод, похожий на следующий:

OutputNAME   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
echo   LoadBalancer   10.245.81.235   <pending>     80:31814/TCP   8s
...

Как и в предыдущем шаге, вам нужно будет немного подождать, пока записи DNS будут созданы и распространены. Как только это будет сделано, + curl + указанный вами домен:

curl

Вывод будет таким же, как на предыдущем шаге:

OutputEcho!

Если вы получили ошибку, подождите немного дольше или попробуйте другой домен. Поскольку записи DNS кэшируются в клиентских системах, может потребоваться много времени для фактического распространения изменений.

На этом шаге вы создали службу (типа + LoadBalancer +) и указали ее на свое доменное имя, используя ExternalDNS.

Заключение

ExternalDNS работает в фоновом режиме и обеспечивает работу без трения. Ваш кластер Kubernetes только что стал центральным источником правды относительно доменов. Вам больше не придется обновлять записи DNS вручную.

Реальная сила ExternalDNS станет очевидной при создании сред тестирования из системы непрерывной доставки. Если вы хотите настроить одну такую ​​систему в своем кластере Kubernetes, посетите https://www.digitalocean.com/community/tutorials/how-to-set-up-a-cd-pipeline-with-spinnaker-on-digitalocean -cubernetes [Как настроить конвейер CD со Spinnaker в DigitalOcean Kubernetes].

Related