草庐IT

Kubernetes IPVS和IPTABLES

念舒_C.ying 2023-03-28 原文

个人名片:
对人间的热爱与歌颂,可抵岁月冗长?
Github??‍?:念舒_C.ying
CSDN主页✏️:念舒_C.ying
个人博客? :念舒_C.ying

什么是IPVS

IPVS(IP Virtual Server,IP虚拟服务器)实现了传输层的负载平衡,通常称为4 LAN(四层局域网)交换,是Linux内核的一部分。

IPVS在主机上运行,在真实服务器集群前面充当负载平衡器。IPVS可以将基于 TCP 和 UDP 的服务请求定向到真实服务器上。

IPVS vs IPTABLES

IPVS 模式在 Kubernetes v1.8中引入,在v1.9中成为测试版,在v1.11中成为GA。
IPTABLES模式是在v1.1版本中加入的,从v1.2版本开始成为默认的操作模式。

IPVS和IPTABLES都是基于netfilter的。IPVS模式和IPTABLES模式的区别如下:

  1. IPVS为大型集群提供更好的可扩展性和性能。

  2. IPVS比IPTABLES支持更复杂的负载平衡算法(最小负载、最小连接、定位、加权等)。

  3. IPVS 支持服务器健康检查和连接重试等。

IPVS 对 IPTABLES 的依赖

IPVS代理使用IPTABLES做数据包过滤SNAT伪装。具体来说,IPVS代理将使用ipset来存储需要DROP或做伪装的流量的源地址或目的地址,以确保无论我们有多少服务,IPTABLES规则的数量不变。

下面是IPVS代理服务器使用的ipset集的表格。

set namemembersusage
KUBE-CLUSTER-IPAll service IP + portMark-Masq for cases that masquerade-all=true or clusterCIDR specified
KUBE-LOOP-BACKAll service IP + port + IPmasquerade for solving hairpin purpose
KUBE-EXTERNAL-IPservice external IP + portmasquerade for packages to external IPs
KUBE-LOAD-BALANCERload balancer ingress IP + portmasquerade for packages to load balancer type service
KUBE-LOAD-BALANCER-LOCALLB ingress IP + port with externalTrafficPolicy=localaccept packages to load balancer with externalTrafficPolicy=local
KUBE-LOAD-BALANCER-FWload balancer ingress IP + port with loadBalancerSourceRangespackage filter for load balancer with loadBalancerSourceRanges specified
KUBE-LOAD-BALANCER-SOURCE-CIDRload balancer ingress IP + port + source CIDRpackage filter for load balancer with loadBalancerSourceRanges specified
KUBE-NODE-PORT-TCPnodeport type service TCP portmasquerade for packets to nodePort(TCP)
KUBE-NODE-PORT-LOCAL-TCPnodeport type service TCP port with externalTrafficPolicy=localaccept packages to nodeport service with externalTrafficPolicy=local
KUBE-NODE-PORT-UDPnodeport type service UDP portmasquerade for packets to nodePort(UDP)
KUBE-NODE-PORT-LOCAL-UDPnodeport type service UDP port with externalTrafficPolicy=localaccept packages to nodeport service with externalTrafficPolicy=local

在以下情况下,IPVS 代理将依赖 IPTABLES。

1. kube-proxy以–masquerade-all=true启动

如果kube-proxy以--masquerade-all=true启动,IPVS代理将伪装所有访问服务集群IP的流量,这与IPTABLES代理的行为相同。假设kube-proxy指定了标志--masquerade-all=true,那么IPVS代理安装的IPTABLES应该如下所示:

# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-MARK-MASQ (2 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOOP-BACK dst,dst,src

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-CLUSTER-IP dst,dst
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-CLUSTER-IP dst,dst

2. 在kube-proxy启动时指定集群CIDR

如果kube-proxy以--cluster-cidr=<cidr>启动,IPVS代理将伪装访问服务集群IP的非集群流量,其行为与IPTABLES代理相同。假设kube-proxy提供的集群cidr是10.244.16.0/24,那么IPVS代理安装的IPTABLES应该如下所示。

# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-MARK-MASQ (3 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOOP-BACK dst,dst,src

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  -- !10.244.16.0/24       0.0.0.0/0            match-set KUBE-CLUSTER-IP dst,dst
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-CLUSTER-IP dst,dst

3. loadBalancer类型的服务

对于loadBalancer类型的服务,IPVS代理将安装IPTABLES与ipset KUBE-LOAD-BALANCER匹配。特别是当服务的LoadBalancerSourceRanges被指定或指定externalTrafficPolicy=local时,IPVS代理将创建ipset集KUBE-LOAD-BALANCER-LOCAL/KUBE-LOAD-BALANCER-FW/KUBE-LOAD-BALANCER-SOURCE-CIDR并相应地安装IPTABLES,它应该看起来像下面所示。

# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-FIREWALL (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOAD-BALANCER-SOURCE-CIDR dst,dst,src
KUBE-MARK-DROP  all  --  0.0.0.0/0            0.0.0.0/0

Chain KUBE-LOAD-BALANCER (1 references)
target     prot opt source               destination
KUBE-FIREWALL  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOAD-BALANCER-FW dst,dst
RETURN     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOAD-BALANCER-LOCAL dst,dst
KUBE-MARK-MASQ  all  --  0.0.0.0/0            0.0.0.0/0

Chain KUBE-MARK-DROP (1 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x8000

Chain KUBE-MARK-MASQ (2 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOOP-BACK dst,dst,src

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-LOAD-BALANCER  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOAD-BALANCER dst,dst
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOAD-BALANCER dst,dst

4. NodePort类型的服务

对于NodePort类型的服务,IPVS代理将安装IPTABLES与ipset KUBE-NODE-PORT-TCP/KUBE-NODE-PORT-UDP的匹配。当指定externalTrafficPolicy=local时,IPVS代理将创建ipset集KUBE-NODE-PORT-LOCAL-TCP/KUBE-NODE-PORT-LOCAL-UDP并相应地安装IPTABLES,这应该是如下所示的:

假设服务的TCP类型为nodePort。

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-MARK-MASQ (2 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-NODE-PORT (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-NODE-PORT-LOCAL-TCP dst
KUBE-MARK-MASQ  all  --  0.0.0.0/0            0.0.0.0/0

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOOP-BACK dst,dst,src

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-NODE-PORT  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-NODE-PORT-TCP dst

5. 指定externalIP的服务

对于指定了外部IP的服务,IPVS代理将安装IPTABLES与ipset KUBE-EXTERNAL-IP匹配,假设我们有指定了外部IP的服务,IPTABLES规则应该如下所示:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-POSTROUTING  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes postrouting rules */

Chain KUBE-MARK-MASQ (2 references)
target     prot opt source               destination
MARK       all  --  0.0.0.0/0            0.0.0.0/0            MARK or 0x4000

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service traffic requiring SNAT */ mark match 0x4000/0x4000
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-LOOP-BACK dst,dst,src

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-EXTERNAL-IP dst,dst
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-EXTERNAL-IP dst,dst PHYSDEV match ! --physdev-is-in ADDRTYPE match src-type !LOCAL
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            match-set KUBE-EXTERNAL-IP dst,dst ADDRTYPE match dst-type LOCAL

Kubernetes使用IPVS

安装IPVS

CentOS

yum install ipset ipvsadm -y

Ubuntu

apt-get install ipset ipvsadm -y

设置

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

期待下次的分享,别忘了三连支持博主呀~
我是 念舒_C.ying ,期待你的关注~???

有关Kubernetes IPVS和IPTABLES的更多相关文章

  1. ruby - IPTables 和不同的 Redis 客户端的奇怪问题 - 2

    我正在尝试弄清楚如何连接到Redis客户端,该客户端应该阻止端口6379上通过TCP的所有Redis连接。我正在使用的ruby​​客户端和telnet都可以连接和执行命令。我使用的golang客户端不能,我真的很困惑为什么。这是我的iptables定义:root@server:~#iptables-LChainINPUT(policyACCEPT)targetprotoptsourcedestinationACCEPTall--localhostanywhereACCEPTall--anywhereanywherectstateRELATED,ESTABLISHEDACCEPTtcp-

  2. Linux安全--iptables详解 - 2

    目录1、iptables介绍2、iptables四表五链详解3、iptables基本语法4、实际操作4.1增加规则 4.2删除规则4.3修改规则 5、命令语法总结 6、基本匹配条件7、iptables进阶用法7.1iprange扩展模块7.2string扩展模块8、iptables进行端口转发1、iptables介绍防火墙分类:从逻辑上分类分类说明主机防火墙针对单个主机进行防护网络防火墙处理网络入口或者边缘,针对网络入口进行防护防火墙分类:从物理上分类分类说明硬件防火墙在硬件级别实现防火墙功能软件防火墙应用软件处理逻辑运行于通用硬件平台之上的防火墙两个概念:内核空间:也叫内核态,操作系统占据的

  3. php - 使用 API pref 管理 IPTables。 PHP - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion是否有一个API以便我可以使用PHP管理IPTables,它用于构建一个带有浏览器登录的路由器的项目,有点像Fonera?

  4. php - 阻止不需要的访客 : htaccess, iptables,或者只是数据库 - 2

    我们最近有一个客户被机器人注册帐户以及寻找不存在的目录(/phpmyadmin/、/pma/、/members/、/admin/等)所困扰。我们已经创建了一种方法来抓取访问日志并识别恶意IP,但我想知道最有效的解决方案。在最初的抓取之后,我尝试将大约10,000个IP添加到iptables以被阻止。这似乎让事情变得有点慢,我开始想知道什么能最好地阻止有问题的机器人/恶意用户。使用iptables、htaccess或只是一个数据库。数据库方法似乎是最简单的,但如果在htaccess或iptables级别阻止它们更有效,我宁愿不要让恶意用户浪费查询。有没有适合大量地址的方法?如果有的话,每

  5. Linux 命令(215)—— iptables 命令 - 2

    文章目录1.命令简介2.命令格式3.选项说明4.常用示例参考文献1.命令简介iptables/ip6tables是IPv4/IPv6包过滤和NAT的管理工具。iptables/ip6tables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。iptables/ip6tables均是xtables-multi的软链。2.命令格式iptables[-ttable]{-A|-C|-D}chainrule-specificationip6tables[-ttable]{-A|-C|-D}chainrule-specification

  6. iptables命令介绍 - 2

    防火墙是由上而下的顺序来读取配置的策略规则,策略规则的设置有两种:通(放行)、堵(阻止)。当默认策略设置为通时,就要设置拒绝规则,当默认策略为堵时,则要设置允许规则。iptables服务把用于处理或过滤流量的策略条目称为规则,多条规则组成一个规则链,规则连依据数据包处理位置的不同进行分类。在进行路由选择前处理数据包:PREROUTING处理流入的数据包:INPUT(此规则使用最多,可增加外网入侵的难度)处理流出的数据包:OUTPUT处理转发的数据包:FORWARD在进行路由选择后处理数据包:POSTROUTING对应的动作,ACCEPT(允许流量通过)、REJECT(j拒绝流量通过)、LOG(

  7. hadoop - 在安装 hadoop 时,为什么我们要关闭 iptables? - 2

    为什么要关闭iptables和Disableselinux。是否有解决此问题的方法,因为它可能会导致安全漏洞? 最佳答案 许多Hadoop集群都是用“高墙”构建的。这基本上意味着保护集群的外部免受随机人进入iptables等。但是一旦你登录,你就会被信任,一切都会发生。如果您的Hadoop集群数据节点位于单独的网络上,这通常并不难,这是大型集群的常态。安全性会影响性能,可能会导致系统崩溃和其他不良情况,因此如果您不需要它,请不要使用它。但这并不适用于所有人。由于不受信任的用户或监管要求。在像Hadoop这样的分布式系统中,身份验证和

  8. android - android : iptables-save and iptables-restore not working 中的 iptables 错误 - 2

    我已经为启用了完整netfilter功能的android模拟器编译了Linux。从源代码构建android后得到一个iptables二进制文件。当我将这个二进制文件推送到模拟器时我可以成功执行如下命令。iptables-Liptables-Fiptables-AINPUT-swww.google.com-jDROP出现此错误:##iptables-Lgetsockoptformultiportfailedstrangely:Nosuchfileordirectorygetsockoptformultiportfailedstrangely:NosuchfileordirectoryCh

  9. android - 如何在 Android 应用程序中使用 iptables - 2

    如何在Android应用程序中使用iptables?我需要它来实现类似防火墙的功能,即数据包过滤、阻止站点等。我也不确定iptables在Android内核中是否可用。我之前听说我必须创建iptables的交叉编译二进制文件——但我该怎么做呢?我如何在应用程序中使用它们? 最佳答案 绝对有可能。您可能会考虑查看thesourceDroidwall的代码.DroidWall-AndroidFirewallisafront-endapplicationforthepowerfuliptablesLinuxfirewall.Itallow

  10. mongodb - iptables 阻止与 mongodb 的本地连接 - 2

    我有一个带有mongodb(2.0.4)的虚拟机(Ubuntu12.04.4LTS),我想用iptables限制它只接受SSH(输入/输出),而不接受其他任何东西。这就是我的设置脚本设置规则的方式:#!/bin/sh#DROPeverythingiptables-Fiptables-Xiptables-PFORWARDDROPiptables-PINPUTDROPiptables-POUTPUTDROP#inputiptables-AINPUT-mstate--stateRELATED,ESTABLISHED-jACCEPTiptables-AINPUT-s127.0.0.1-jACC

随机推荐