k8s中的endpoint

news/2024/11/20 23:36:51/

全栈工程师开发手册 (作者:栾鹏)
架构系列文章


service selector

service通过selector和pod建立关联。

k8s会根据service关联到pod的podIP信息组合成一个endpoint。

若service定义中没有selector字段,service被创建时,endpoint controller不会自动创建endpoint。

service负载分发策略

service 负载分发策略有两种:

RoundRobin:轮询模式,即轮询将请求转发到后端的各个pod上(默认模式);SessionAffinity:基于客户端IP地址进行会话保持的模式,第一次客户端访问后端某个pod,之后的请求都转发到这个pod上。

k8s服务发现方式

DNS:可以通过cluster add-on的方式轻松的创建KubeDNS来对集群内的Service进行服务发现————这也是k8s官方强烈推荐的方式。为了让Pod中的容器可以使用kube-dns来解析域名,k8s会修改容器的/etc/resolv.conf配置。

k8s服务发现原理

endpoint

endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址。

service配置selector,endpoint controller才会自动创建对应的endpoint对象;否则,不会生成endpoint对象.

例如,k8s集群中创建一个名为k8s-classic-1113-d3的service,就会生成一个同名的endpoint对象,如下图所示。其中ENDPOINTS就是service关联的pod的ip地址和端口。

在这里插入图片描述

endpoint controller

endpoint controller是k8s集群控制器的其中一个组件,其功能如下:

负责生成和维护所有endpoint对象的控制器

负责监听service和对应pod的变化

监听到service被删除,则删除和该service同名的endpoint对象

监听到新的service被创建,则根据新建service信息获取相关pod列表,然后创建对应endpoint对象

监听到service被更新,则根据更新后的service信息获取相关pod列表,然后更新对应endpoint对象

监听到pod事件,则更新对应的service的endpoint对象,将podIp记录到endpoint中

负载均衡

kube-proxy

kube-proxy负责service的实现,即实现了k8s内部从pod到service和外部从node port到service的访问。

kube-proxy采用iptables的方式配置负载均衡,基于iptables的kube-proxy的主要职责包括两大块:一块是侦听service更新事件,并更新service相关的iptables规则,一块是侦听endpoint更新事件,更新endpoint相关的iptables规则(如 KUBE-SVC-链中的规则),然后将包请求转入endpoint对应的Pod。如果某个service尚没有Pod创建,那么针对此service的请求将会被drop掉。

kube-proxy的架构如下:

在这里插入图片描述

kube-proxy iptables

kube-proxy监听service和endpoint的变化(service创建删除和修改, pod的扩张与缩小),将需要新增的规则添加到iptables中。

kube-proxy只是作为controller,而不是server,真正服务的是内核的netfilter,体现在用户态则是iptables。

kube-proxy的iptables方式也支持RoundRobin(默认模式)和SessionAffinity负载分发策略。

kubernetes只操作了filter和nat表。

Filter:在该表中,一个基本原则是只过滤数据包而不修改他们。filter table的优势是小而快,可以hook到input,output和forward。这意味着针对任何给定的数据包,只有可能有一个地方可以过滤它。

NAT:此表的主要作用是在PREROUTING和POSTROUNTING的钩子中,修改目标地址和原地址。与filter表稍有不同的是,该表中只有新连接的第一个包会被修改,修改的结果会自动apply到同一连接的后续包中。

kube-proxy对iptables的链进行了扩充,自定义了KUBE-SERVICES,KUBE-NODEPORTS,KUBE-POSTROUTING,KUBE-MARK-MASQ和KUBE-MARK-DROP五个链,并主要通过为KUBE-SERVICES chain增加rule来配制traffic routing 规则。我们可以看下自定义的这几个链的作用:

KUBE-MARK-DROP - [0:0] 对于未能匹配到跳转规则的traffic set mark 0x8000,有此标记的数据包会在filter表drop掉

KUBE-MARK-MASQ - [0:0] 对于符合条件的包 set mark 0x4000, 有此标记的数据包会在KUBE-POSTROUTING chain中统一做MASQUERADE

KUBE-NODEPORTS - [0:0] 针对通过nodeport访问的package做的操作

KUBE-POSTROUTING - [0:0]KUBE-SERVICES - [0:0] 操作跳转规则的主要chain

同时,kube-proxy也为默认的prerouting、output和postrouting chain增加规则,使得数据包可以跳转至k8s自定义的chain,规则如下:

 -A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES-A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES-A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING 

如果service类型为nodePort,(从LB转发至node的数据包均属此类)那么将KUBE-NODEPORTS链中每个目的地址是NODE节点端口的数据包导入这个“KUBE-SVC-”链:

-A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS-A KUBE-NODEPORTS -p tcp -m comment --comment "default/es1:http" -m tcp --dport 32135 -j KUBE-MARK-MASQ-A KUBE-NODEPORTS -p tcp -m comment --comment "default/es1:http" -m tcp --dport 32135 -j KUBE-SVC-LAS23QA33HXV7KBL 

