Есть несколько вещей, на которые следует обратить внимание при запуске coreDNS в вашем кластере kubernetes
- Память
- AutoPath
- Количество реплик
- Autoscaler
- Другие плагины
- Метрики Prometheus
- Отдельные блоки сервера
Память
Рекомендуемый объем памяти CoreDNS для реплик равен
MB required (default settings) = (Pods + Services) / 1000 + 54
Autopath
Autopath - это функция в Coredns, которая помогает увеличить время отклика для внешних запросы
Обычно DNS-запрос проходит через
- .. sv c .cluster.local
- .sv c .cluster.local
- cluster.local
- Затем настраивается прямой, обычно путь поиска хоста (/etc/resolv.conf
Trying "example.com.default.svc.cluster.local"
Trying "example.com.svc.cluster.local"
Trying "example.com.cluster.local"
Trying "example.com"
Trying "example.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55265
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 30 IN A 93.184.216.34
Это требует больше памяти, поэтому расчет теперь становится
MB required (w/ autopath) = (Number of Pods + Services) / 250 + 56
Количество реплик
По умолчанию 2, но включение Autoscaler должно помочь с проблемами загрузки.
Autoscaler
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: coredns
namespace: default
spec:
maxReplicas: 20
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: coredns
targetCPUUtilizationPercentage: 50
Локальный кеш узла
Бета-версия в Kubernetes 1.15
NodeLocal DNSCache повышает производительность DNS кластера благодаря запуску агента кэширования DNS на узлах кластера как DaemonSet. В современной архитектуре блоки в режиме DNS ClusterFirst обращаются к IP-сервису kube-dns для запросов DNS. Это транслируется в конечную точку kube-dns / CoreDNS через правила iptables, добавленные kube-proxy. Благодаря этой новой архитектуре Pods будет обращаться к агенту кэширования dns, работающему на том же узле, избегая тем самым правил DNAT iptables и отслеживания соединений. Локальный агент кэширования запросит службу kube-dns на отсутствие кеша имен хостов кластера (суффикс cluster.local по умолчанию).
https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/
Other Плагины
Они также помогут увидеть, что происходит внутри CoreDNS
Ошибка - Любые ошибки, возникшие при обработке запроса, будут выводиться на стандартный вывод.
Trace - включить OpenTracing того, как запрос проходит через CoreDNS
Log - ведение журнала запросов
health - CoreDNS и работает, это возвращает код состояния HTTP 200 OK
ready - При включении готовности конечная точка HTTP на порту 8181 вернет 200 OK, когда все плагины, которые могут сигнализировать о готовности, сделали т.
Ready и Health следует использовать при развертывании
livenessProbe:
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /ready
port: 8181
scheme: HTTP
Prometheus Metrics
Плагин Prometheus
coredns_health_request_duration_seconds{} - duration to process a HTTP query to the local /health endpoint. As this a local operation, it should be fast. A (large) increase in this duration indicates the CoreDNS process is having trouble keeping up with its query load.
https://github.com/coredns/deployment/blob/master/kubernetes/Scaling_CoreDNS.md
Отдельные блоки сервера
Последний совет - отделить блок DNS-сервера кластера от внешнего блока
CLUSTER_DOMAIN REVERSE_CIDRS {
errors
health
kubernetes
ready
prometheus :9153
loop
reload
loadbalance
}
. {
errors
autopath @kubernetes
forward . UPSTREAMNAMESERVER
cache
loop
}
Подробнее о плагине k8 и других параметрах здесь https://github.com/coredns/coredns/blob/master/plugin/kubernetes/README.md