k8s kube-proxy详解

news2024/11/18 13:29:49

一、kube-proxy简介

kube-proxy是kubernetes中网络核心组件,实现了服务暴露和转发等网络功能。kube-proxy支持userspace,ipvs和iptables三种代理模式。userspace性能问题较严重,基本不再使用,应用最多的是iptables和ipvs模式。

kube-proxy 以daemonset的方式运行在每个Node计算节点上,负责Pod网络代理, 它会定时通过apiserver从etcd服务获取到service和endpoint资源的变化,维护网络规则和四层负载均衡工作。在K8s集群中微服务的负载均衡是由Kube-proxy实现的,它是K8s集群内部的负载均衡器,也是一个分布式代理服务器,在K8s的每个节点上都有一个,这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。在k8s的网络模型中,实际就是一个反向代理。

在kubernetes网络中,还有其他网络插件实现了和kube-proxy相同的功能,若kube-router,cilium,他们都支持kube-proxy实现的功能,因此在使用上述网络插件时,集群里可以不部署kube-proxy。

service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。service会为这个LB提供一个IP,一般称为cluster IP。kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问。
小结:

kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service。
kube-proxy管理sevice的Endpoints,该service对外暴露一个Virtual IP,也成为Cluster IP, 集群内通过访问这个Cluster IP:Port就能访问到集群内对应的serivce下的Pod。
service是通过Selector选择的一组Pods的服务抽象,其实就是一个微服务,提供了服务的LB和反向代理的能力,而kube-proxy的主要作用就是负责service的实现。
service另外一个重要作用是,一个服务后端的Pods可能会随着生存灭亡而发生IP的改变,service的出现,给服务提供了一个固定的IP,而无视后端Endpoint的变化。

二、service简介

Kubernetes Service定义了这样一种抽象: Service是一种可以访问 Pod逻辑分组的策略, Service通常是通过 Label Selector访问 Pod组。

service类型:

在k8s中定义了4中service类型
ClusterIP:通过 VIP 访问 Service,但该 VIP 只能在此集群内访问
NodePort:通过 NodeIP:NodePort 访问 Service,会在集群内的所有节点上开启端口
ExternalIP:与 ClusterIP 相同,但是这个 VIP 可以从这个集群之外访问
LoadBalancer:类似公网的负载均衡器

三、endpoint简介

创建Service的同时,会自动创建跟Service同名的Endpoints。 Endpoint 是k8s集群中一个资源对象,存储在etcd里面,用来记录一个service 对应的所有pod的访问地址。service通过selector和pod建立关联。service配置selector endpoint controller 才会自动创建对应的endpoint 对 象,否则是不会生产endpoint 对象。

一个service由一组后端的pod组成,这些后端的pod通过service endpoint暴露 出来,如果有一个新的pod创建创建出来,且pod的标签名称(label:pod)跟 service里面的标签(label selector 的label)一致会自动加入到service的 endpoints 里面,如果pod对象终止后,pod 会自动从edpoints 中移除。在集群中任意节点可以使用curl请求service:port来访问后端pod业务。

Endpoint Controller

Endpoint Controller是k8s集群控制器的其中一个组件,其功能如下:
2 ############################################
3 负责生成和维护所有endpoint对象的控制器
4 负责监听service和对应pod的变化
5 监听到service被删除,则删除和该service同名的endpoint对象
6 监听到新的service被创建,则根据新建service信息获取相关pod列表,然后创建对应end
point对象
7 监听到service被更新,则根据更新后的service信息获取相关pod列表,然后更新对应end
point对象
8 监听到pod事件,则更新对应的service的endpoint对象,将podIp记录到endpoint中

四、IPVS详解

在kubernetes 1.8以上的版本中,对于kube-proxy组件增加了除iptables模式和用户模式之外还支持ipvs模式。kube-proxy ipvs 是基于 NAT 实现的,通过ipvs的NAT模式,对访问k8s service的请求进行虚IP到POD IP的转发。当创建一个 service 后,kubernetes 会在每个节点上创建一个网卡,同时将 Service IP(VIP) 绑定上并根据service架构在每个节点创建ipvs规则。

