首页 > 解决方案 > 如何将 AWS 流量从容器 A 镜像到容器 B

问题描述

我有一个 AWS 流量镜像会话,它从容器 A 的 ENI(弹性网络接口)收集流量并将其发送到容器 B 的 ENI。

在A内部,/sys/class/net/eth0/iflink输出'8',主机上的/sys/class/net/eni123/ifindex也输出'8',所以容器A的eth0是主机上的eni123。

我可以使用 tcpdump -i eni123 从主机捕获指向 A 的镜像 HTTP 流量。但是来自 B 的 eth0 上的 tcpdump 没有捕获任何数据包。它确实捕获了我手动从 A 发送到 B 的 ping。

我用securityContext: privileged: true.

容器 eth 接口是否限制捕获镜像数据包?我应该使用常规 ENI 以外的东西作为镜像目标吗?

标签: amazon-web-servicesdockeramazon-ec2vpc

解决方案


附加到 EC2 实例的 ENIS 位于根命名空间中。每当创建新 pod 时,都会使用暂停容器为该 pod 创建一个新命名空间,并且该 pod 中的所有容器都是该命名空间的一部分。

因此,在使用 VPC 流量镜像时,来自一个 ENI 的流量将被镜像到连接到 EC2 实例的另一个 ENI,但镜像目标 ENI 不会将这些网络推送到位于不同命名空间中的 POD 的虚拟接口。

作为一种解决方法,在 EKS 的情况下,我为容器部署了一个带有 hostNetwork: true 参数的 pod,该 pod 能够访问主机的所有接口,并且 tcpdump 还显示了所有 pod 流量。

请尝试这种方法并检查这种方法是否适合您的用例。

示例 Pod manifest yaml 供参考

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  hostNetwork: true
  containers:
    - name: nginx
      image: nginx

推荐阅读