启用Azure CNI的AKS集群中DNS未移除未就绪Pod问题咨询
AKS 未就绪Pod流量控制及CNI差异问题解答
核心机制说明
首先明确:AKS 控制未就绪Pod不接收外部请求的逻辑分为两层,并非仅配置Service时才生效:
- Service转发层:只要Pod关联了Service,kube-proxy会自动同步EndpointSlice中的Pod就绪状态,过滤所有未就绪Pod的后端地址,所以不管用哪种CNI,走Service IP/域名访问时流量都不会打到未就绪Pod,和你观测到的现象一致。
- Pod DNS解析层:你观测到的两类集群差异,本质是不同CNI下CoreDNS的默认配置差异,和AKS基础逻辑无关。
两类CNI解析表现差异的原因
- 未启用Azure CNI的集群默认使用kubenet网络插件,CoreDNS的Kubernetes解析插件默认开启了就绪状态过滤,仅会为
Ready状态的Pod生成<pod-name>.<service-name>.<namespace>.svc.cluster.local格式的解析记录,所以未就绪Pod的域名会解析失败。 - 启用Azure CNI的集群中,Pod被分配了VNet层面的可路由IP,CoreDNS默认未开启Pod就绪状态过滤,所有已创建的Pod(无论是否就绪)都会生成对应的解析记录,所以你可以正常解析到未就绪Pod的IP,直接访问Pod时请求可以到达。
对齐两类集群表现的配置方法
有两种常用方案可以实现你要的效果:
- 修改CoreDNS配置,过滤未就绪Pod的解析记录
编辑kube-system命名空间下的corednsConfigMap,找到Corefile配置段中kubernetes插件的配置行,在末尾添加ignore not_ready参数:
保存配置后重启CoreDNS Pod,之后未就绪Pod的域名就会无法解析,和kubenet集群表现一致。kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 ignore not_ready # 新增这一行 } - 配置网络策略拒绝未就绪Pod的入站流量
如果你不想修改DNS配置,可以为对应工作负载配置网络策略,仅允许kubelet的健康检查流量访问未就绪Pod,其他端口的入站流量全部拒绝,此时就算能解析到Pod IP,请求也会被直接拒绝。
注意:Kubernetes官方推荐的服务访问方式是通过Service转发,默认就会自动过滤未就绪Pod,无需额外修改全局配置,上述修改仅适用于必须直接访问Pod域名的特殊场景。
内容的提问来源于stack exchange,提问作者Pavel Sapozhnikov
相关产品推荐
相关产品推荐