可以参考此处链接https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/ipvs/README.md

  • 什么是ipvs
    ipvs **(IP Virtual Server)**实现了4层负载均衡的功能。在内核中对应的模块为ip_vs,ip_vs_rr等内核模块。在用户空间也有一个管理程序叫做ipvsadm,用来管理配置内核中虚拟服务器的工具。IPVS 在主机上运行,并充当真实服务器集群前面的负载均衡器。IPVS 可以将基于 TCP 和 UDP 的服务请求定向到真实服务器,并使真实服务器的服务在单个 IP 地址上表现为虚拟服务。
#######查看主机的ipvs模块
[root@node1 ~]# lsmod | grep ip_vs
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  27 
ip_vs                 145458  33 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  11 ip_vs,xt_CT,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_nat_masquerade_ipv4,nf_nat_masquerade_ipv6,nf_conntrack_netlink,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack
[root@node1 ~]# 

#######查看kube-proxy的使用的模式
[root@node1 ~]# kubectl describe  cm/kube-proxy -n kube-system
                mode: ipvs    ####k8s高版本默认为ipvs
  • ipvs相比iptables优点
IPVS 为大型集群提供更好的可扩展性和性能。采用 ipset 是为了减少 iptables 规则
IPVS 支持比 IPTABLES 更复杂的负载均衡算法(如果不配置,默认为rr)
    rr:循环
    lc:最少连接
    dh:目标散列
    sh:源散列
    sed:最短的预期延迟
    nq:从不排队
IPVS支持服务器健康检查和连接重试等。


#############################
也并不是说,有了ipvs就不需要iptables了,IPVS 用于负载平衡,但它无法处理 kube-proxy 中的其他变通方法,例如数据包过滤、发夹伪装技巧、SNAT 等。在此处几个场景中,ipvs将利用iptables来实现。
ipvs proxier 会在以下 4 种场景下回退到 iptables:
    kube-proxy 以 --masquerade-all=true 开头
    在 kube-proxy 启动时指定集群 CIDR
    支持Loadbalancer类型的服务
    支持NodePort类型服务
通过查看kube-proxy查看是否有以上几种模式
[root@node1 ~]# kubectl describe  cm/kube-proxy -n kube-system
iptables:
 masqueradeAll: false
 masqueradeBit: 14
 minSyncPeriod: 0s
 syncPeriod: 30s
ipvs:
 excludeCIDRs: null
 minSyncPeriod: 0s
 scheduler: ""
 strictARP: false
 syncPeriod: 0s
 tcpFinTimeout: 0s
 tcpTimeout: 0s
 udpTimeout: 0s

  • ipvs网络拓扑
    当创建一个 ClusterIP 类型的 Service 时,IPVS proxier 会做以下三件事:
 确保节点中存在虚拟接口,默认为 kube-ipvs0
 将服务 IP 地址绑定到虚拟接口
 分别为每个Service IP地址创建IPVS虚拟服务器
1:创建svc
[root@node1 yaml]# kubectl get svc 
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
nginx-svc    ClusterIP   10.233.3.41   <none>        80/TCP    33s

2:查看节点的kube-ipvs0网卡上是否会有svc的ip地址
[root@node1 yaml]# ip  a| grep 10.233.3.41 
    inet 10.233.3.41/32 scope global kube-ipvs0
[root@node1 yaml]# 

3:查看ipvs规则
[root@node1 yaml]# ipvsadm -Ln  | grep  10.233.3.41 -A 5
TCP  10.233.3.41:80 rr
  -> 10.233.90.8:80               Masq    1      0          0         
  -> 10.233.92.29:80              Masq    1      0          0         
  -> 10.233.92.30:80              Masq    1      0          0         
  -> 10.233.96.26:80              Masq    1      0          0         
  -> 10.233.96.27:80              Masq    1      0          0         
[root@node1 yaml]#
  • 端口映射
    IPVS中有三种代理模式:NAT(masq)、IPIP和DR。只有 NAT 模式支持端口映射。Kube-proxy 利用 NAT 模式进行端口映射。以下示例显示 IPVS 映射服务端口 80 到 Pod 端口 80。
