CoreDNS UDP Bufsize Restricted to 512
CoreDNS 在 Openshift 上的 Bug
這篇文章將分析在 Openshift 環境中遇到的一個 CoreDNS 相關 Bug。我們將討論 Bug 的成因、影響範圍以及解決方案。
問題描述
公司的同事最近發現了一個詭異的問題,我們的 Openshift 4.12 常常發生服務中斷的現象,且時好時壞。
經過調查,我們發現是 DNS 問題,當封包大小超過 512 bytes 時,預設的 CoreDNS 會回傳 SERVFAIL
,而這個問題也被收錄於 RedHat 的 Known issues: https://bugzilla.redhat.com/show_bug.cgi?id=1949361
而 512 bytes size limit
可能源自於過去的約定成俗 (可以參考: https://serverfault.com/q/587625),公司內的 DNS Server 經過好幾層的解析,已經超過 512 bytes,在 DNS flag day 2020 中,建議 size limit 為 1232:
調查過程
以下是與 RedHat Support 調查所使用到的工具及命令,提供參考:
- 使用 RedHat 提供的測試工具
testdig
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
name: ubi8
spec:
replicas: 1
selector:
matchLabels:
app: ubi8
template:
metadata:
labels:
app: ubi8
spec:
containers:
- command:
- /bin/bash
- -c
- sleep 360000000
image: quay.io/rhn_support_cchen/testdig:v1.0
imagePullPolicy: IfNotPresent
name: ubi8
serviceAccount: testsa
serviceAccountName: testsa
dnsConfig: # add this config if you needs
options:
- name: edns0
- 檢查
dnssec
date; dig +nodnssec console.redhat.com
date; dig +dnssec console.redhat.com
解決方法
由於 CoreDNS 是由 Openshift 託管,無法直接修改,與 RedHat Support 討論過後,得知此 Bug 將會於 4.14
版本修復:https://issues.redhat.com/browse/OCPBUGS-15605
目前暫時的解決方案如下:
- 解除託管
執行 oc edit clusterversion version
,並將 dns-operator
設為 unmanaged
:
spec:
overrides:
- group: apps
kind: Deployment
name: dns-operator
namespace: openshift-dns-operator unmanaged: true
- 更改 Corefile
執行 oc -n openshift-dns edit cm/dns-default
:
apiVersion: v1
data:
Corefile: |
.:5353 {
bufsize 512 # <======== change to 1232
errors
log . {
class denial error
}
health {
lameduck 20s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
prometheus 127.0.0.1:9153
forward . /etc/resolv.conf {
policy sequential
}
cache 900 {
denial 9984 30
}
reload
}
hostname.bind:5353 {
chaos
}
kind: ConfigMap