Istio二之流量劫持过程

2023-11-16

前面介绍了Istio依赖的Envoy的工作原理,接下来通过实际例子演示Istio是如何完成流量劫持以及流量转发的。首先准备部署两个pod,一个nginx pod作为服务端,一个toolbox pod作为客户端,toolbox只是一个能支持linux命令的容器而已。下面是两个pod的部署文件。通过下面的文件启动nginx和toolbox pod。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx
apiVersion: apps/v1
kind: Deployment
metadata:
  name: toolbox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: toolbox
  template:
    metadata:
      labels:
        app: toolbox
        access: "true"
    spec:
      containers:
        - name: toolbox
          image: centos
          command:
            - tail
            - -f
            - /dev/null

接着是在集群上安装Istio。安装成功后可以看到有3个istio相关的pod成功启动

curl -L https://istio.io/downloadIstio | sh -
cd istio-1.xx.0
cp bin/istioctl /usr/local/bin
istioctl install --set profile=demo -y

 接着启动前面定义的nginx和toolbox pod,如果对namespace添加istio-injection=enabled的标签,那么该namespace下的pod istio都会自动注入。

kubectl create ns sidecar
kubectl label ns sidecar istio-injection=enabled
kubectl apply -f nginx.yaml -n sidecar
kubectl apply -f toolbox-default.yaml -n sidecar

查看启动的pod,可以看到两个pod的container数量不再是1,而是2.

挑选一种一个pod例如toolboxpod,查看pod的details,可以看到除了toolbox自身定义的container外,还启动了istio-proxy的container,这个container本质就是启动了一个envoy的proxy。

除了这个container外,还有个initcontainer,对Iptables做了一些配置修改。

接下来可以继续看看,pod中的iptables配置具体长什么样子。左边是通过命令查看到了iptables规则,右边是解释每条规则的含义。

crictl pods|grep podName 
//get containerId of pod
crictl inspectp containerId | grep pid 
//get pid 
nsenter -t pid -n iptables 
//get iptables configuration

通过查看iptables规则可以知道,对于模拟客户端的toolboxpod来说,如果要访问服务nginx,等于是想往外发送请求,那么根据iptables规则,会执行ISTIO_OUTPUT,而ISTIO_OUTPUT又会窒息ISTIO_REDIRECT, ISTIO_REDIRECT最终转发到15001端口上。

接着查看15001端口的配置信息。
(istioctl pc listener -n sidecar toolbox-68f79dd5f8-q5nvd --port 15001 -ojson)

可以看到15001是一个虚拟端口,不是真实的服务端口,另外,该配置中有个属性useOritinalDst=true表示转发到虚拟端口15001上的请求,原来的目的地址是什么,那么转发到15001上后,仍然发送请求到原来的目的地址上,原来的目的访问地址是想访问nginx服务的80端口。

 接着查看80端口的配置信息,查看80端口配置,就有真实的路由配置了,路由配置名称是routeConfigName=80.
(istioctl pc listener -n sidecar toolbox-68f79dd5f8-q5nvd --port 80 -ojson)

接着查看路由名称等于80的配置信息,该配置文件中有很多路由配置信息,其中关于nginx的,如果是访问nginx,那么交由cluster=nginx.sidecar.svc.cluster.local处理(需要注意一点,前面介绍envoy时提到过envoy中cluster的含义是一堆ip地址的集合)
(istioctl pc route -n sidecar toolbox-68f79dd5f8-q5nvd --name=80 -ojson)

接着查看cluster包含的IP地址信息就知道最终请求发送的目的地IP地址了。

istioctl pc cluster -n sidecar toolbox-68f79dd5f8-8gkp9
istioctl pc endpoint -n sidecar toolbox-68f79dd5f8-8gkp9

Cluster包含的目标地址正是nginx服务Pod的地址。故最终请求能发送到nginx上。当请求往外发时,最终还是会follow iptables的规则,再看iptables的规则,有一条outbound的规则是:如果owner=1337,那么就直接往外发,而envoy的进程号就是1337

上面详细介绍了发送请求出去的过程,对于服务端来说是接收请求,即Iptables中走的是Inbound的规则。 对于Inbound的请求,通过iptable会将请求发送到envoy的15006端口上,该端口发现需要访问的服务就是本机存在的服务,故把请求转发到本机的nginx pod处理。

对于上面的toolbox(模拟客户端),nginx(模拟服务端)的访问关系的示意图如下所示:

对于Istio sidecar流量劫持的示意图,这里还有一个详细示意图,采用的例子是Istio官网的bookInfo应用。

以上就是对Istio sidecar如何进行流量劫持的讲解,透彻理解流量劫持过程,有助于在真实项目中如果遇到流量未进入预期目的地址的情况,那么可以进行组层排查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Istio二之流量劫持过程 的相关文章