Iptables chain支持嵌套并因为依据不同的匹配条件可支持多种分支,比较难用标准的流程图来体现调用关系,建单抽象为下图:

在这里插入图片描述

举个例子,在k8s集群中创建了一个名为my-service的服务,其中:

service vip:10.11.97.177

对应的后端两副本pod ip:10.244.1.10、10.244.2.10

容器端口为:80

服务端口为:80

则kube-proxy为该service生成的iptables规则主要有以下几条:

 -A KUBE-SERVICES -d 10.11.97.177/32 -p tcp -m comment --comment "default/my-service: cluster IP" -m tcp --dport 80 -j KUBE-SVC-BEPXDJBUHFCSYIC3-A KUBE-SVC-BEPXDJBUHFCSYIC3 -m comment --comment “default/my-service:” -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-U4UWLP4OR3LOJBXU  //50%的概率轮询后端pod-A KUBE-SVC-BEPXDJBUHFCSYIC3 -m comment --comment "default/my-service:" -j KUBE-SEP-QHRWSLKOO5YUPI7O-A KUBE-SEP-U4UWLP4OR3LOJBXU -s 10.244.1.10/32 -m comment --comment "default/my-service:" -j KUBE-MARK-MASQ-A KUBE-SEP-U4UWLP4OR3LOJBXU -p tcp -m comment --comment "default/my-service:" -m tcp -j DNAT --to-destination 10.244.1.10:80-A KUBE-SEP-QHRWSLKOO5YUPI7O -s 10.244.2.10/32 -m comment --comment "default/my-service:" -j KUBE-MARK-MASQ-A KUBE-SEP-QHRWSLKOO5YUPI7O -p tcp -m comment --comment "default/my-service:" -m tcp -j DNAT --to-destination 10.244.2.10:80 

kube-proxy通过循环的方式创建后端endpoint的转发,概率是通过probability后的1.0/float64(n-i)计算出来的,譬如有两个的场景,那么将会是一个0.5和1也就是第一个是50%概率第二个是100%概率,如果是三个的话类似,33%、50%、100%。


http://www.ppmy.cn/news/491200.html

相关文章

Kubernetes k8s理论篇

目录 一、k8s概述 1.1 什么是k8s? 1.1.1 作用 1.1.2 由来 1.1.3 含义 1.2 为什么需要K8S K8S的目标是让部署容器化应用简单高效。 1.3 k8s的特性 二、Kubernetes集群架构与组件 2.1Master组件 2.1.1 Kube-apiserver 2.1.2 Kube-controller-manager 2.…

matlab实现S函数的五种方式

Matlab允许你使用以下五种方式之一来实现S函数:A Level-1 M-file S-function provides a simple M interface to interact with a small portion of the S-function API. Level-2 M-file S-functions supersede Level-1 M-file S-functions.Level 1 M文件S函数----这种方式提供…

k8s入门:部署应用到 k8s 集群

系列文章 第一章:✨ k8s入门:裸机部署 k8s 集群 第二章:✨ k8s入门:部署应用到 k8s 集群 第三章:✨ k8s入门:service 简单使用 第四章:✨ k8s入门:StatefulSet 简单使用 第五章&…

python s append_Python语句序列s=[1,2,3,4];s.append([5,6]);print(len(s))的运行结果是______。...

【单选题】Python语句序列“a=(1,2,3,None,(),[]);print(len(a))”的运行结果是()。 (2.0分) 【填空题】Python语句序列"s=[1,2,3,4];s.append([5,6]);print(len(s))"的运行结果是______。 (1.0分) 【判断题】判断正误 MOV [1200H], [SI] 【填空题】Python表达式10+5…

计算机b s架构模式图,深入理解B/S架构

最近看招聘信息很多都要求理解B/S架构,自己面试时也被问到过这个问题,查找了一些资料,整理出这篇博客。 一: B/S的概念 B/S(Brower/Server,浏览器/服务器)模式又称B/S结构,是Web兴起后的一种网络结构模式。 浏览器是客户端最主要的应用软件,客户机上只需要安装一个浏览器…

sprintf_s的用法探究

这个函数定义如下 int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format [,argument] ... ); 参数说明是这样的,第一个参数buffer是输出存储位置,第二个参数sizeOfBuffer是最大允许的字符数。 下面通过代码简单探究一下这个函数的应用…

S形曲线速度规划--5段式

为了减小机器人加速过程的冲击,这里梳理一下S形加减速相关知识。1. S加减速曲线 计算公式: 加加速度j ( t ) { J 0 ≤ t ≤ t 1 − J t 1 ≤ t ≤ t 2 0 t 2 ≤ t ≤ t 3 − J t 3 ≤ t ≤ t 4 J t 4 ≤ t ≤ t 5 j(t)\begin{cases} J & 0\leq t \l…

K8s端口映射

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 1、nodePort 外部流量访问K8s集群中Service入口的一种方式(另一种方式是LoadBalancer&a…