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:
同时确认就绪探针(readinessProbe)配置正确,只有CoreDNS可以正常处理DNS请求时才会将Pod加入Service后端,默认配置参考:spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0
如果当前CoreDNS副本数为1,先执行spec: template: spec: containers: - name: coredns readinessProbe: httpGet: path: /ready port: 8181 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 2 failureThreshold: 3 successThreshold: 1kubectl scale deployment coredns -n kube-system --replicas=2把副本数临时调到2,单副本场景下无论怎么配置都无法避免新Pod启动的空窗期。 - 执行滚动重启命令,不要直接批量删Pod
该命令会按照配置的滚动策略逐个重建Pod,全程保证Service后端有可用的CoreDNS实例处理请求。kubectl rollout restart deployment coredns -n kube-system - 等待重启完成,验证状态
执行以下命令查看重启进度,等待提示成功即可:
可以在重启过程中开一个临时Pod持续发起DNS请求,验证全程无解析失败:kubectl rollout status deployment coredns -n kube-system
如果之前临时把副本数调到了2,重启完成后可以按需调回原来的副本数。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'
内容的提问来源于stack exchange,提问作者anonymous user
相关产品推荐
相关产品推荐

