三十、Kubernetes中kube-proxy三种工作模式详解

news2024/9/27 7:26:36

1、概述

        在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。

        为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。

        Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则。 

 2、kube-proxy三种工作模式

2.1、userspace 模式        

这种(遗留)模式使用 iptables 添加拦截规则,然后使用 kube-proxy 工具执行流量转发。 kube-proxy 监视 Kubernetes 控制平面对 Service 和 EndpointSlice 对象的增加、修改和删除。 对于每个 Service,kube-proxy 在本地节点上打开一个端口(随机选择)。 任何对这个代理端口的连接都将代理到 Service 的一个后端 Pod(通过 EndpointSlices 报告)。 kube-proxy 在决定使用哪个后端 Pod 时会考虑 Service 的 sessionAffinity 设置。

        用户空间代理添加 iptables 规则,这些规则捕获流向 Service 的 clusterIP(虚拟 IP)和 port 的流量。 这些规则将这些流量重定向到代理后端 Pod 的代理端口。

默认情况下,用户空间模式下的 kube-proxy 通过轮询算法选择后端。

 2.2、iptables 模式

        iptables模式下,kube-proxy为service后端的每个Pod创建对应的iptables规则,直接将发向Cluster IP的请求重定向到一个Pod IP。 该模式下kube-proxy不承担四层负责均衡器的角色,只负责创建iptables规则。该模式的优点是较userspace模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试。

2.3、ipvs 模式 

ipvs模式和iptables类似,kube-proxy监控Pod的变化并创建相应的ipvs规则。ipvs相对iptables转发效率更高。除此以外,IPVS 为将流量均衡到后端 Pod 提供了更多选择。

IPSV 支持LB算法如下:

  • rr:轮询 默认是这个
  • lc:最少连接(打开连接数最少)
  • dh:目标地址哈希
  • sh:源地址哈希
  • sed:最短预期延迟
  • nq:最少队列

说明:

要在 IPVS 模式下运行 kube-proxy,必须在启动 kube-proxy 之前确保节点上的 IPVS 可用。

当 kube-proxy 以 IPVS 代理模式启动时,它会验证 IPVS 内核模块是否可用。 如果未检测到 IPVS 内核模块,则 kube-proxy 会退回到 iptables 代理模式运行。

 3、更改kube-proxy工作模式

因为kube-proxy 的配置是通过 ConfigMap 完成的,所以我们只需要更改 name=kube-proxy 的 ConfigmMap 然后删除 所有 拥有标签k8s-app=kube-proxy(更改后不会立即生效,需要删除后,自动重建pod)的pod,即可生效。当然针对每种工作模式,是有前提要求的,咱们以ipvs为例讲解。

3.1、更改ConigMap

# 在kube-system命名空间中查找 name=kube-proxy 的 ConfigMap(cm)
[root@k8s-master ~]# kubectl get cm -n kube-system
NAME                                 DATA   AGE
calico-config                        4      12d
coredns                              1      12d
extension-apiserver-authentication   6      12d
kube-proxy                           2      12d
kube-root-ca.crt                     1      12d
kubeadm-config                       1      12d
kubelet-config                       1      12d


# 编辑 大概47行 修改 mode=ipvs 保存
[root@k8s-master ~]# kubectl edit cm kube-proxy -n kube-system
configmap/kube-proxy edited

3.2、删除kube-system

由于更改了配置文件不会立即生效,将所有kube-system pod删除,k8s会立即新建kube-system pod这个时候新的配置即可生效

