【Kubernetes】虚拟 IP 与 Service 的代理模式

server/2024/9/24 5:24:21/

由于 Service 的默认发布类型是 ClusterlP,因此也可以把 ClusterIP 地址叫作 虚拟 IP 地址。在 Kubernetes 创建 Service 时,每个节点上运行的 kube-proxy 会自动为 Service 分配一个虚拟 IP 地址,即通过 转发代理 kube-proxy 来实现 路由转发功能kube-proxy 在具体实现 流量代理转发负载均衡 时,有 3 3 3 种模式:

Cluster IP 地址是一个虚拟的 IP 地址,它是 Kubermetes 集群拥有的独立网络空间。它具有以下 3 3 3 个特征:

  • 1️⃣ Cluster IP 地址仅作用于 Kubernetes 的 Service 对象,并由 Kubernetes 进行管理和分配。
  • 2️⃣ Cluster IP 地址无法被直接访问,也没有实体的网络元素与其对应。
  • 3️⃣ 不同 Service 中的 Pod 在集群内部可以通过 Cluster IP 地址进行相互访问。

1.userspace 代理模式

userspace 代理模式下,访问 Service 的请求首先访问 Node 节点的 iptable 表,再回到 Kubernetes 的命名空间中被 kube-proxy 转发到后端的 Pod 中。在默认情况下,userspace 代理模式下的 kube-proxy 通过轮询算法选择后端的 Pod。

在这里插入图片描述

🚀 userspace 代理模式最大的问题是:请求会存在一次状态转换过程(即从 Node 节点的命名空间到 Kubermetes 命名空间的转换),从而有性能上的损耗。

iptables__17">2.iptables 代理模式

iptables 代理模式是目前 Service 实现代理的默认方式。iptables 代理模式是通过 添加或移除 iptable 表中的路由规则 ,从而实现路由转发功能。在这种模式下,kube-proxy 会通过 API Server 监听集群中 Service 对象和 Endpoint 对象的创建和删除,从而创建 iptable 表中的规则,以实现将访问 Service 的请求重定向到后端的一组 Pod 中。

iptables 代理模式的工作机制如下图所示。iptables 代理模式的默认重定向策略会使用随机选择一个后端的 Pod。Kubernetes 也允许用户将 .service.spec.sessionAffinity 字段的值设置为 ClientIP,以实现基于客户端会话的 IP 地址亲和性的重定向策略。

在这里插入图片描述
由于在 iptables 中记录了路由的规则,因此 iptables 代理模式会占用较少的系统资源。当 kube-proxy 运行在 iptables 代理模式下且与后端的 Pod 连接失败时,它会自动对后端的其他 Pod 进行连接重试。

接下来以一个示例来验证 iptables 代理模式

使用 Deployment 控制器来部署应用,创建文件 service-demo1.yaml,并在其中输入以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx name: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresent

创建 Service:编辑文件 service-demo2.yaml,在其中输入以下内容。

apiVersion: v1
kind: Service
metadata:name: service-demo2namespace: default
spec:# 这里使用 NodePort 类型的 Service 将应用程序暴露给外部type: NodePort ports:- name: httpport: 80protocol: TCPtargetPort: 80# 定义标签选择器,将服务 Service 与匹配便签的一组 Pod 关联起来selector:     app: nginx

执行以下语句创建 Deployment 和 Service

kubectl apply -f service-demo1.yaml
kubectl apply -f service-demo2.yaml

查看 Service 的信息。

kubectl get svc

输出的信息如下:

在这里插入图片描述

查看节点的 iptable 表中的路由规则。

iptables-save | grep 10.107.186.32

输出的 iptable 表中的路由规则信息如下:

在这里插入图片描述

删除 Service

kubectl delete -f service-demo2.yaml

重新查看节点的 iptable 表中的路由规则。

iptables-save | grep 10.107.186.32

这时在 iptable 表中没有任何路由信息了。

在这里插入图片描述

iplables 代理模式尽管使用简单,占用的资源也较少。但它却有以下的不足:

  • ⭕ 当存在大量的 Service 时,需要在 iptable 表中创建大量的路由规则,从而难以维护。
  • ⭕ 在 iplable 表中进行路由规则匹配时,可能会造成转发的延时。

这时可以将 kube-proxy 运行在 IPVS 代理模式下。

IPVS__118">3.IPVS 代理模式

iptables 代理模式一样,IPVS 代理模式通过 API Server 监听集群中 Service 对象和 Endpoint 对象的创建和删除,从而创建 IPVS 路由转发规则,并定期与 Service 对象和 Endpoint 对象同步 IPVS 路由转发规则,以达到路由转发的目的。请求在访问 Service 时,会被重定向到后端的一个 Pod 中。

