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
相关产品推荐
相关产品推荐

