You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中如何零停机重启CoreDNS Pod并刷新DNS缓存

CoreDNS缓存刷新与无停机重启方案

无需重启即可刷新外部DNS解析记录的方法

不需要重启CoreDNS Pod就能清空本地缓存,让新请求直接拉取上游最新解析结果:

  • CoreDNS的cache插件内置了缓存清空API,向CoreDNS的HTTP服务端口(默认与metrics端口共用,为9153)发送POST /cache请求即可立即清空当前实例的所有缓存条目。
  • 可以通过临时curl Pod调用集群内Service的方式执行清理,命令如下:
kubectl run -it --rm curl --image=curlimages/curl --restart=Never -n kube-system -- curl -XPOST http://kube-dns:9153/cache
  • 如果kube-dns Service未暴露9153端口,可以先对单个CoreDNS Pod做端口转发,再执行清理:
# 先替换pod名为你实际的CoreDNS Pod名,端口转发会占用当前终端
kubectl port-forward -n kube-system pod/coredns-<替换为实际pod后缀> 9153:9153
# 新开一个终端执行清理
curl -XPOST http://localhost:9153/cache
  • 注意缓存是每个CoreDNS Pod本地存储的,如果集群运行了多个CoreDNS副本,需要对每个Pod各执行一次清理操作,才能清空所有实例的旧缓存。

必须重启时的无停机操作方法

直接执行kubectl delete pods -n kube-system -l k8s-app=kube-dns会批量删除所有CoreDNS实例,在新Pod启动就绪前会出现服务空窗,按照以下步骤操作可以实现完全无停机重启:

  • 先确认CoreDNS Deployment的滚动更新策略配置正确
    执行kubectl edit deployment coredns -n kube-system,检查并修改spec段下的策略配置,保证滚动更新时先启动新Pod、等新Pod完全就绪后再停止旧Pod:
    spec:
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
    
    同时确认就绪探针(readinessProbe)配置正确,只有CoreDNS可以正常处理DNS请求时才会将Pod加入Service后端,默认配置参考:
    spec:
      template:
        spec:
          containers:
          - name: coredns
            readinessProbe:
              httpGet:
                path: /ready
                port: 8181
                scheme: HTTP
              initialDelaySeconds: 10
              periodSeconds: 2
              failureThreshold: 3
              successThreshold: 1
    
    如果当前CoreDNS副本数为1,先执行kubectl scale deployment coredns -n kube-system --replicas=2把副本数临时调到2,单副本场景下无论怎么配置都无法避免新Pod启动的空窗期。
  • 执行滚动重启命令,不要直接批量删Pod
    kubectl rollout restart deployment coredns -n kube-system
    
    该命令会按照配置的滚动策略逐个重建Pod,全程保证Service后端有可用的CoreDNS实例处理请求。
  • 等待重启完成,验证状态
    执行以下命令查看重启进度,等待提示成功即可:
    kubectl rollout status deployment coredns -n kube-system
    
    可以在重启过程中开一个临时Pod持续发起DNS请求,验证全程无解析失败:
    kubectl run -it --rm dns-test --image=busybox:1.28 --restart=Never -- sh -c 'while true; do nslookup kubernetes.default.svc.cluster.local; sleep 1; done'
    
    如果之前临时把副本数调到了2,重启完成后可以按需调回原来的副本数。

内容的提问来源于stack exchange,提问作者anonymous user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:45:29