You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

配置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/v1beta1networking.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

火山引擎 最新活动