#查看 kube-system 命名空间下所有的 pod 可发现 3个以“kube-proxy-” 为前缀的pod,是因为我本地只有3个k8s节点,这三个节点都有相同的label叫“k8s-app=kube-proxy” 那咱们通过label删除即可全部删除
[root@k8s-master ~]# kubectl get pod -n kube-system --show-labels
NAME                                       READY   STATUS    RESTARTS   AGE    LABELS
calico-kube-controllers-59697b644f-bqhsg   1/1     Running   0          12d    k8s-app=calico-kube-controllers,pod-template-hash=59697b644f
calico-node-6x9rq                          1/1     Running   0          12d    controller-revision-hash=55f6f6844b,k8s-app=calico-node,pod-template-generation=1
calico-node-9npwl                          1/1     Running   0          12d    controller-revision-hash=55f6f6844b,k8s-app=calico-node,pod-template-generation=1
calico-node-s9g7k                          1/1     Running   0          12d    controller-revision-hash=55f6f6844b,k8s-app=calico-node,pod-template-generation=1
coredns-c676cc86f-n4nj8                    1/1     Running   0          12d    k8s-app=kube-dns,pod-template-hash=c676cc86f
coredns-c676cc86f-rhvwg                    1/1     Running   0          12d    k8s-app=kube-dns,pod-template-hash=c676cc86f
etcd-k8s-master                            1/1     Running   0          12d    component=etcd,tier=control-plane
kube-apiserver-k8s-master                  1/1     Running   0          12d    component=kube-apiserver,tier=control-plane
kube-controller-manager-k8s-master         1/1     Running   0          12d    component=kube-controller-manager,tier=control-plane
kube-proxy-2jk2g                           1/1     Running   0          16m    controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-h5tgq                           1/1     Running   0          16m    controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-nbmv2                           1/1     Running   0          16m    controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-scheduler-k8s-master                  1/1     Running   0          12d    component=kube-scheduler,tier=control-plane
metrics-server-f68c598fc-vt4pz             1/1     Running   0          2d2h   k8s-app=metrics-server,pod-template-hash=f68c598fc


# 通过label 删除所有kube-proxy pod
[root@k8s-master ~]# kubectl delete pod -l k8s-app=kube-proxy -n kube-system
pod "kube-proxy-2jk2g" deleted
pod "kube-proxy-h5tgq" deleted
pod "kube-proxy-nbmv2" deleted
[root@k8s-master ~]#

# 再次查看 发现 kube-proxy pod已新建
[root@k8s-master ~]# kubectl get pod -n kube-system --show-labels
NAME                                       READY   STATUS    RESTARTS   AGE    LABELS
calico-kube-controllers-59697b644f-bqhsg   1/1     Running   0          12d    k8s-app=calico-kube-controllers,pod-template-hash=59697b644f
calico-node-6x9rq                          1/1     Running   0          12d    controller-revision-hash=55f6f6844b,k8s-app=calico-node,pod-template-generation=1
calico-node-9npwl                          1/1     Running   0          12d    controller-revision-hash=55f6f6844b,k8s-app=calico-node,pod-template-generation=1
calico-node-s9g7k                          1/1     Running   0          12d    controller-revision-hash=55f6f6844b,k8s-app=calico-node,pod-template-generation=1
coredns-c676cc86f-n4nj8                    1/1     Running   0          12d    k8s-app=kube-dns,pod-template-hash=c676cc86f
coredns-c676cc86f-rhvwg                    1/1     Running   0          12d    k8s-app=kube-dns,pod-template-hash=c676cc86f
etcd-k8s-master                            1/1     Running   0          12d    component=etcd,tier=control-plane
kube-apiserver-k8s-master                  1/1     Running   0          12d    component=kube-apiserver,tier=control-plane
kube-controller-manager-k8s-master         1/1     Running   0          12d    component=kube-controller-manager,tier=control-plane
kube-proxy-57d4m                           1/1     Running   0          3s     controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-5zxrg                           1/1     Running   0          3s     controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-proxy-z2fpg                           1/1     Running   0          3s     controller-revision-hash=dd4c999cf,k8s-app=kube-proxy,pod-template-generation=1
kube-scheduler-k8s-master                  1/1     Running   0          12d    component=kube-scheduler,tier=control-plane
metrics-server-f68c598fc-vt4pz             1/1     Running   0          2d2h   k8s-app=metrics-server,pod-template-hash=f68c598fc

3.3、安装ipvsadm

ipvsadm 是一个客户端工具,可以让我们和ipvs表的数据进行交互

# 在master 上安装 即可
yum install -y ipvsadm

3.4、通过ipvsadm查看流量转发信息

 ipvsadm -Ln

