如何解决K8S中更新Pod的DNSConfig与DNSPolicy配置报错问题?
问题原因
K8s kube-apiserver对运行中Pod的Spec字段更新有全局校验规则,并非仅依赖单个字段的immutable声明。目前官方仅允许修改以下Pod Spec字段:
spec.containers[*].image、spec.initContainers[*].imagespec.activeDeadlineSecondsspec.tolerations(仅允许新增已有容忍度之外的配置,不允许修改/删除原有容忍度)
你需要调整的DNSConfig和DNSPolicy不在允许更新的范围内,因此不管是通过Operator客户端调用、还是kubectl edit/apply操作都会触发校验失败。
解决方案
- 方案1:Mutating Admission Webhook注入
部署变异准入Webhook服务,在Pod创建请求持久化到etcd之前,自动给匹配规则的Pod注入你定义的DNSConfig和DNSPolicy配置,完全规避运行时修改Pod的问题,是批量注入DNS配置的最优方案。 - 方案2:修改工作负载模板滚动重建
如果Pod由Deployment、StatefulSet、DaemonSet等上层工作负载管理,直接修改工作负载的spec.template.spec下的DNS配置,控制器会自动滚动重建所有关联Pod,新启动的Pod会自动加载预期的DNS配置,是生产环境兼容性最高的方案。 - 方案3:裸Pod重建
如果是没有上层工作负载管理的独立Pod,先删除现有Pod,再使用补充了DNS配置的yaml文件重新创建即可。 - 应急临时方案(不推荐)
如果需要临时修改运行中Pod的DNS配置且不允许重建,可以直接登录Pod所在节点,修改Pod对应的/var/lib/kubelet/pods/<PodUID>/etc/resolv.conf文件,配置会立即生效,但Pod重建后配置会丢失,不符合K8s声明式API规范,仅可用于临时应急场景。
内容的提问来源于stack exchange,提问作者moluzhui
相关产品推荐
相关产品推荐

