一、簡介
當集群規(guī)模較大時,運行的服務非常多,服務之間的頻繁進行大量域名解析,CoreDNS將會承受更大的壓力,可能會導致如下影響:
延遲增加:有限的coredns服務在解析大量的域名時,會導致解析結果返回慢。
業(yè)務訪問異常:集群內(nèi)的服務基本都是通過域名進行訪問,coredns在解析壓力大時會存在慢或者丟包的情況,導致服務之間解析異常。
二、原理架構
NodeLocal DNSCache 通過在集群節(jié)點上作為 DaemonSet 運行 DNS 緩存代理來提高集群 DNS 性能。 在當今的體系結構中,運行在 ‘ClusterFirst’ DNS 模式下的 Pod 可以連接到 kube-dns serviceIP 進行 DNS 查詢。 通過 kube-proxy 添加的 iptables 規(guī)則將其轉(zhuǎn)換為 kube-dns/CoreDNS 端點。 而借助新架構,Pod 將可以訪問在同一節(jié)點上運行的 DNS 緩存代理,從而避免 iptables DNAT 規(guī)則和連接跟蹤。 本地緩存代理將查詢 kube-dns 服務以獲取集群主機名的緩存缺失(默認為 “cluster.local” 后綴)
啟用 NodeLocal DNSCache 之后,DNS 查詢所遵循的路徑如下,流程圖取自官網(wǎng):
三、與coredns對比
1、 使用當前的 DNS 體系結構,如果沒有本地 kube-dns/CoreDNS 實例,則具有最高
DNS QPS 的 Pod 可能必須延伸到另一個節(jié)點。 在這種場景下,擁有本地緩存將有助于改善延遲。
2、 跳過 iptables DNAT 和連接跟蹤將有助于減少 conntrack 競爭并避免 UDP DNS 條目填滿 conntrack 表。
3、 從本地緩存代理到 kube-dns 服務的連接可以升級為 TCP。 TCP conntrack 條目將在連接關閉時被刪除,相反 UDP 條目必須超時 (默認 nf_conntrack_udp_timeout 是 30 秒)。
4、 將 DNS 查詢從 UDP 升級到 TCP 將減少由于被丟棄的 UDP 包和 DNS 超時而帶來的尾部等待時間; 這類延時通常長達 30 秒(3 次重試 + 10 秒超時)。 由于 nodelocal 緩存監(jiān)聽 UDP DNS 查詢,應用不需要變更。
5、 在節(jié)點級別對 DNS 請求的度量和可見性。
6、 可以重新啟用負緩存,從而減少對 kube-dns 服務的查詢數(shù)量。
四、NodeLocal DNSCache部署
1)修改kubelet.config文件,添加NodeLocal DNS的本地偵聽IP。本文使用的地址為:169.254.20.10。
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
cgroupDriver: systemd
clusterDNS: [“169.254.20.10”,“169.169.0.100”]
clusterDomain: cluster.local
failSwapOn: false
allow-privileged: true
tlsCipherSuites: [“TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256”,“TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”,“TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305”,“TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384”,“TLS_ECDHE_R
SA_WITH_CHACHA20_POLY1305”,“TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384”,“TLS_RSA_WITH_AES_256_GCM_SHA384”,“TLS_RSA_WITH_AES_128_GCM_SHA256”]authentication:
anonymous:
enabled: false
x509:
clientCAFile: /etc/kubernetes/ssl/ca.crt
2)部署NodeLocal DNS的yaml如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: node-local-dns
namespace: kube-system
labels:
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile
—
apiVersion: v1
kind: Service
metadata:
name: kube-dns-upstream
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/name: “KubeDNSUpstream”
spec:
ports:– name: dns
port: 53
protocol: UDP
targetPort: 53
- name: dns-tcp
port: 53
protocol: TCP
targetPort: 53
selector:
k8s-app: kube-dns
–
apiVersion: v1
kind: ConfigMap
metadata:
name: node-local-dns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: Reconcile
data:
Corefile: |
cluster.local:53 {
errors
cache {
success 9984 30
denial 9984 5
}
reload
loop
bind 169.254.20.10 #NodeLocal DNS的本地偵聽IP。
forward . 169.169.0.100 { #轉(zhuǎn)發(fā)到coredns地址
force_tcp #轉(zhuǎn)發(fā)協(xié)議
}
prometheus :9253
health 169.254.20.10:8080
}
in-addr.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10
forward . 169.169.0.100 {
force_tcp
}
prometheus :9253
}
ip6.arpa:53 {
errors
cache 30
reload
loop
bind 169.254.20.10
forward . PILLAR__CLUSTER__DNS {
force_tcp
}
prometheus :9253
}
.:53 {
errors
cache 30
reload
loop
bind 169.254.20.10
forward . 169.169.0.100
prometheus :9253
}
–
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-local-dns
namespace: kube-system
labels:
k8s-app: node-local-dns
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile
spec:
updateStrategy:
rollingUpdate:
maxUnavailable: 10%
selector:
matchLabels:
k8s-app: node-local-dns
template:
metadata:
labels:
k8s-app: node-local-dns
annotations:
prometheus.io/port: “9253”
prometheus.io/scrape: “true”
spec:
priorityClassName: system-node-critical
serviceAccountName: node-local-dns
hostNetwork: true
dnsPolicy: Default # Don’t use cluster DNS.
tolerations:
- key: “CriticalAddonsOnly”
operator: “Exists”
- effect: “NoExecute”
operator: “Exists”
- effect: “NoSchedule”
operator: “Exists”
containers:
- name: node-cache
image: 127.0.0.1:1120/panji_microservice/k8s-dns-node-cache:1.22.9
resources:
limits: #根據(jù)自己環(huán)境設置合適的資源限制
cpu: 50m
memory: 50Mi
requests:
cpu: 25m
memory: 5Mi
args: [ “-localip”, “169.254.20.10”, “-conf”, “/etc/Corefile”, “-upstreamsvc”, “kube-dns-upstream” ]
securityContext:
capabilities:
add:
- NET_ADMIN
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns-tcp
protocol: TCP
- containerPort: 9253
name: metrics
protocol: TCP
livenessProbe:
httpGet:
host: 169.254.20.10
path: /health
port: 8080
initialDelaySeconds: 60
timeoutSeconds: 5
volumeMounts:
- mountPath: /run/xtables.lock
name: xtables-lock
readOnly: false
- name: config-volume
mountPath: /etc/coredns
- name: kube-dns-config
mountPath: /etc/kube-dns
volumes:
- name: xtables-lock
hostPath:
path: /run/xtables.lock
type: FileOrCreate
- name: kube-dns-config
configMap:
name: kube-dns
optional: true
- name: config-volume
configMap:
name: node-local-dns
items:
- key: Corefile
path: Corefile.base
–
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/port: “9253”
prometheus.io/scrape: “true”
labels:
k8s-app: node-local-dns
name: node-local-dns
namespace: kube-system
spec:
clusterIP: None
ports:
- name: metrics
port: 9253
targetPort: 9253
selector:
k8s-app: node-local-dns
**注:**1、以上配置文件中 169.169.0.100 為k8s集群中得coredns的svc地址。
169.254.20.10為本地NodeLocal dns 監(jiān)聽服務地址。
2、NodeLocal dns會使用主機網(wǎng)絡監(jiān)聽8080端口到宿主機,防止和業(yè)務服務端口沖突。
3)NodeLocal DNS在kube-proxy不同模式下的配置
一、kube-proxy 運行在 IPTABLES 模式:
可以在kubelet的kubelet.config配置文件中添加NodeLocal dns的本地地址即可。
二、 kube-proxy 運行在 IPVS 模式:
node-local-dns Pod 會設置 PILLAR__UPSTREAM__SERVERS。
在此模式下,node-local-dns Pod 只會偵聽 的地址。 node-local-dns 接口不能綁定 kube-dns 的集群 IP 地址,因為 IPVS 負載均衡使用的接口已經(jīng)占用了該地址。
如果 kube-proxy 運行在 IPVS 模式,需要修改 kubelet 的 --cluster-dns 參數(shù)
NodeLocal DNSCache 正在偵聽的 地址。
五、部署結果
部署node-local-dns服務。
服務訪問域名解析結果如下,可以看到已經(jīng)解析到本地dns:
六、壓力測試
使用queryperf對NodeLocal dns 和DNS分別進行壓測。
測試結果如下圖,僅供參考:
qps | 1000 | 2000 | 10000 | 50000 | 100000 |
---|---|---|---|---|---|
localdns | 0.0379s | 0.0030s | 0.0227s | 0.0001s | 0.0021s |
coredns | 0.0104s | 0.0046s | 0.0026s | 0.0177s | 0.0061s |
以看到,在解析壓力較大時,Node localDNS的 解析性能優(yōu)于coreDNS。
使用Node localDNS壓測結果截圖如下:
1000qps壓測截圖:
2000qps壓測截圖:
10000qps壓測截圖:
50000qps壓測截圖:
100000qps壓測截圖:
對coredns解析壓測結果截圖如下:文章來源:http://www.zghlxwxcb.cn/news/detail-793999.html
1000qps壓測截圖:
2000qps壓測截圖如下:
10000qps壓測截圖:
50000qps壓測截圖:
100000qps壓測截圖:文章來源地址http://www.zghlxwxcb.cn/news/detail-793999.html
到了這里,關于k8s集群配置NodeLocal DNSCache的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!