3.5、kube-proxy默认工作模式以及注意点

        目前 Linux 平台上有三种可用的代理模式:'userspace'(相对较老,即将被淘汰)、 'iptables'(相对较新,速度较快)、'ipvs'(最新,在性能和可扩缩性上表现好)。

        在 Windows 平台上有两种可用的代理模式:'userspace'(相对较老,但稳定)和 'kernelspace'(相对较新,速度更快)。

        在 Linux 平台上,如果代理的 mode 为空,则使用可用的最佳代理(目前是 iptables, 将来可能会发生变化)。如果选择的是 iptables 代理(无论原因如何),但系统的内核 或者 iptables 的版本不够高,kube-proxy 也会回退为 userspace 代理服务器所使用的模式。 当代理的 mode 设置为 'ipvs' 时会启用 IPVS 模式,对应的回退路径是先尝试 iptables, 最后回退到 userspace。

        在 Windows 平台上,如果代理 mode 为空,则使用可用的最佳代理(目前是 userspace, 不过将来可能会发生变化)。如果所选择的是 winkernel 代理(无论原因如何), 但 Windows 内核不支持此代理模式,则 kube-proxy 会回退到 userspace 代理。

ipvs模式需要启动IPVS时依赖模块:

ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack

可通过如下命令确定系统是否启用了这些模块

lsmod | grep -e ip_vs -e nf_conntrack

如果没有启用,通过如下命令启用

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

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

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

相关文章

2023-01-18 ClickHouse之聚合功能源码分析

前言 聚合分析是从海量数据中提取数据的基本方法,对于OLAP数据库而言,聚合分析是其关键能力之一,ClickHouse在这方面也做了很多设计和优化,正如ClickHouse在文档中所述: 本文将分析展示ClickHouse的聚合功能的工作原理…

NFS 导出的共享信息披露漏洞问题解法

输入:shoumount -e, 如果有目录信息,则说明有NFS 导出的共享信息披露漏洞。 如果处理了就应显示如下图: 解法如下: 1)备份需要修改的文件 cp /etc/hosts.allow /etc/hosts.allowbak cp /etc/hosts.deny…

前端js实现文件多次添加累加上传和选择删除(django+js)

前言 原本的多文件上传功能在选择文件时,只能通过同一范围的鼠标框选或者ctrl/shift多选取选择文件,这样选择文件很不灵活,而且在确定之后如果漏选了文件,再次点击上传按钮时会清空表单里的文件信息,只能重复之前的操…

springcloudalibaba整合nacos

文章目录1.版本配置2.搭建项目2.1idea新建项目2.2项目依赖2.3测试初始项目2.4项目的配置文件3.nocas的配置文件4.进行测试4.1准备测试的文件4.2测试nacos安装: nacos下载安装 1.版本配置 2.搭建项目 2.1idea新建项目 选择springcloudalibaba和springboot版本 spr…

Minecraft 1.19.2 Forge模组开发 10.3D动画盔甲

Minecraft 1.16.5模组开发3D盔甲 Minecraft 1.12.2模组开发3D盔甲 Minecraft 1.18.2模组开发3D动画盔甲 我们本次在1.19.2的版本中实现具有动画效果的3D盔甲 效果演示效果演示效果演示 1.首先,为了实现这些效果,我们需要首先使用到一个模组:geckolib…

剖析栈和队列OJ题

1.括号匹配问题给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。3.每个右括号都有一个对应…

【阅读笔记】c++ Primer Plus——第八章

函数探幽 c内联函数 为了提高程序运行速度而做的改进编译的最终产物是可执行程序——由一组机器语言指令组成。运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址。然后计算机开始逐步执行指令。执行到函数调用的时候&…

一道编程劝退题,检测你是否适合干编程

前言大家都知道要想成为一名优秀的开发工程师,需要数学基础好,即你要有很强的逻辑思维能力,这里有一道美国斯坦福大学出的一道逻辑思维的测试测试,检测你的逻辑思维能力,大家可以看看自己逻辑能力怎么样。题目有一个抽…

<队列>的概念结构实现【C语言版】

1.队列的概念及结构 队列对于临时数据的处理也十分有趣,它跟栈一样都是有约束条件的数组(或者链表)。区别在于我们想要按什么顺序去处理数据,而这个顺序当然是要取决于具体的应用场景。 你可以将队列想象成是电影院排队。排在最…

Android Studio 工程导入 AOSP编译的 android.jar

