配置NetworkPolicy后HTTP/HTTPS端口出站请求超时问题排查
从你的描述来看,核心问题是:配置了允许80/443和DNS出站流量的NetworkPolicy后,DNS解析正常但HTTP/HTTPS连接超时,且在Cilium和Azure NPM环境中表现一致。结合Kubernetes 1.11.5的特性和CNI插件的行为,我梳理了两个关键原因及对应的解决办法:
1. NetworkPolicy API版本不兼容(针对你的最小复现示例)
Kubernetes 1.11.5中,networking.k8s.io/v1这个API版本不支持egress规则——egress在当时还是Beta特性,仅能通过extensions/v1beta1或networking.k8s.io/v1beta1来定义。如果你用networking.k8s.io/v1编写包含egress的策略,这部分规则会被Kubernetes忽略,导致除了默认允许的流量外,其他出站请求被阻断。
解决办法:
将NetworkPolicy的API版本切换为extensions/v1beta1(这是1.11版本中支持egress的稳定Beta版本)。
2. CNI插件对egress规则的默认行为限制
在Azure NPM、Cilium这类CNI插件中,当egress规则未显式指定to字段时,默认仅允许流量访问集群内部的IP地址(比如kube-dns的集群内IP),而不会放行到外部公网IP的流量。这就解释了为什么DNS解析正常(访问集群内的DNS服务),但访问外部80/443端口时超时。
解决办法:
在每个egress规则中添加to字段,显式指定允许访问所有IP(0.0.0.0/0)。同时可以移除冗余的UDP规则(HTTP/HTTPS仅使用TCP协议)。
修改后的配置示例:
apiVersion: extensions/v1beta1 kind: NetworkPolicy metadata: name: my-netpolicy spec: podSelector: matchLabels: my-label: my-app policyTypes: - Egress egress: # 允许DNS流量到所有IP - to: - ipBlock: cidr: 0.0.0.0/0 ports: - port: 53 protocol: UDP - port: 53 protocol: TCP # 允许HTTP/HTTPS流量到所有IP - to: - ipBlock: cidr: 0.0.0.0/0 ports: - port: 80 protocol: TCP - port: 443 protocol: TCP
或者你也可以把所有允许的端口合并到一个egress规则中:
apiVersion: extensions/v1beta1 kind: NetworkPolicy metadata: name: my-netpolicy spec: podSelector: matchLabels: my-label: my-app policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 ports: - port: 53 protocol: UDP - port: 53 protocol: TCP - port: 80 protocol: TCP - port: 443 protocol: TCP
验证步骤
应用修改后的NetworkPolicy后,重新进入pod测试:
kubectl apply -f updated-netpolicy.yaml kubectl exec -it netpolicy-poc-pod /bin/bash apt update && apt install wget -y wget https://google.com
这样应该就能正常建立HTTP/HTTPS连接了。
内容的提问来源于stack exchange,提问作者Tyler Camp




