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

AWS K8s Calico集群配置NetworkPolicy后DNS无法访问问题求解

排查步骤

  • 第一步:确认kube-system命名空间的标签配置
    你的第一种规则中匹配name: kube-system的命名空间标签,而K8s默认创建的kube-system命名空间携带的标准标签是kubernetes.io/metadata.name: kube-system,标签不匹配会导致规则完全不生效。你可以执行kubectl get ns kube-system --show-labels确认当前标签。
  • 第二步:确认DNS服务部署位置和标签
    确认coredns/kube-dns服务是否确实部署在kube-system命名空间,同时记下coredns pod的匹配标签(通常为k8s-app: kube-dns)。
  • 第三步:检查Calico版本兼容性
    K8s 1.20版本要求Calico最低版本为v3.16.0,低于该版本会存在标准NetworkPolicy规则解析异常的bug,你可以执行calicoctl version查看当前Calico版本。
  • 第四步:打开Calico流量日志排查拦截原因
    给对应网络策略添加Calico注解开启流量日志,确认DNS请求被拦截的具体原因。

可行配置示例

优先使用命名空间+Pod标签的精确匹配规则,避免过宽放行:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-egress
  namespace: my_namespace
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

如果上述配置仍不生效,可尝试临时使用无目标匹配的端口放行规则验证逻辑,部分旧版本Calico需要显式放行客户端随机端口的应答流量:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-egress
  namespace: my_namespace
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 1024-65535
    - protocol: UDP
      port: 1024-65535

额外注意事项

  • AWS EKS托管集群如果同时使用VPC CNI和Calico网络策略组件,需要确认Calico的策略引擎已正确开启,没有被VPC CNI的原生网络策略覆盖。
  • 部分集群会将DNS服务的服务端口修改为非53端口,可执行kubectl get svc -n kube-system kube-dns确认服务端口配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:18:01