[root@node1 yaml]# ipvsadm -Ln  | grep  10.233.3.41 -A 5
TCP  10.233.3.41:80 rr     ####默认为rr
  -> 10.233.90.8:80               Masq    1      0          0         
  -> 10.233.92.29:80              Masq    1      0          0         
  -> 10.233.92.30:80              Masq    1      0          0         
  -> 10.233.96.26:80              Masq    1      0          0         
  -> 10.233.96.27:80              Masq    1      0          0 

访问流程:

与iptables、userspace 模式一样,kube-proxy 依然监听Service以及Endpoints对象的变化, 不过它并不创建反向代理, 也不创建大量的 iptables 规则, 而是通过netlink 创建ipvs规则,并使用k8s Service与Endpoints信息,对所在节点的ipvs规则进行定期同步; netlink 与 iptables 底层都是基于 netfilter 钩子,但是 netlink 由于采用了 hash table 而且直接工作在内核态,在性能上比 iptables 更优。其工作流程大体如下:

原文参考此处链接https://juejin.cn/post/7110243618182397982#heading-24
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于c++ extern关键字

解释和说明参考&#xff1a; (227条消息) C extern关键字_Candyerer的博客-CSDN博客 (227条消息) 对于C中的extern关键字用法的理解_c extern_Fanfan21ya的博客-CSDN博客 个人写了一个案例&#xff0c;代码结构如下 在总结一下 1.a.cpp文件需要引用b.cpp的文件中的变量或…

一文详解!嵌入式软件的自动化测试框架、测试流程与功能研究分析

目录 引言 1.嵌入式软件自动化测试平台分析 2.嵌入式软件自动化测试平台概要设计 3.嵌入式软件自动化测试平台详细设计 3.3 功能设计 引言 嵌入式软件是指被设计用于嵌入或控制另一个产品、设备或系统的软件。它在各种应用领域&#xff08;例如消费电子、工业控制、医疗设…

steam搬砖全套操作流程之如何卖货(第③课)

上一篇文章阿阳分享了Steam项目如何选品&#xff0c;今天就给大家说说装备如何发货等重要事项。 本节课主要为大家讲解&#xff1a;定价规则&#xff0c;加价原则&#xff0c;认识装备磨损度和印花&#xff0c;自动发货软件和自动上架软件的讲解。 &#xff08;Steam装备选品…

ESXi 7.0 U3m Inspur (浪潮) 定制版 OEM Custom Installer CD

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

在linux系统上运行Stable Diffusion web UI

stable-diffusion-webui项目地址 该项目是一个针对Stable Diffusion模型的浏览器操作界面&#xff0c;基于Gradio。 环境&#xff1a; 在恒源云上租的服务器&#xff0c;操作系统&#xff1a;Ubuntu、显卡&#xff1a;A4000-16G。恒源云官网链接 项目的Readme.md让我们用web…

科二学习笔记

文章目录 一、侧方位停车进库&#xff1a;出库&#xff1a; 二、倒车入库右入库与右出库出库部分&#xff1a;入库部分第一种方法(网络版本)&#xff1a;入库部分第二种方法&#xff1a; 左入库与左出库左出库左入库 三、直角转弯(右直角) 练车时间 am 7 ~ 11 pm15 ~ 18 一、侧…

中国做SaaS为什么这么难?这里解释了深层次的原因!

01 SaaS是什么&#xff1f; SaaS就是共享单车 SaaS&#xff0c;翻译过来是“软件即服务”。在大家的认知中&#xff0c;软件属于“产品”&#xff0c;SaaS也确实是一种产品&#xff0c;那为什么几乎所有的SaaS厂商却都在强调“服务”这个概念呢&#xff1f; 产品VS服务&…

JavaWeb笔记(三)

Java与数据库 通过Java如何去使用数据库来帮助我们存储数据呢&#xff0c;这将是本章节讨论的重点。 初识JDBC JDBC是什么&#xff1f;JDBC英文名为&#xff1a;Java Data Base Connectivity(Java数据库连接)&#xff0c;官方解释它是Java编程语言和广泛的数据库之间独立于数…

Pod 生命周期

