kubernetes的Kube-proxy的iptables转发规则

2023-05-16

概念

kube-proxy 实际上并不起一个 proxy 的作用,而是 watch 变更并更新 iptables,也就是说,client 的请求直接通过 iptables 路由。

如果kube-proxy通过iptables 转发。会修改filter和nat表

filter表

filter表通过OUTPUT链规定所有的出报文都要经过KUBE-SERVICES,如果一个Service没有对应的endpoint,则拒绝将报文发出。
在这里插入图片描述
例如,创建一个service,下图的frontend,没有对应的endPoint
在这里插入图片描述

查看filter:iptables -L -n -t filter
在这里插入图片描述
filter表中会将访问172.18.13.31的请求拒绝。

nat表

nat表中设置的规则比较多,查看nat表命令:iptables -L -n -t nat

1、在PREROUTING阶段,将所有报文转发到KUBE-SERVICES

2、在OUTPUT阶段,将所有报文转发到KUBE-SERVICES

3、在POSTROUTING阶段,将所有报文转发到KUBE-POSTROUTING

nat表中主要增加了如下几个链-规则

1)KUBE-SERVICES

在这里插入图片描述
每个Service的每个服务端口都会在Chain KUBE-SERVICES中有一条对应的规则,发送到clusterIP的报文,将会转发到对应的Service的规则链,没有命中ClusterIP的,转发到KUBE-NODEPORTS。

只有发送到被kubernetes占用的端口的报文才会进入KUBE-MARK-MASQ打上标记,并转发到对应的服务规则链。例如第一条划线的KUBE-MARK-MASQ这里分配给SERVICE的端口是3306,该端口的包由kuberentes管理.

2)KUBE-SVC-YG65S75AKNCDZRSF (2 references)

在这里插入图片描述
而每一个SERVICE,又将报文提交到了各自的KUBE-SEP-XXX。

3)KUBE-SEP-VFIT54JSXZ4WRSH5 (1 references)在这里插入图片描述

最后在KUBE-SEP-XX中完整了最终的DNAT,将目的地址转换成了POD的IP和端口。
这里的KUBE-MARK-MASQ为报文打上了标记,表示这个报文是由kubernetes管理的,Kuberntes将会对它进行NAT转换。

4)KUBE-NODEPORTS (1 references)

在这里插入图片描述
KUBE-NODEPORT中,根据目的端口,将报文转发到对应的Service的规则链,然后就如同在“Chain KUBE-SERVICES”中的过程,将报文转发到了对应的POD。

5)KUBE-POSTROUTING (1 references)

在这里插入图片描述
这里表示k8s管理的报文(也就是被标记了0x4000的报文),在离开Node(物理机)的时候需要进行SNAT转换。

也就是POD发出的报文。

报文处理流程图

集群内部通过clusterIP访问到pod的流程

                                      (KUBE-SVC@nat)              
               (KUBE-SERVICES         +->SVC1
  OUTPUT        @filter,nat)           |             (KUBE-SEP@nat)
   PKT  ----->命中ClusterIP ----------+->SVC2 -->SEP1,Mark0x0400,DNAT
          |                           |                 |
          |                           +->SVC3           |
          |                                             |
          |                                             |
          |              +-----------------+            | 
          +------------> |   POSTROUTING   | <----------+
                         +--------+--------+
                                  |         
                                  |         
                          match 0x0400,SNAT@nat                 
                                  |
                                  |
                                 网卡 

也可以理解为从Node发出的报文的处理过程。因为这个数据包是通过本地协议发出的,然后需要更改NAT表,那么k8s就在OUTPUT这个链上来动手。

例1:在集群内部通过ClusterIP:pod端口访问相应的pod

本例子中ClusterIP为172.18.13.113,对应的pod容器的端口为8080,对应两个pod。

访问命令为curl 172.18.13.113:8082
在这里插入图片描述
1、经过OUTPUT链时指出报文要经过KUBE-SERVICES
在这里插入图片描述
2、在KUBE-SERVICES链查找到ClusterIP-172.18.13.113,于是转发到链KUBE-SVC-YG65S75AKNCDZRSF
在这里插入图片描述
3、在KUBE-SVC-YG65S75AKNCDZRSF链中,因为该clusterIP对应两个pod,所有该链下有两条规则,同时实现第一条规则的概率为0.5。
在这里插入图片描述
4、假设我们转到了链KUBE-SEP-3BN22EQZG75AYFUY,在该链中对这个包进行了一次DNAT转换,转到172.17.9.2中,即pod的ip地址。
在这里插入图片描述