随机推荐

  • Android Switch控件修改样式

    Android中自带的Switch控件在很多时候总觉得和整体系统风格不符 很多时候 自定义Switch是一种方法 但其实不用这么麻烦 安卓自带的Switch通过修改一些属性 也可以达到和自定义Switch差不多的一个效果 个人感觉 Swit
  • 对java中char的取值范围思考

    主要说一下我遇到的一个问题 就是网上关于char字符的取值范围定义 有的说是0 255 有的说是 u0000 uffff 其实 这两种说法都对 我们都知道 java中给char字符的解释是十六位 双字节 也就是按照补码的方式寻求取值范围 就
  • 延时任务-基于redis zset的完整实现

    所谓的延时任务给大家举个例子 你买了一张火车票 必须在30分钟之内付款 否则该订单被自动取消 订单30分钟不付款自动取消 这个任务就是一个延时任务 我之前已经写过2篇关于延时任务的文章 完整实现 通过DelayQueue实现延时任务 延时任
  • Elasticsearch --- 向es中导入数据

    一 从文件导入 用django启动 def zi dr request f open c txt r encoding utf 8 action index c12 type doc source title i strip 去掉 空 fo
  • 关于ES集群规模规划

    在搭建正式的生产集群之前 充分做好硬件和服务器配置以及集群规划是重中之重 磨刀不误砍柴工 硬件配置推荐 内存 ES排序以及聚合都是高度需求内存的 单机 单节点 64GB是很理想的配置 32GB或16GB也很常见 不推荐低于8GB 性价比较低
  • Elastic-Job - 分布式定时任务框架

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Elastic Job是ddframe中dd job的作业模块中分离出来的分布式弹性作业框架 去掉了和dd job中的监控和ddframe接入规范部分 该项目基于成熟的开源
  • STM32移植FATFS时处理 warning: #188-D: enumerated type mixed with another type

    在STM32上移植FATFS时disk read 函数返回类型是DRESULT 而DRESULT是一个枚举类型 所以老是会提醒 warning 188 D enumerated type mixed with another type 主要
  • 前端歌谣的刷题之路-第二十一题-css单位二

    目录 前言 题目 核心代码 总结 前言 我是歌谣 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 本题目源自于牛客网 微信公众号前端小歌谣 题目 请将html模块div元素的宽度和高度设置为html根元素字体大小的4倍 注意 只需在css
  • 实现TextView垂直滚动以及监听

    由于新的项目中在广告轮播用到了垂直滚动显示 所以也当学习 自己定义了一个垂直滚动的view以及监听 用到TextSwitcher和ViewFactory TextSwitcher 字面理解是文字交换器 是ViewSwitcher的子类 从V
  • 【转】你在读博士期间明白的最深刻的道理是什么?

    写在前面 读博不是跟着老师学知识 都读到博士阶段了 知识的学习方法应该早已经熟练掌握 也早应该形成了一套成熟的 适合自己的知识学习方法 基础学科知识应该由自我驱动 自学来完成 那么读博期间的目标应该是培养什么 学会什么 读博的这4 6年一个
  • Express初学之入门

    1 Express简介 基于Node的极简MVC框架 提供灵活的路由功能 提供强大的中间件机制 内核极小 扩展性很好 使用广泛 2 路由机制 Express概念 定义了Api的地址 请求 响应方式 方法 天然支持HTTP Method 中的
  • grep 函数

    grep函数 如果你是个Perl的新手 你可以先跳过下面的两段 直接到 Grep vs loops 样例这一部分 放心 在后面你还会遇到它 grep BLOCK LIST grep EXPR LIST grep 函数会根据 LIST 中的元
  • zsh: command not found: flutter

    因为苹果笔记本重新安装了系统 需要重新安装flutter环境 这里记录一下flutter在安装过程中出现的问题 问题如下 zsh command not found flutter 解决步骤 1 打开open zshrc 2 如果没有就新建
  • Django + vue (一) Django部署

    一 Django 部署 采用REST方式 较简约 1 安装django pip install django 2 2 4 i https pypi tuna tsinghua edu cn simple 2 创建个目录pyvue 并在该目录
  • 求n!的4种方法

    1 循环法 include
  • Java Stream peek的一些坑

    众所周知在Java中使用Stream能够很好地帮我们流处理对象 而Stream中有一个peek方法 它与map最大的区别是它没有返回值 一开始我是简单地把它当做一个void类型的处理方法去使用的 但是后来却发现程序执行到此处时 不进peek
  • 【华为OD机试真题2023B卷 JAVA&JS】跳格子2

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 跳格子2 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 小明和朋友玩跳格子游戏 有 n 个连续格子组成的圆圈 每个格子有不同的分数 小朋友可以选择从任意格子起跳 但是
  • 在Padavan上搭建udp53踩坑总结

    弄了差不多一下午 翻阅了许多帖子都没有能用的解决办法 人又不在家全程远程解决 希望对有相同需求的朋友有帮助 坑一 对于dnsmasq占用53端口的问题 查阅dnsmasq配置手册之后发现 在 etc dnsmasq conf中port缺省的
  • 2019哈工大计算机考研初试复试经历

    一 初试 1 准备阶段 1 1阶段一 我的第一阶段大约是在4月到6月 这阶段一方面我学业课程还比较忙 另一方面当时还要准备竞赛 所以准备不是很充分 只准备了数学 在外面上了数学考研辅导课 大班 不贵 对数学做了第一轮的复习 做了第一波习题
  • Istio二之流量劫持过程

    前面介绍了Istio依赖的Envoy的工作原理 接下来通过实际例子演示Istio是如何完成流量劫持以及流量转发的 首先准备部署两个pod 一个nginx pod作为服务端 一个toolbox pod作为客户端 toolbox只是一个能支持l