目录 1&#xff0c;概述 Pod Phase阶段 2&#xff0c;创建和终止 pod的创建过程 pod的终止过程 3 Init容器 容器探针 容器回调 1&#xff0c;概述 我们一般将pod对象从创建至终止的这段时间范围内称为pod生命周期&#xff0c;它主要包含下面过程&#xff1a; 1.pod创建过…

信捷PLC使用串口485与超声波传感器通讯实例

使用信捷的XL3-32PLC,XL3支持串口通讯。用来与国产超声波检测传感器进行通讯。 首先是硬件接线: 将传感器的485口A、B与PLC的485口A、B分别连接好。 接线完成后,可以在电脑端先使用串口调试助手测试一下,数据的发送与接受是否正常。 另外,PLC的串口数据发送与接收,…

selenium基础定位元素入门

参考文章链接 什么是selenium&#xff1f; selenium是一个web自动化测试工具selenium环境部署安装 首先需要安装python环境 1、安装在cmd 直接输入 &#xff1a;pip install selenium2、卸载&#xff1a;在cmd输入&#xff1a;pip uninstall selenium3、查看&#xff1a;pip…

直播产品行业解决方案|商业化变现模型

摘要 在过去几年的直播行业创业风口期中&#xff0c;直播的用户关注度疯狂增长&#xff0c;但用户质量却参差不齐。随着用户新鲜感一过&#xff0c;流失率变得相当严重&#xff0c;各大平台都在竭尽全力防御。然而&#xff0c;留住“凑热闹”的非直播受众用户并不是最关键的问…

python高级-线程和进程相关

这里前面的linux基础就不补充了&#xff0c;只写一些比较高级的 目录 一、文件查找 1.按照名字查找 2.通配符 3.文件大小查找 二、压缩和打包 1.zip 2.gzip 3.tar命令 三、权限管理 四、多进程 1.创建进程 2.获取进程id 3.进程传参 4.进程不共享全局变量 5.守护…

系统重构实施,百亿级核心交易如何保证准确性?

重构&#xff1a;又喜欢又害怕 一个企业级的应用&#xff0c;即使是诸葛亮级别的设计人员&#xff0c;最初的考虑都不可能尽善尽美&#xff0c;会存在设计不够或者设计过头的情况。加上业务的发展可能与当初的推想不一致&#xff0c;这样就使得上线初期稳稳当当的一个系统&…

【MySQL】数据库中这么多数据类型你真的了解吗?一文看懂不同数据类型有何区别

【MySQL】数据类型 一、常见数据类型二、数值类型2.1 整型2.1.1 小结 2.2 bit类型2.3 float 类型2.4 decimal类型---精度更高 三、字符串类型3.1 char---固定字符串3.2 varchar---变长字符串3.2.1 char和varchar区别 3.3 日期和时间类型3.4 enum和set3.4.1 set查询----find_in_…

入门编程其实也简单

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f; 编程是指使用计算机语言编写计算机程序的过程。计算机程序是一系列指令的集合&#xff0c;这些指令告诉计算机要执行的操作。编程的目的是创建计算机…

2023-6-13-第四式建造者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

Openharmony使用hdc提效

告别串口卡顿调试&#x1f438;hdc增效大法&#x1f438;&#xff0c;工作环境主要是Linux&#xff0c;所以主要是介绍Linux环境下使用喔~ 文章目录 HDC1.1 简单介绍1.2 搭建环境1.2.1 设备机1.2.2 pc机1.2.3 操作 AuthorDateVersionDescription陈梓归2023-06-13V1.0第一个版本…

详解模板模式

目录 1.概述 2.实际业务场景示例 2.1.需求和实现思路 2.1.完整代码实现 1.概述 模板模式是一种常用的设计模式&#xff0c;它定义了一个操作中的算法的骨架&#xff0c;将某些步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤…

【ubuntu】vscode上jupter notebook的使用

1.安装vscode 2.安装python环境和插件 系统要有Python环境&#xff1a;conda install python 或者 pip都可以 在vsode里安装如下插件 3.安装jupter conda install jupyter notebook 安装完之后试着打开 输入jupyter note 打开才行&#xff0c;如果安装失败&#xff0c;就…