IPVS 代理模式的工作机制如下图所示。
在这里插入图片描述

以下步骤将在 Kubernetes 集群中使用 ServiceIPVS 代理模式

在所有节点上安装 IPVS 模块。

apt install ipvsadm

在这里插入图片描述

让所有节点启用 IPVS 模块。

创建一个配置文件 /etc/sysconfig/modules/ipvs.modules,并写入以下内容。

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

然后,将配置文件设置为可执行,并运行它,以加载所需的内核模块:

chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules

最后,您可以使用以下命令检查加载的内核模块:

lsmod | grep -e ip_vs -e nf_conntrack

在这里插入图片描述

修改 kube-proxy 的配置文件。

kubectl edit configmap kube-proxy -n kube-system

mode 字段改为以下形式(默认 mode: "" 为空,使用 iptables)。

mode: "ipvs"

在这里插入图片描述

重启 kube-proxy

kubectl get pod -n kube-system --show-labels | grep kube-proxy

在这里插入图片描述

kubectl delete pod -n kube-system -l k8s-app=kube-proxy

在这里插入图片描述

编辑 service-ipvs.yaml 文件创建 Service 和 Deployment。

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx name: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:name: service-ipvsnamespace: default
spec:ports:- name: httpport: 80protocol: TCPtargetPort: 80selector:     app: nginx

执行 kubectl apply -f 命令。

kubectl apply -f service-ipvs.yaml

查看 Pod 和 Service 的信息。

kubectl get pod,svc -o wide

输出的信息如下:

在这里插入图片描述

查看 IPVS 路由转发规则。

ipvsadm -Ln

输出的信息如下:

在这里插入图片描述


http://www.ppmy.cn/server/101811.html

相关文章

在Linux上搭建的Samba服务器无法写入文件

在Linux上搭建的Samba服务器无法写入文件,这通常是由于权限问题、Samba配置不当或其他网络问题引起的。以下是一些可能的解决方案,您可以按照这些步骤进行排查: 检查Samba配置文件: 打开Samba配置文件,通常是/etc/sam…

Kali Linux 命令大全

一、引言 Kali Linux 作为一款专为渗透测试和安全研究设计的操作系统,拥有丰富的命令行工具,熟练掌握这些命令对于高效地进行安全测试和分析至关重要。本文将为您详细介绍 Kali Linux 中常用的命令,涵盖系统信息获取、文件操作、网络分析、用…

音频去噪:使用Python和FFT增强音质

根据定义,声音去噪是从音频信号中去除不需要的噪音或干扰,以提高其质量和清晰度的过程。这涉及识别和隔离噪音成分(通常以不规则或高频元素为特征),并将其过滤掉,同时保持原始声音的完整性。 声音去噪目标是改善聆听体验以及音频分析和处理的准确性。过滤掉噪音对于高保真音频…

JQ8900-16P与stm32最小板连线图

JQ8900-16P与stm32最小板连线图 B战演示连线视频 接线图和原理讲解_哔哩哔哩_bilibili 原理图 jq8900实物对照: 面包板实物链接图:

08 STM32 DMA

DMA 协助CPU,完成数据转运工作。 两个程序: DMA数据转运,DMAAD多通道 DMA数据转运,将使用DMA,进行存储器到存储器的数据转运,也就是把一个数组里面的数据,复制到另一个数组里。 定义一个数组D…

大数据开发工程师面试整理-什么是大数据?

大数据是指无法通过传统的数据处理工具或方法来捕捉、管理和处理的海量数据集。通常,大数据具有以下几个关键特征,常被称为大数据的“5V”特性: 1. Volume(数据量): ● 大数据的最明显特征是其数据量非常大,通常以TB(TeraBytes,兆兆字节)甚至PB(PetaBytes,千万亿字…

Docker:宿主机可以ping通外网,docker容器内无法ping通外网之解决方法

问题描述 1、宿主机可以ping外网,docker容器内无法ping外网 ping www.baidu.com 提示:unknown host baidu.com 2、宿主机可以wget下载,docker容器内无法wget下载 wget www.baidu.com 提示:unknown host baidu.com 解决方法 1、…

Springboot实现doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频在线预览功能,你学“废”了吗?

最近工作中,客户需要生成包含动态内容的word/pdf报告,并且需要在线预览。 刚开始使用后台直接生成word文档,返回文件流给前端,浏览器预览会发生格式错乱问题,特别是文档中的图片有些还不显示。 想到最简单的办法就是…