使用场景   1.需要使用 framework 中的 SystemApi 文件或者 hide 的 API 接口   2.定制 Framework 层业务&#xff0c;即有 客制化 的 API 接口 补充知识点   1.framework 源码即 AS 工程目录中 External Libraries 下的 < Android API xx Platform > 下的原生 SDK…

Docker-全面详解(学习总结---从入门到深化)

一、什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 什么是"集装箱技术" 我们都知道码头里的集装箱是运载货物用的&#xff0c;它是一种按规格标准 化的钢制箱子。集装箱的特色&#xff0c;在于其格式划一&…

峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?

小游戏《羊了个羊》 短短的7天内&#xff0c;DAU突破了1亿、吞吐量峰值21WQps。 《羊了个羊》运营后台数据显示&#xff0c;在短短的7天内&#xff0c;这款小游戏的DAU就突破了1亿。 要知道&#xff0c;除了王者荣耀、原神等屈指可数的现象级手游之外&#xff0c;1亿DAU是这个…

LeetCode刷题模版:131 - 140

目录 简介131. 分割回文串132. 分割回文串 II133. 克隆图134. 加油站135. 分发糖果136. 只出现一次的数字137. 只出现一次的数字 II138. 复制带随机指针的链表139. 单词拆分140. 单词拆分 II【未理解】结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您…

【GitHub仓库上传和克隆】

GitHub仓库上传和克隆1. 安装1.1 WindowR:cmd1.2 选择写代码的文件夹右键Git Bash Here1.3 分支管理2. 本地仓库推送给网络仓库2.1 忽略推送文件2.2 本地初始推送3. 克隆3.1 克隆下载3.2 克隆代码修改上传3.2.1 初次推送3.2. 2 后续推送其他1. 安装 1.1 WindowR:cmd //是否安…

Redis从入门到精通(一:Redis入门)

Redis 简介 问题现象 海量用户 高并发 罪魁祸首——关系型数据库性能瓶颈&#xff1a;磁盘IO性能低下扩展瓶颈&#xff1a;数据关系复杂&#xff0c;扩展性差&#xff0c;不便于大规模集群解决思路降低磁盘IO次数&#xff0c;越低越好 —— 内存存储去除数据间关系&#xff0…

ucore lab1,lab2,lab3,lab4链表详解 获取结构体成员偏移

ucore版链表介绍 ucore是清华大学操作系统实验课要完成的操作系统&#xff0c;里面有个链表数据结构我觉得很有意思&#xff0c;记录下来。 ucore将链表与数据对象分离&#xff0c;使得任意数据对象&#xff0c;只要加上一个链表组件就能组织成一个链表。 要使得一个本来不具…

双目相机国产、非国产统计参数对比分析

双目相机国产、非国产统计参数对比分析 ZED ZED是STEREOLABS出品的双目摄像头&#xff0c;广泛应用在科研机构的无人车、协作机械臂上&#xff0c;如图2-1所示。其3D分辨率在Ultra模式下可达到RGB时的分辨率&#xff0c;具体见图2-2&#xff0c;物理尺寸为1753033mm&#xff…

记录一次gateway HandlerStrategies.withDefaults().messageReaders() 导致的内存炸裂的问题

背景 年前出现了一次内存炸裂的生产事故。导致其他请求无法请求通过。 [boundedElastic-55] [Loggers.java:314]:Scheduler worker in group main failed with an uncaught exception [TID:] 2023-01-18 10:40:33.189 [INFO] [boundedElastic-55] [AccessTokenGatewayFilterF…

Arduino基础学习——meArm(太极创客第二部分)

面包板电源模块为机器臂单独供电&#xff0c;机器臂本身有四个小电机驱动作用&#xff0c;如果单独靠arduino来为这四个小电机供电&#xff0c;机器臂可能不会稳定工作&#xff0c;将会抖动。 机械臂的四个动作主要靠四个电机来控制&#xff0c;这四个电机主要连接在我们的ard…

云端IDE系列教程4:TitanIDE + Typora = 鱼和熊掌

概述 目前&#xff0c;大部分技术人员使用 Markdown 编写技术文档已经成了日常工作的一部分&#xff0c;现在市场上也有各种各样的文字编辑工具&#xff1a;石墨文档、有道云笔记、语雀、金山文档、腾讯文档、Google文档&#xff0c;WPS、Office、Typora等。但在云原生时代&am…