通过外部nodeport访问后端pod的流程

                                                   (KUBE-SVC@nat)              
                                                     +->SVC1
                (KUBE-SERVICES@nat)                  |           (KUBE-SEP@nat)
            +--->命中ClusterIP   --------------------+->SVC2 -->SEP1,Mark0x0400,DNAT
PREROUTING  |                              ^         |                 |
    PKT  -->|                              |         +->SVC3           |
            |                              |                           |
            +--->未命中ClusterIP --->命中服务端口                         |       
                                  |                                    |       
                                  +->未命中服务端口                      |       
                                           |                           |       
                                           |                           |
                                         +-----------------------------+
                                         |         INPUT               |--> END
                                         +-----------------------------+

也可以理解为发送到Node的报文的处理过程

例2:我们在集群外的机器通过pod暴露的端口30002访问相应的pod.

其中集群外机器IP为172.18.52.170,pod所在机器为192.168.204.144,暴露在该机器的端口为30002。

访问命令为curl 192.168.204.144:30002
在这里插入图片描述
1、集群外机器172.18.52.170根据路由规则将数据包发送到pod所在机器192.168.204.144。

2、数据包进入了pod所在的机器,所以k8s对该机器nat表的PREROUTING链做规则。链时指出报文要经过KUBE-SERVICES。
在这里插入图片描述
3、把数据包转到KUBE-SERVICES这个链之后,因为我们是通过nodeport访问的,所有没有匹配到clusterIP,转到KUBE-NODEPORTS链上。
在这里插入图片描述
4、KUBE-NODEPORTS还是将数据包转到KUBE-SVC-VZEERQ5BHBSZ5PRL上,打上标签。再转到KUBE-SVC-YG65S75AKNCDZRSF链中,DNAT转换。
在这里插入图片描述

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

kubernetes的Kube-proxy的iptables转发规则 的相关文章

  • Kubernetes ConfigMap 大小限制

    Though resourceQuotas可能会限制命名空间中的配置映射的数量 是否有任何这样的选项来限制单个配置映射的大小 我不喜欢某些用户开始上传大型文本文件作为配置映射 ConfigMap etcd 支持的最大大小是多少 如果 etc
  • Kubernetes nginx 入口控制器返回 502,但仅适用于 AJAX/XmlHttpRequest 请求

    我有一个在 nginx 入口控制器后面运行 Kubernetes 的 Web 应用程序 它对于请求浏览工作正常 但来自浏览器的任何 AJAX XMLHTTPRequest 都会从 nginx 收到 502 错误 我捕获了常规请求和 AJAX
  • 如何在 Nodejs 中创建代理下载

    我想创建一个nodejs服务器 它充当下载文件的代理 即用户点击 在下载按钮上 从nodejs服务器调用get nodejs服务器从不同的服务器获取链接 远程服务器并开始下载 以 TB 为单位 然后将该下载转发给用户 TB 文件不应存储在
  • Jenkinsfile 泊坞窗

    我正在 docker 容器内的 GCE 上运行一个 jenkins 实例 并希望从此 Jenkinsfile 和 Github 执行多分支管道 我正在使用GCE詹金斯 https cloud google com solutions con
  • 在 selenium webdriver 中使用 phantomjs 代理

    我正在尝试在 selenium webdriver 2 25 的 ruby 1 8 7 脚本中使用 PhantomJS 1 9 1 配置代理 我看到了一些使用 Firefox 的例子 我用这个浏览器成功地做到了 我使用了这段代码 profi
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • Grafana/prometheus 中没有 kafka 指标

    我成功部署了 Helm Chart普罗米修斯操作员 https github com coreos prometheus operator tree master helm prometheus operator kube 普罗米修斯 ht
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • Ubuntu 16.04 中 kubeadm join 命令每次都会超时

    我正在使用 Ubuntu 16 04 Xenial 但我遇到了一个问题kubeadm加入时nodes to my master 在加入一个node to my master 我不断遇到超时问题 discovery Failed to req
  • 使用节点http代理转发http代理

    我正在使用 node http proxy 库来创建转发代理服务器 我最终计划使用一些中间件来动态修改 html 代码 这就是我的代理服务器代码的样子 var httpProxy require http proxy httpProxy c
  • kubectl --token=$TOKEN 未使用令牌的权限运行

    当我使用命令时kubectl与 token标记并指定令牌 它仍然使用来自kubeconfig file 这就是我所做的 NAMESPACE default SERVICE ACCOUNT NAME sa1 kubectl create sa
  • 构建一个“简单”的 php url 代理

    我需要在我正在构建的 Web 应用程序中实现一个简单的 PHP 代理 它基于 Flash 并且目标服务提供商不允许编辑其 crossdomain xml 文件 任何 php 专家都可以就以下 2 个选项提供建议吗 另外 我认为 但不确定 我
  • 除了 80 / 443 之外,我还可以为 Kubernetes 入口设置自定义端口来侦听吗?

    我并不是说能够路由到特定端口 我的意思是实际更改入口侦听的端口 这可能吗 如何 这是在哪里记录的 不 从Kubernetes 文档 https kubernetes io docs concepts services networking
  • 各种 Istio 端口是如何使用的?

    Question 我正在尝试学习 Istio 并且正在设置我的 Istio Ingress Gateway 当我设置它时 有以下端口选项 如此处所示 https istio io latest docs reference config i
  • Spring OAuth2 Keycloak Kubernetes 内部/外部访问

    我在 Kubernetes 集群内配置了 Keycloak 10 0 3 服务器 keycloak 服务器必须处理外部用户的身份验证 使用外部 url 并处理用于 Spring 微服务通信的 oauth2 令牌 然后Web应用程序Sprin
  • 无法使用 minikube 设置 Istio

    我按照 Istio 的官方文档为带有 minikube 的示例 bookinfo 应用程序设置了 Istio 但我得到了无法连接到服务器 net http TLS 握手超时错误 这些是我遵循的步骤 我安装了 kubectl 和 miniku
  • 配置 PIP 以在代理后面工作

    我已经安装了 python 3 4 3 附带pip 我想从代理后面使用 pip 所以我执行了以下操作 Created C Users foo pip pip ini并添加了代理配置部分 proxy export http proxy my
  • 使用普通用户和 https 的 gitea

    我正在尝试设置 gitea 以使用 https 和我从 LetsEncrypt 获得的证书 运行该服务作为普通用户 我已经让它与普通用户在端口 80 上使用 http 一起工作git并使用 iptables 将端口 80 重定向到端口 30
  • 如何通过 IPTables 阻止一些特殊的用户代理

    我需要阻止来自任何来源的数据包 其中包括使用 IPTables 的一些特殊用户代理 但我不想通过管理它 htaccess或阿帕奇 有什么办法吗 你可以这样做 iptables A INPUT p tcp dport 80 m string
  • 让我们加密证书颁发

    我正在尝试获取 Let s Encrypt 颁发的证书 已经过去了 3 个半小时 我不小心最初将我的 SecretName 设置为 echo tls 然后将其切换到我想使用的正确的 pandaist tls 我目前有这个 kubectl g

