我认为标题是不言自明的。我做了很多实验,可悲的事实是 coredns
确实为集群内的所有请求增加了 20 ms
开销。一开始我们想也许通过增加更多的复制,并平衡更多实例之间的解析请求,我们可以改善响应时间,但它根本没有帮助。 (我们从 2 个 pods 扩大到 4 个 pods )
扩展到4个实例后,解析时间的波动有一些增强。但这不是我们所期望的,20 ms
开销仍然存在。
我们有一些 web 服务,它们的实际响应时间是 < 30 ms
并且使用 coredns
我们将响应时间加倍,这并不酷!
在对这件事得出结论后,我们做了一个实验来仔细检查这不是操作系统级别的开销。结果与我们预期的没有什么不同。
我们想也许我们可以基于将每个 pod 所需的 hostname
映射列表放入该 pod 的 /etc/hosts
来实现/部署一个解决方案。所以我最后的问题如下:
coredns
类似的事情? coredns
的替代解决方案吗? 任何想法或见解表示赞赏。提前致谢。
最佳答案
在 kubernetes 集群中运行 coreDNS 时需要注意几件事
内存
CoreDNS 推荐的副本内存量为
MB required (default settings) = (Pods + Services) / 1000 + 54
自动路径
Autopath 是 Coredns 中的一项功能,有助于增加外部查询的响应时间
通常 DNS 查询会通过
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 应该有助于解决负载问题。
自动调节器
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 中的 Beta
https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/
其他插件
这些也将有助于了解 CoreDNS 内部发生了什么
Error - 查询处理期间遇到的任何错误都将打印到标准输出。
Trace - 启用请求如何通过 CoreDNS 的 OpenTracing
Log - 查询日志
health - CoreDNS 已启动并运行,这将返回 200 OK HTTP 状态代码
ready - 通过启用就绪,当所有能够发出就绪信号的插件都这样做时,端口 8181 上的 HTTP 端点将返回 200 OK。
部署中应使用就绪和运行状况
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 Plugin
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
关于kubernetes - 如何避免 coredns 解决 kubernetes 中的开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60793911/