同区域AWS VPC对等连接已创建但跨VPC HTTP访问失败求助
我之前碰到过几乎一模一样的场景,结合AWS VPC对等和K8s容器网络的常见坑,给你整理几个核心排查方向,你可以一步步验证:
既然VPC对等连接已经处于活跃状态,子网路由表也调整完毕,那问题大概率出在容器网络的特殊规则或者安全组/NACL的细节遗漏上,毕竟K8s Pod的网络和EC2实例的网络逻辑有差异。
1. 先确认Pod的流量是否真的走了VPC对等路由
K8s的CNI插件(比如Calico、Flannel)会维护自己的路由规则,不一定完全继承EC2实例的路由表。你可以登录VPC-B/C的任意Worker节点,执行以下命令验证:
# 先获取某个问题Pod的IP kubectl get pod <你的Pod名称> -o wide # 检查该Pod IP的路由走向 ip route get <Pod-IP>
如果发现Pod的流量没有指向VPC-A的CIDR段,那需要调整CNI的路由配置,确保容器网络的流量能正确转发到VPC对等连接。
2. 检查安全组规则的「Pod CIDR」遗漏问题
这是最容易踩的坑:
- VPC-A的目标资源安全组:必须允许VPC-B和VPC-C的Pod CIDR段(不是Worker节点的子网CIDR)发起的HTTP(80/443)请求。很多人会只加Worker节点的子网,忽略Pod的专属网段,导致Pod流量被直接拦截。
- VPC-B/C的Worker节点安全组:要允许Pod的流量出站到VPC-A的CIDR,同时要放行容器网络和主机网络的互通流量(比如Calico需要的IPIP/VXLAN协议端口)。
- NACL规则:虽然是无状态规则,但要确保入站、出站都允许VPC-A、Pod CIDR、Worker子网CIDR之间的HTTP流量,尤其不要漏掉返回的ACK包(要包含临时端口范围,比如1024-65535)。
3. 排查K8s NetworkPolicy的限制
如果你的集群启用了NetworkPolicy,可能不小心配置了限制Pod出站到外部VPC的规则。可以执行命令查看所有命名空间的网络策略:
kubectl get networkpolicy --all-namespaces
如果存在限制Pod访问VPC-A的策略,需要修改规则,明确允许目标VPC-A的CIDR段。
4. 用EC2实例做连通性对照测试
先跳过Pod,直接用VPC-B/C的Worker节点EC2实例向VPC-A的目标发起HTTP请求:
curl http://<VPC-A目标IP>
如果实例能正常访问,那问题肯定出在Pod的网络层面(CNI配置、NetworkPolicy、Pod安全组);如果实例也访问失败,那回到VPC对等的基础配置检查:比如确认路由表是否关联了正确的子网,跨账号VPC对等的权限(如果是不同账号)是否配置到位。
5. 验证Pod的DNS解析(如果用域名访问)
如果是通过域名访问VPC-A的服务,还要确认Pod的DNS是否能正确解析到目标IP:
kubectl exec -it <你的Pod名称> -- nslookup <VPC-A服务域名>
如果解析失败,需要检查CoreDNS配置,或者添加自定义DNS记录,确保Pod能正确解析跨VPC的域名。
内容的提问来源于stack exchange,提问作者sap

