实验:在一个demoset pod中,是否能使用tc拦截同node上其它pod的流量

原创 吴就业 123 0 2024-06-27

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/fa92840166e74733bdddff1ce4c5ce3d

作者:吴就业
链接:https://wujiuye.com/article/fa92840166e74733bdddff1ce4c5ce3d
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

关于tc的介绍可看上篇:看图理解linux内核网络流量控制工具tc(Traffic Control)

该实验是我们为了验证能否使用tc来实现某个功能的。

在k8s集群中,验证在一个demoset的pod中,是否能使用tc来拦截部署在同node上的其它pod的流量?

写一个demeset部署我们用来执行tc命令的pod

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ubuntu-daemonset
spec:
  selector:
    matchLabels:
      app: ubuntu-daemonset
  template:
    metadata:
      labels:
        app: ubuntu-daemonset
    spec:
    	hostNetwork: true
      containers:
      - name: ubuntu
        image: public.ecr.aws/ubuntu/ubuntu:24.10
        command: ["sleep", "infinity"]
        securityContext:
          privileged: true  # 添加这行来启用特权模式

需要注意的地方:

如果集群有多个Node会部署多个Pod,选择其中一个Pod进入shell,然后添加qdsic和filter+action。

如果容器没有tc命令,则需要安装:

apt-get update
apt-get install -y iproute2

我们还需要知道node的网络设备接口,如果ifconfig命令找不到则需要安装:

apt-get update
apt-get install -y net-tools

添加qdsic和filter+action。

tc qdisc add dev eth0 root handle 1: htb
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip src 10.156.6.100/32 match ip dst 10.194.0.2/32 action drop

如果执行tc qdisc add失败:Error: NLM_F_REPLACE needed to override.,意思是尝试添加的队列规则(qdisc)已经存在,但可以覆盖替换。

可以查看已经存在的qdisc是不是htb的,如果是可以直接用。

root@/# tc qdisc show dev eth0 
qdisc mq 8004: root

如果不是则需要替换:

tc qdisc replace dev eth0 root handle 1: htb

结论是,这个方法可行。

顺便分享一下我们的调研结论:其实我们是想通过这个方式去拦截nfs文件读写,阻止某个pod去读写某个nfs文件系统。但由于pv是由csi驱动的node组件这个pod挂载的,只有这个pod安装了nfs的client,能够与nfs文件系统交互,然后node组件是将这个目录挂载到应用pod的挂载点而已,实际我们在应用pod往磁盘写数据,最终网络上是通过csi这个node组件的nfs client去写到nfs文件系统的。所以我们无法拦截应用Pod,只能拦截csi node组件的pod。

为了验证这个结论,我把csi驱动(我们自己实现的csi驱动)卸载后,所有挂盘的Pod写操作都卡住了。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

cloudrun和gke中服务互相调用如何走内网

gke和cloudrun混合部署的情况下,gke中的服务如何走内网调用cloudrun服务,以及cloudrun服务如何走内网调用gke中的服务是需要解决的问题。

通过实验理解csi卷创建、挂载、卸载、删除的全流程

基于自定义的csi驱动,通过实验串联理解真个csi的工作流程。

如何编写一个CSI驱动项目,k8s csi驱动开发

CSI驱动必不可少的几个组件:csi-provisioner、controller组件、csi-node-driver-registrar、node组件,controller组件和node组件就是需要我们开发的,其实就是实现几个gRPC接口。

Kubernetes CSI插件中持久卷的挂载和映射机制

持久卷是什么时候创建的,是什么时候挂载的,是怎么创建怎么挂载的?

gcp平台google api的授权,与autoscaler部署配置授权

我们在自己部署autoscaler到gke集群中的时候遇到了403的问题,这个问题后来我们自己部署gcp-filestore-csi-driver的时候也遇到了。

在gcp平台上创建一个gke集群,怎么获取gke集群的证书

在gcp平台上,使用gke服务,创建一个k8s集群,若想在本地能够通过kubectl命令或者可视化工具访问到集群,需要通过gcloud命令获取访问集群的证书。