随机推荐

  • 为了安装caffe 安装opencv

    cmake D CMAKE BUILD TYPE 61 RELEASE D CMAKE INSTALL PREFIX 61 home lab248 anaconda2 D INSTALL PYTHON EXAMPLES 61 ON D IN
  • 腾讯轻量云服务器控制台详细介绍及建站操作图文教程

    腾讯轻量应用服务器控制台与腾讯云服务器不同 xff0c 轻量应用服务器主要是在控制台上集成了大部分建站功能 xff0c 通过简单点击几次鼠标就可以轻松建站 xff0c 易学易用 不过对于没接触过的新手来说 xff0c 还是有点陌生的 xff
  • 腾讯云轻量应用服务器快速搭建一个专属网盘

    一 前言 xff1a 云盘我想大家接触的一定不会少 云盘很好地解决了文件存储和共享的问题 xff0c 但随着大量云盘厂商的退出 xff0c 剩余的云盘服务也越来越少 有些云盘虽然上传速度快 xff0c 但是下载速度较慢 xff0c 不开通会
  • 使用腾讯云轻量应用服务器搭建一个简洁漂亮的目录

    前言 作为一个摄影爱好者 xff0c 会经常做一些图片的分享 xff0c 前端时间在网上看到了一个非常好看的目录 xff0c 这里给大家分享一下怎么样通过腾讯轻量应用服务器来搭建 官方介绍 files photo gallery是一款简洁漂
  • 玩转服务器-博客两件套之绝佳的Markdown写作平台CodiMD

    前言 大家都很羡慕博主的高产 xff0c 纷纷问我有什么技巧 我的回复是手熟 xff0c 多写 xff0c 那么多写就需要一个比较好的工具 xff0c 所以我这里给大家介绍一个在线markdown文档平台 xff0c 让大家可以随时书写文档
  • 玩转服务器-博客两件套之开源的一文多发平台ArtiPub

    玩转服务器 博客两件套之开源的一文多发平台ArtiPub 前言 上次给大家介绍了 xff0c 博主在线的markdown文档平台 xff0c 让大家可以随时书写文档和博客 xff0c 那么很多朋友在很多平台都看到了我的文章 xff0c 我是
  • 使用acme.sh申请Let‘s Encrypt免费的SSL证书

    使用acme sh申请Let s Encrypt免费的SSL证书 说明 xff1a Let s Encrypt 是一个由非营利性组织 互联网安全研究小组 xff08 ISRG xff09 提供的免费 自动化和开放的证书颁发机构 xff08
  • win7操作系统下laravel/homestead在SSH auth method: private key卡住提示Warning: Connection reset. Retrying的解决方案

    将VirtualBox兼容模式改为win7 勾选以管理员身份运行 安全里面各组个用户全部编辑好权限并勾选 电脑开机后优先双击VirtualBox启动后在执行git命令行进行启动
  • 为什么用了索引,SQL查询还是慢?

    原文链接cnblogs com jackyfei p 12122767 html 经常有同学疑问 xff0c 为什么有时候一个SQL语句使用了索引 xff0c 为什么还是会进入到慢查询之中呢 xff1f 今天我们就从这个问题开始来聊一聊索引
  • 腾讯云轻量应用服务器器使用技巧-腾讯云OrcaTerm的上传下载

    前言 xff1a 上传下载是WebShell中不可或缺的功能之一 xff0c 也是我在日常管理过程中经常使用操作 这里就跟着博主的视角来揭秘 xff0c 腾讯云OrcaTerm的上传与下载 对比 博主对比了一些shell的应用 xff0c
  • C语言strtok函数

    strtok是C语言用于分割字符串的函数 xff0c 需要include lt string h gt 第一次使用时第一个参数传入待分割的字符串 xff0c 第二个参数传入分割符号 第二次使用时第一个函数传入NULL 第二个参数传入分割符号
  • CSS | 置换元素(可替换元素)

    文章目录 置换元素 定义 常见置换元素 固有尺寸 非置换元素 注意 若文章有任何纰漏或未涉及你想了解的内容 欢迎在评论提出 我会尽最快速度回复 置换元素 定义 置换元素是具有固有尺寸 intrinsic dimensions 浏览器根据其标
  • 人体姿态估计综述(Human Pose Estimation Overview)

    主流数据集整理 xff1a http blog csdn net qq 36165459 article details 78332172 Part1 xff1a Single Person Pose Estimation 2015 年之前
  • 1到100的二进制表示

    1 61 1 2 61 10 3 61 11 4 61 100 5 61 101 6 61 110 7 61 111 8 61 1000 9 61 1001 10 61 1010 11 61 1011 12 61 1100 13 61 11
  • 画格子

    题目描述 画一些小格子 xff0c 如下所示 xff1a MAKEAMERICA AKEAMERICAG KEAMERICAGR EAMERICAGRE AMERICAGREA MERICAGREAT ERICAGREATA RICAGRE
  • golang -----------字符串(rune,string,type)

    一 内存布局 字符串在Go语言内存模型中用一个2字长的数据结构表示 它包含一个指向字符串存储数据的指针和一个长度数据 因为string类型是不可变的 xff0c 对于多字符串共享同一个存储数据是安全的 切分操作str i j 会得到一个新的
  • HTTP中GET,POST和PUT的区别

    一 HTTP中定义了以下几种请求方法 1 GET xff1b 2 POST xff1b 3 PUT xff1b 4 DELETE 5 HEAD xff1b 6 TRACE xff1b 7 OPTIONS xff1b 二 各个方法介绍 xff
  • B树,B+树,红黑树应用场景笔记

    一 B树的应用 1 B树大量应用在数据库和文件系统当中 它的设计思想是 xff0c 将相关数据尽量集中在一起 xff0c 以便一次读取多个数据 xff0c 减少硬盘操作次数 B树算法减少定位记录时所经历的中间过程 xff0c 从而加快存取速
  • 使用 Gitee 进行代码管理

    为什么使用 Gitee 这里推荐使用 Gitee 进行代码管理 Gitee 和 Github 最大的区别在我看来就是私有库的免费 xff0c 在 Github 上建立私有库是需要收费的 xff0c 而在 Gitee 上建立私有库是不需要收费
  • kubernetes的Kube-proxy的iptables转发规则

    概念 kube proxy 实际上并不起一个 proxy 的作用 xff0c 而是 watch 变更并更新 iptables xff0c 也就是说 xff0c client 的请求直接通过 iptables 路由 如果kube proxy通