Kubernetes kuberntes init容器中的iptables不';行不通

Kubernetes kuberntes init容器中的iptables不';行不通,kubernetes,reverse-proxy,iptables,istio,Kubernetes,Reverse Proxy,Iptables,Istio,背景: 我正在尝试使用goreplay将流量镜像到其他目的地。 我发现k8s服务是第4层的负载平衡,这导致goreplay无法捕获流量,因此我决定像istio一样在pod中添加一个反向代理侧车 这是我的pod yaml: apiVersion:v1 种类:豆荚 元数据: 姓名:nginx 名称空间:默认值 标签: app:nginx 规格: 容器: -图片:nginx imagePullPolicy:如果不存在 姓名:nginx 端口: -集装箱港口:80 名称:http 协议:TCP 资源:{

背景:

我正在尝试使用goreplay将流量镜像到其他目的地。 我发现k8s服务是第4层的负载平衡,这导致goreplay无法捕获流量,因此我决定像istio一样在pod中添加一个反向代理侧车

这是我的pod yaml:

apiVersion:v1 种类:豆荚 元数据: 姓名:nginx 名称空间:默认值 标签: app:nginx 规格: 容器: -图片:nginx imagePullPolicy:如果不存在 姓名:nginx 端口: -集装箱港口:80 名称:http 协议:TCP 资源:{} terminationMessagePath:/dev/终止日志 terminationMessagePolicy:文件 -图片:nginx imagePullPolicy:如果不存在 姓名:代理 资源: 限制: 中央处理器:“2” 内存:1Gi 请求: 中央处理器:10米 内存:40Mi terminationMessagePath:/dev/终止日志 terminationMessagePolicy:文件 体积数量: -挂载路径:/etc/nginx/conf.d 名称:默认值 初始化容器: -命令: -iptables args: --t -纳特 --A -预路由 --p -tcp ---dport - "80" --j -重定向 ---到港口 - "15001" 图片:soarinferret/iptablesproxy imagePullPolicy:如果不存在 名称:istio init 资源: 限制: 中央处理器:100米 内存:50Mi 请求: 中央处理器:10米 内存:10Mi securityContext: allowPrivilegeEscalation:false 能力: 加: -网络管理员 -净生 删除: -全部 特权:假 readOnlyRootFilesystem:false runAsGroup:0 runAsNonRoot:false runAsUser:0 terminationMessagePath:/dev/终止日志 terminationMessagePolicy:文件 DNS政策:集群优先 终止时间:30秒 卷数: -配置映射: 默认模式:256 名称:默认值 可选:false 名称:默认值 --- 版本:v1 种类:服务 元数据: 姓名:nginx 名称空间:默认值 规格: 端口: -港口:80 协议:TCP 目标港:80 选择器: app:nginx 会话相关性:无 类型:集群 地位: 负载平衡器:{} --- 版本:v1 数据: default.conf:| 服务器{ 听15001; 服务器名称localhost; access_log/var/log/nginx/host.access.log main; 地点/{ root/usr/share/nginx/html; index.html index.htm; } 错误\u第500页502 503 504/50x.html; location=/50x.html{ root/usr/share/nginx/html; } } 种类:配置地图 元数据: 名称:默认值 名称空间:默认值 我使用
kubectl端口转发服务/nginx 8080:80
然后使用
curlhttp://localhost:8080
,流量直接发送到nginx,而不是我的代理

我想要的是:

  • 一种让goreplay捕获负载由k8s服务平衡的流量的方法
  • 更正iptables规则,让流量成功路由到我的代理侧车

  • 谢谢你的帮助

    正如@Jonyhy96在评论中提到的,这里唯一需要改变的事情是将特权值改为true

    特权-确定pod中的任何容器是否可以启用特权模式。默认情况下,不允许容器访问主机上的任何设备,但允许“特权”容器访问主机上的所有设备。这允许容器几乎与主机上运行的进程具有相同的访问权限。这对于希望使用linux功能(如操作网络堆栈和访问设备)的容器非常有用


    所以initContainer看起来像这样

    initContainers:
        - command: 
          - iptables
          args:
          - -t 
          - nat
          - -A
          - PREROUTING
          - -p
          - tcp
          - --dport
          - "80"
          - -j
          - REDIRECT
          - --to-ports
          - "15001"
          image: soarinferret/iptablesproxy
          imagePullPolicy: IfNotPresent
          name: istio-init
          resources:
            limits:
              cpu: 100m
              memory: 50Mi
            requests:
              cpu: 10m
              memory: 10Mi
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              add:
              - NET_ADMIN
              - NET_RAW
              drop:
              - ALL
            privileged: true   <---- changed from false
            readOnlyRootFilesystem: false
            runAsGroup: 0
            runAsNonRoot: false
            runAsUser: 0
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File 
    
    initContainers:
    -命令:
    -iptables
    args:
    --t
    -纳特
    --A
    -预路由
    --p
    -tcp
    ---dport
    - "80"
    --j
    -重定向
    ---到港口
    - "15001"
    图片:soarinferret/iptablesproxy
    imagePullPolicy:如果不存在
    名称:istio init
    资源:
    限制:
    中央处理器:100米
    内存:50Mi
    请求:
    中央处理器:10米
    内存:10Mi
    securityContext:
    allowPrivilegeEscalation:false
    能力:
    加:
    -网络管理员
    -净生
    删除:
    -全部
    
    特权:为true,只需在服务定义中发送流量15001端口。您是否可以尝试使用
    iptables-t nat-A PREROUTING-p tcp-i eth0--dport 80-j REDIRECT--to port 15001
    ?此外,我建议您对此进行检查,不完全是在nginx上,而是解释如何实际构建代理。如果您从istio复制init容器部分:
    15001
    用于出站流量,
    15006
    用于入站流量。“入站部分丢失。@Jakub非常感谢您的回复,在我阅读了您提供的教程后,我发现port forward与正常的k8s服务调用不同。在我将initConatiner的securityContext字段中的privileged值更改为true后,一切都很好。@Jonyhy96当然,很高兴它能为您工作!”!我已经添加了一个更直观的答案。如果它有助于考虑投票/接受答案。