Автор выбрал 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].