Kubernetes kuberntes init容器中的iptables不';行不通
背景: 我正在尝试使用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; } } 种类:配置地图 元数据: 名称:默认值 名称空间:默认值 我使用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 资源:{
kubectl端口转发服务/nginx 8080:80
然后使用curlhttp://localhost:8080
,流量直接发送到nginx,而不是我的代理
我想要的是:
谢谢你的帮助 正如@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当然,很高兴它能为您工作!”!我已经添加了一个更直观的答案。如果它有助于考虑投票/接受答案。