k8s service的底层实现

news2024/11/24 16:46:15

承接上文同一个node中pod之间如何通信?

当前的集群中给2个apache pod注册了一个service,这个地址是10.152.183.151,

在ubuntu的pod中测试这个ip是可以通信的,it work来源于本机的pod,多访问几次发现会随机的把请求定向到本机的pod或者远端的pod。

当前节点上所有pod、网桥、flannel都是10.1.62这个网段,

10.211.55.12是对外的ip地址,

当前node上是没有这个service的10.152.183这个网段的,

这个ip地址也是ping不通的,

查看apiserver的配置信息,发现配置的这个网段和apache service ip的网段是同一个,这个网段包括ip都是由k8s虚拟的进行控制,这个ip不是实际存在的。

k8s通过iptables实现service,iptables分为表和列,表代表可以完成特定功能的一组步骤,列是每个步骤;

为了实现service,k8s用到了iptables中的nat表和filter表,基本上都是nat表在工作,

图中橘黄色是和nat表相关的步骤,首先外部报文请求进来之后,如果访问本机进程,会先走PREROUTING步骤,它属于nat表 ,它来决定需不需要做DNAT(NAT是网络地址转换,D是目标),即要不要做目标地址转换,这个地方可以自行决定,如果转换了之后,不在本机的话,可以直接走FORWARD这个步骤,然后到nat的POSTROUTING就直接出去了;如果和当前的进程相关,就会进入filter表的INPUT这个步骤,当本机的进程有报文输出的话,会先走nat这张表的OUTPUT步骤,在这个步骤中可能再去做一个DNAT来决定这个报文的目的地址是原封不动的还是要做一些改动,然后再经过filter的OUTPUT链再走POSTROUTING就出去了,在POSTROUTING的时候还可以做一个SNAT(源网络地址的NAT),决定这个报文出去的ip地址是不是需要变化,源网络地址就是别人可以看到的这个地址,表示报文从哪里来的。

上图中有2个地方可以做DNAT,有一个地方可以做SNAT。

当在curl这个service的时候,这个service有一个ip地址,

151这个ip地址实际上是不存在的,当pod使用curl访问这个ip地址的时候,

它就会到OUTPUT这个地方来,OUTPUT这个地方,k8s在iptables里面插入了一些指令,当它发现是指向某一个service的时候,通过DNAT去把这个报文的目标ip转换成实际提供这个服务的pod ip,然后再把这个报文路由出去;同理当从外部访问某一个service的时候,它也通过第一个DNAT(图中左上角的那个),把service这个不存在的ip替换掉,替换成一个具体的pod的ip,然后再经过路由,路由到相应的pod上,要么是本地要么是别的机器,再来去回应这个service的请求。

看下curl经历的过程

在pod中的本地进程curl对应着图中的这一链路,

看下nat这张表的OUTPUT这个链,在OUTPUT链中有2个target,和service最相关的就是kube-service,

kube-service也是一个链(步骤),这个是OUTPUT链的下一步,也就是说k8s会在iptables插入新的链来解决这个问题,在OUTPUT这个标准的步骤中,所有的源和目的地址都会进入这个步骤,

这个是k8s插入的新的链(新的步骤), 查看这个链的内容,

都跟service相关,

筛选和apache service相关的,

创建的这个apache service其实就是k8s在kube-service这个链中插入了2条与apache service相关的信息,这两条又是新的链,其中KUBE-MARK-MASQ的主要作用是给ip的这个报文加个标记,加标记之后,未来会在PREROUTING做snat用。

KUBE-SVCxxxx的内容是2个KUBE-SEPxxxx,SEP就是service endpoint,有50%的概率走第一个endpoint,

另外50%走第二个endpoint,

查看这个SEP,发现有一个IP地址10.1.62.174,这个endpoint做了一个dnat,也就是说它在报文当中把apache的service ip改掉了,本来是service目标ip地址改成了实际的pod的ip地址10.1.62.174;

另外的一个endpoint也是一个dnat,也是将apache service的ip改成了10.1.71.22即另外一个pod的ip;

通过iptables里的这个kube-service的规则的路由概率,把访问apache service的ip包,平均的分发到了2个不同的pod上,

pod用了flannel的地址空间,就会通过flannel的网络设备,如果需要的话,就会转发到另外的node上,从而就路由到了最终的pod上。

这个其实就是做了一个mark,打了一个16进制的标签,这个标签会在POSTROUTING步骤中做一个snat

看下nat表的POSTROUTING,

这里有一个KUBE-POSTROUTING,这也是k8s自己插入的,如果没有打那个16进制的标签,就走这个

,否则就走这个

MASQUERADE是一个snat,只不过它是动态的基于当前使用的是哪个网络接口对外分发的报文,就把这个报文的源地址改成网络设备的地址。

为什么要做这个事情?

因为在这个ubuntu的pod中,curl这个apache的service的时候,这个service的目标地址通过刚才的介绍已经被修改了,但它的源地址依然是这个pod ip的地址,

实际上这个源地址是通过eth虚拟网络设备分配的,这个地址在k8s集群中是不可见的,在pod中可见,所以就需要把这个报文的源地址改成在集群中可见的地址,比如说出口网络设备的地址;

filter和service的流程是类似的,当然k8s的service还有loadbalancer、nodeport机制,k8s都是通过在iptables中动态的插入规则来实现的。

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

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

相关文章

远程控制详细教程,同时支持手机控制

​“我需要一些帮助,目前我因为休假旅游去了,需要临时远程办公。我工作的电脑运行的是Windows 10系统,我如何操作才能远程控制公司的电脑进行远程办公?我之前没用过远程控制相关的工具,什么简单的方法可以远程控制另一…

