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

issue

512 bytes size limit 可能源自於過去的約定成俗 (可以參考: https://serverfault.com/q/587625),公司內的 DNS Server 經過好幾層的解析,已經超過 512 bytes,在 DNS flag day 2020 中,建議 size limit 為 1232:

size

調查過程

以下是與 RedHat Support 調查所使用到的工具及命令,提供參考:

  1. 使用 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
  1. 檢查 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

目前暫時的解決方案如下:

  1. 解除託管

執行 oc edit clusterversion version,並將 dns-operator 設為 unmanaged:

spec:
  overrides:
  - group: apps
    kind: Deployment
    name: dns-operator
    namespace: openshift-dns-operator unmanaged: true
  1. 更改 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