Рубрики
Uncategorized

Используя Coredns эффективно с Куберовщиком

Backstory Мы увеличивали HTTP-запросы для одного из наших приложений, размещенных на Kube … Теги от Кубернаны, Coredns, DevOps, DNS.

Бросок

Мы увеличивали HTTP-запросы для одного из наших приложений, размещенные в кластере Kubernetes, что привело к шипу ошибок 5xx. Приложение — это сервер GraphQL, вызывающий множество внешних API, а затем возвращает агрегированный ответ. Наш первоначальный ответ состояла в том, чтобы увеличить количество реплик для приложения, чтобы увидеть, улучшает ли он производительность и уменьшает ошибки. Когда мы пробурили дальше с помощью разработчика приложений, нашли большую часть неудач, связанных с разрешением DNS. Вот где мы начали сверлять по разрешению DNS в Кубейнетах.

Этот пост подчеркивает наши учащиеся, связанные с Coredns, поскольку мы сделали глубокое погружение в процессе устранения неполадок.

Coredns. Метрики

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

Coredns стал DNS-сервис по умолчанию Для Kubernetes 1.13+ внутрь. В настоящее время, когда вы используете управляемый кластер Kubernetes или вы управляете кластером для ваших рабочих нагрузок ваших приложений, вы часто сосредоточены на настройке вашего приложения, но не так много на услуги, предоставляемые Kubernetes или как вы их используете. Разрешение DNS — это основное требование любого приложения, поэтому вам нужно обеспечить его правильно. Мы бы предложили смотреть на DNS-отладки-разрешение Руководство по устранению неисправностей и убедитесь, что ваши Coredns настроен и работает правильно.

По умолчанию, когда вы предоставляете кластер, вы всегда должны иметь приборную панель для наблюдения за ключевыми метриками Coredns. Для получения метрик Coredns вы должны иметь Плагин PROMETHEUS Включено как часть конфигурации Coredns.

Ниже образец конфигурации с использованием Prometheus Плагин для включения Metrics Collection от экземпляра Coredns.

.:53 {
    errors
    health
    kubernetes cluster.local in-addr.arpa ip6.arpa {
      pods verified
      fallthrough in-addr.arpa ip6.arpa
    }
    prometheus :9153
    forward . /etc/resolv.conf
    cache 30
    loop
    reload
    loadbalance
}

Ниже приведены ключевые метрики, мы бы предложили иметь на приборной панели. Если вы используете PROMETHEUS, DATADOG, KIBANA ETC, вы можете найти готовые к использованию шаблона приборной панели из сообщества/провайдера.

  • Процент удара кэша: процент запросов ответил с использованием кеша Coredns
  • DNS просит задержку
    • Coredns: Время, сделанное Coredns для обработки запроса DNS
    • Upstream Server: время, необходимое для обработки запроса DNS
  • Количество запросов направлено до восходящих серверов
  • Коды ошибок для запросов

    • Nxdomain: несуществующий домен
    • FormerR: Ошибка формата в DNS-запросе
    • Servfail: Сбой сервера
    • NOERROR: Нет ошибки, успешно обработанный запрос
  • Использование ресурсов Coredns: разные ресурсы, потребляемые сервером, такими как память, CPU и т. Д.

Мы использовали Datadog для конкретного мониторинга приложений. Ниже приведена лишь лишь приборная панель, которую я построил с DataDog для моего анализа.

Уменьшение ошибок DNS

Когда мы больше начали сверлять, как приложение представляет запросы Coredns, мы наблюдали большую часть исходящих запросов, происходящих через приложение к внешнему серверу API.

Обычно это как resolv.conf смотрит в POD развертывания приложения.

nameserver 10.100.0.10
search kube-namespace.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal
options ndots:5

Если вы понимаете, как Kubernetes пытается разрешить FQDN, он пытается найти DNS на разных уровнях.

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

Если мы ищем домен BokTube.io, это сделает следующие запросы, и она получает успешный ответ в последнем запросе.

botkube.io.kube-namespace.svc.cluster.local  <= NXDomain
botkube.io.svc.cluster.local <= NXDomain
boktube.io.cluster.local <= NXDomain
botkube.io.us-west-2.compute.internal <= NXDomain
botkube.io <= NoERROR

Поскольку мы делали слишком много внешних поисков, мы получили много ответов Nxdomain для поиска DNS. Чтобы оптимизировать это мы настроили spec.template.spec.dnsconfig в объекте развертывания. Вот как выглядит изменение:

     dnsPolicy: ClusterFirst
     dnsConfig:
       options:
       - name: ndots
         value: "1"

С вышеупомянутым изменением, resolv.conf на стручках изменился. Поиск проводится только для внешнего домена. Это сократилось количество запросов к DNS-серверам. Это также помогло уменьшить ошибки 5xx для приложения. Вы можете заметить разницу в количестве ответов Nxdomain на следующем графике.

Лучшее решение для этой проблемы — Кэш уровня узла который введен Kubernetes 1.18+.

Настройка Coredns к вашим потребностям

Мы можем настроить Coredns, используя плагины. Kubernetes поддерживает другую рабочую нагрузку, а стандарт Coredns Config может не соответствовать всем вашим потребностям. У Coredns есть пара на дереве и внешние плагины. В зависимости от вида рабочих нагрузок, которые вы работаете в вашем кластере, скажем, приложения, а имеющие друг друга или автономные приложения, которые взаимодействуют за пределами вашего кластера Kubernetes, вид FQDN, который вы пытаетесь разрешить, могут варьироваться. Мы должны пытаться корректировать ручки Coredns соответственно. Предположим, вы работаете Kubernetes в определенном общественном/частном облаке, а большинство приложений в DNS находятся в одном облаке. В этом случае Coredns также предоставляет определенные облачные или общие плагины, которые могут использоваться для расширения записей DNS-зоны.

Если вы заинтересованы в настройке поведения DNS для ваших потребностей, мы бы предложили пройти через книгу «Обучение Coredns» Cricket Liu и John Belamaric. Книга предоставляет подробный обзор различных плагинов Coredns с их использованием. Он также охватывает интеграцию Coredns + Kubernetes в глубину.

Если вы используете подходящее количество экземпляров Coredns в кластере Kubernetes, или нет, является одним из критических факторов для решения. Рекомендуется запускать несколько экземпляров сервера Coredns для лучшей гарантии обслуживания запросов DNS. В зависимости от количества обслуживания запросов, природы запросов, количество рабочих нагрузок, работающих на кластере, а размер кластера, вам может потребоваться добавить дополнительные экземпляры Coredns или настроить HPA (горизонтальный автоскалер POD) для вашего кластера. Подобные факторы, такие как количество обслуживаемых запросов, природа запросов, количество рабочих нагрузок, работающих на кластере и размере кластера, должно помочь вам в решении количества экземпляров Coredns. Возможно, вам понадобится добавить дополнительные экземпляры Coredns или настроить HPA (горизонтальный автоскалер POD) для вашего кластера.

Резюме

Этот блог пост пытается подчеркнуть важность цикла запросов DNS в Кубейнетах, и во многих случаях вы закончите ситуацию, когда вы начинаете с «Это не DNS», но в конечном итоге «это всегда DNS!». Так что будьте осторожны с этими наземными минами.

Наслаждался статьей? Давайте подключемся к Twitter и начать разговор.

Оригинал: «https://dev.to/infracloud/using-coredns-effectively-with-kubernetes-1mcl»