别只会搜日志了,求你懂点检索原理吧

别只会搜日志了,求你懂点检索原理吧 本篇主要内容如下: 前言 项目中我们总是用 Kibana 界面来搜索测试或生产环境下的日志,来看下有没有异常信息。Kibana 就是 我们常说的 ELK 中的 K。 Kibana 界面如下图所示: 但这些日志检索…

内网渗透(五十一)之域控安全和跨域攻击-跨域攻击介绍

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

软件测试面试题 —— 整理与解析(1)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:🌎【Austin_zhai】🌏 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能&#xf…

数据库浅谈之向量化

数据库浅谈之向量化 HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是数据库浅谈系列,收录在专栏 DATABASE 中 😜😜😜 本系列阿呆将记录一些数据库领域相关的知识 &#x1f3…

Zabbix“专家坐诊”第182期问答汇总

问题一: Q:像烽火、浪潮这种没有ilo的设备怎么监控他们的硬件状态呢? A:如果没有ilo,可以使用其他硬件监控软件,例如HP Insight Manager、IBM Director、Dell OpenManage等。这些软件可以帮助您监控硬件状…

[神经网络]基干网络之ResNet、MobileNet

一、ResNet ①特点 ResNet的深度远比之前的算法深,且不会出现网络退化问题。 Ps.网络退化:网络深度增加反而不如原来的网络。(网络退化 ! 过拟合/梯度消失) ②残差块 残差块采用短路连接(Shortcut Connection) / 跳跃连接,拟合的目标由直接最…

2023年2月初某企业网络工程师面试题【建议收藏】

拓扑图如下,主机A与主机B能互相通信,但是A不能ping通RA的F0接口,这是为什么?RA上f0接口上配置了ACL,禁止源ip为主机A,目的ip为RA f0的数据包的发送; 第一个路由器上只有到主机B网段的路由&#…

MFCCA多通道多说话人语音识别模型上线魔搭(ModelScope)

实验室研发的基于多帧跨通道注意力机制(MFCCA)的多说话人语音识别模型近日上线魔搭(ModelScope)社区,该模型在AliMeeting会议数据集上获得当前最优性能。欢迎大家下载。开发者可以基于此模型进一步利用ModelScope的微调…

【Python】文本转语音库pyttsx3

一、语音输出 1、安装文本转换语音库pyttsx3 安装指令: pip install pyttsx3 2、导入pyttsx3库后,调用speak函数即可进行语音播放。 import pyttsx3 #语音播放 pyttsx3.speak("How are you?") pyttsx3.speak("I am fine, thank yo…

成都欢蓬电商:抖音直播卖药灰度测试通告

据报道,近日有MCN机构透露,目前抖音直播卖药为“测试项目,谨慎试跑中”; “仍处于灰度测试,至于测试多久,抖音官方确实没有答复,需要看第一阶段数据,然后定夺,预计4月份会纳入更多机…

第八章《嵌入式系统原理与实践》--沈建华 王慈 清华大学出版社 课后部分习题个人答案

第八章 1,2,3,4,6,7,9,12 1 什么是串行通信、并行通信? 按一次传输数据位个数区分 串行通信并行通信是数据是一位一位地由端口发送或接收数据的各个数据位(一般为 8 位…

「TCG 规范解读」初识 TPM 2.0 库续二

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

手写一个文件上传demo

背景 最近闲来无事,同事闻了一下上传文件的基本操作,如何用文件流来实现一个文件的上传功能 基本概念 流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。可以按照数据传输的方向,将流可分为输入流和输出…

Vue3:有关v-model的用法

目录 前言: 回忆基本的原生用法: 原生input的封装: 自定义v-model参数: 对el-input的二次封装: 多个v-model进行绑定: v-model修饰符: v-model自定义参数与自定义修饰符的结合: 前言&am…

Java 网络编程 Ⅰ

目录基础知识IP 和 Portinternet(互联网)Java UDP 编程UDP(User Datagram Protocol):无连接无状态的数据报通讯协议实现Java TCP 编程TCP(Transmission Control Protocol):面向连接的…

XSS注入进阶练习篇(三) XSS原型链污染

XSS原型链污染1.原型链的概念1.1 构造函数的缺点1.2 prototype 属性的作用1.3 原型链1.4 constructor属性1.5 prototype和__proto__2. 原型链污染2.1 原型链污染是什么?2.2 原型链污染的条件2.3 原型连污染实例2.3.1 hackit 20182.3.2 challenge-04223.总结1.原型链…

Java跳槽涨薪之路-想学Java的赶紧上车了

前言Java 是近 10 年来计算机软件发展过程中的传奇,在很多开发者心中的地位可谓“爱不释手”,与其他一些计算机语言随着时间的流逝影响也逐渐减弱不同,Java 随着时间的推移反而变得更加强大。按应用范围,Java 可分为 3 个体系&…

【Unity3D】空间和变换

1 空间 1.1 左右手坐标系及其法则 1.1.1 左右手坐标系 左手坐标系与右手坐标系Unity 局部空间、世界空间、裁剪空间、屏幕空间都采用左手坐标系,只有观察空间采用右手坐标系。 左右手坐标系除了坐标系朝向(旋向性)不同,还存在以…

顶象APP加固的“蜜罐”技术有什么作用

目录 蜜罐有很多应用模式 蜜罐技术让App加固攻守兼备 顶象端加固的三大功能 为了捕获猎物,猎人会在设置鲜活的诱饵。被诱惑的猎物去吃诱饵时,就会坠入猎人布置好的陷阱,然后被猎人擒获,这是狩猎中常用的一种手段。在业务安全防…