TKE集群节点max-pod是如何配置的

使用tke集群部署服务的时候,经常会遇到一种情况,就是pod一种pending无法成功调度到节点上,查看事件提示报错

0/9 nodes are available: 1 node(s) didn't match Pod's node affinity, 8 Too many pods.

从日志看,是1个节点没满足节点亲和性,还有8个节点pod太多,这个pod太多是什么原因呢?

其实tke集群的每个节点我们都会设置一下最大可容纳的pod数量,一般都是在kubelet的启动配置/etc/kubernetes/kubelet文件中通过MAX_PODS来进行定义的,一般会同步到节点的yaml的status.allocatable.pods字段,当节点的pod数量达到max_pods的值时候,这个时候再往节点调度pod就会失败,提示Too many pods。

那么节点的最大运行pod数量到底是如何定义的呢?下面我们来说说tke不同网络模式下节点新加入tke集群的max_pods是如何进行设置的。

1. GlobalRouter模式节点最大pod数设置

GlobalRouter 网络模式是容器服务 TKE 基于底层私有网络 VPC 的全局路由能力,实现了容器网络和 VPC 互访的路由策略,GlobalRouter模式集群创建的时候就会对节点的pod数量上限进行设置,因为需要根据网络配置给节点分配容器cidr。

因此GlobalRouter的kubelet配置的max_pods就是单个节点的容器cidr ip数量,然后再减去3个,这里为什么要减去3个呢? 因为有三个地址不能分配分别是:网络号、广播地址和网关地址,因此 Node 最大的 Pod 数目 = cidr - 3。

比如你创建集群单节点设置的最大pod数量是32,那么实际上节点最多可以容纳29个pod,当第30个pod想继续运行到节点就会报错node Too many pods。

很多人这里就有个疑问了,如果我节点资源还充足,我想继续往上面调度pod,是不是可以修改节点的kubelet参数就行了呢?其实理论上这样是可行的,这样节点确实可以调度更多的pod,但是这样会存在一些问题。

如果你将值改太大,会导致后续有pod分配不到ip,因为一个节点可用的pod ip是固定的cidr - 3,但是pod的调度只会去看节点的max-pods是不是满了,并不会判断容器网段ip是不是不足,因此可能节点的容器网段ip用完了,pod还是会往节点调度,导致pod无法分配ip。

还需要注意的是max-pod是包含节点hostnetwork模式pod,hostnetwork模式pod不会占用容器网段ip,但是会算在max-pod的数量里面,那么这里就有另外一个问题了,节点虽然有cird - 3 和容器ip可以给pod使用,但是实际是调度不了那么多GlobalRouter模式pod到节点的,因为每个节点会有一些hostnetwork模式的pod,会占用一些pod数量,因此实际可分配给GlobalRouter模式pod的数量就会比cidr - 3少。这里其实可以适当的给kubelet的pod数量增加一些,用来容纳hostnetwork模式pod,这里每个节点的容器网段ip就能充分利用了。

2. vpc-cni模式节点最大pod数设置

上面说了GlobalRouter模式的max-pod是如何设置的,下面我们来说说vpc-cni模式下是如何设置的,GlobalRouter因为会给每个节点分配容器网段,max-pod是根据容器网段cidr来设置,但是vpc-cni模式下容器网段就是vpc子网,pod ip是从子网获取,那每个节点的max-pods是如何设置呢?

vpc-cni这里的模式比较复杂,vpc-cni模式下会有个最大的eni ip数量限制,这个是根据机型配置来的,并且也支持在创建集群的时候设置单节点的max-pod,默认是设置的64,。vpc-cni模式这里定义节点的max-pods会根据对比机型的eni ip数量限制和创建集群设置的pod上限值大小,取2者中的较大的设置为节点的max-pods。

那么节点的eni数量限制怎么来的呢?vpc-cni是利用弹性网卡的能力,因此这里的限制也是根据弹性网卡限制来的,具体可以参考文档 https://cloud.tencent.com/document/product/576/18527

其实在tke控制台选择节点也是有提示的

那么这些数量是如何来的呢?这里简要说下,每种机型都有2个限制,一个是弹性网卡数量限制,还有就是弹性网卡内网ip数量限制。 这里定义下弹性网卡限制为eni_num,弹性网卡内网ip数量为eni_ip_num

因为弹性网卡数量配额会包含主网卡,这里给容器使用的弹性网卡数量需要在eni_num-1 弹性网卡内网ip包含网卡的主ip,主ip是无法给容器使用的,因此给容器使用的ip为eni_ip_num-1 那么最终某种机型可以用的eni ip是(eni_num-1) * (eni_ip_num-1)

这里拿标准型 S5的1核机型为例

最终计算的eni数量为(2 - 1)*(6 - 1)=5,也就是说1C的S5机型加入tke集群,机型的eni数量限制是5个。 如果是标准型 S5的8核机型,那么eni数量是(6 - 1)*(20 - 1)=95,也就是说8C的S5机型加入tke集群,机型的eni数量限制是95个。

如果创建集群默认设置的node节点pod上限是64,这里在加入集群时候会计算出机型的eni数量去和64比较,取较大的作为节点max-pods。

也就是说1C的S5机型加入tke集群,节点的max-pod值设置的是61,这里后端设计遵循了GlobalRouter逻辑还是会减去3个ip,因此是61。

8C的S5机型加入tke集群,节点的max-pod值设置的是95。

当然vpc-cni也是可以手动设置节点的max-pods,修改节点/etc/kubernetes/kubelet文件中MAX_PODS配置,但是这里改大会存在一个问题,就是节点的eni ip最大数量是有限制的,如果你将非hostnetwork模式pod调度到节点,会出现分配不到eni-ip的情况,只有hostnetwork模式pod才能正常调度到节点。

原文地址:https://cloud.tencent.com/developer/article/2057170

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340