k8s初面考点ReplicaSet副本集极限9连击你懂了吗?

k8s考点灵魂拷问9连击

考点之简单描述一下k8s副本集ReplicaSet有什么作用?
考点之为什么ReplicaSet将取代ReplicationController控制器?
考点之编写 ReplicaSet 的 spec 有什么需要注意的点?
考点之k8s集群中创建非模板 Pod 为什么可能会被副本集自动收纳?
考点之线上预警k8s集群循环创建、删除Pod副本,一直无法稳定指定目标副本数量?

如果排除了是Pod内部发生了故障,从RS角度你猜测可能是什么原因?
考点之标签Pod和可识别标签副本集ReplicaSet 先后创建顺序不同,会造成什么影响?
考点之生产环境想要对某个Pod排错、数据恢复、故障复盘有什么办法?
考点之缩放 RepliaSet 有哪些算法策略?
考点之如何去影响淘汰策略,设置单独偏好?

囧么肥事-胡说八道

考点之k8s副本集ReplicaSet有什么作用?

ReplicaSet的主要作用是控制副本数量的,这里的每一个副本就是一个PodReplicaSet它是用来确保我们有指定数量的Pod副本正在运行的Kubernetes控制器,这里为了方便后面统一把ReplicaSet简称 RS。

进一步说什么是控制副本数量?

RS确保Pod以你指定的副本数运行,即如果有容器异常退出,会自动创建新的 Pod 来替代,而异常多出来的容器也会自动回收。

假设k8s集群中,你想要运行10个Pod,如果这时候有4个Pod发生故障,异常退出,那么RS会自动创建新的4个Pod来替代发生故障的4个Pod。

RS尽力保证系统当前正在运行的Pod等于期望状态里指定的Pod数目。

你想要10个,那么RS就尽可能保证在任何时候都给你提供10个,没有就创建,多了就删除。

总之,ReplicaSet 尽可能确保任何时间都有指定数量的 Pod 副本在运行。

考点之为什么ReplicaSet将取代ReplicationController控制器?

ReplicationController控制器(简称为RC)。

在之前旧版本的k8s中,使用的是RC控制器实现了k8s集群的高可用性,它跟现在的RS控制器作用类似,作用是,确保Pod以指定的副本数运行。

ReplicaSet继承了RC的功能,并实现了扩展,主要突出扩展是更强大的标签选择能力 ,即selector。

进一步说什么是标签选择能力?

ReplicaSet会通过标签选择器(Label-Selector)管理所有被打上与选择器匹配的标签的容器。

下面通过一段拟人对白,来理解什么是标签选择:

RS说:”嘿嘿,我要管理被打上 A,AA,AAA标签的Pod,都不许跑,听我指挥,排队站好,立正,向前看!“

Pod-001说:”我被打上了BBB标签,我才不归你管呢!“

Pod-002说:”我被打上了AA标签,快来接管我吧,我准备好了“

Pod-003说:”呜呜,我想独立,我不想被RS管,我要做一个自由自在的孩子,但是不幸的是,我被打上了A标签,RS给我管的紧紧的,我失去了自由,我好可怜呀“

ReplicationController自己也有标签选择能力,但是它只能选择包含某个标签的匹配Pod;

ReplicaSet的选择器在基础上增加了允许匹配缺少某个标签的pod,或包含特定标签名的Pod;

举个例子

两组Pod,env标签分别是productiondevel

Pod-A env=production

Pod-B env=devel

RC 只能匹配其中的Pod-A或者Pod-B中的一个;

RS 则可以同时可以匹配并将它们视为一个大组,无论标签env的值具体是什么(env=*),都可以标签名来进行匹配;

考点之编写 ReplicaSet 的 spec 有什么需要注意的点?

类似其他Kubernetes API 对象,RS也需要指定 apiVersionkind、和 metadata 字段。

  1. 对于 ReplicaSets 而言,其 kind 始终是 ReplicaSet。
  2. ReplicaSet 对象的名称必须是合法的 DNS 子域名
  3. 属性.spec.template 是一个Pod 模版, 要求设置标签,注意不要将标签与其他控制器的标签选择器重叠
  4. 属性.spec.template.spec.restartPolicy 指定模板的重启策略 ,允许的取值是 Always
  5. 属性.spec.selector 字段是一个标签选择器 用来筛选匹配标签的Pod归属
  6. 在 ReplicaSet 中,.spec.template.metadata.labels 的值必须与 spec.selector 值 相匹配,否则该配置会被 API 拒绝。

考点之k8s集群中创建非模板 Pod 为什么可能会被副本集自动收纳?

前面提到了,RS采用了最新的标签选择能力,通过指定.spec.selector标签选择器,不仅可根据标签值,甚至连标签名一致都可以进行匹配。

首先如果采用Pod模板创建Pod,会被指定标签,RS会根据标签自动接管Pod

再来看看非模板

非模板创建,其实就是直接创建裸的 Pods。

为什么可能会被副本集RS自动接管?

除非在创建裸Pod的时候,你确保这些裸的 Pods 并不包含可能与你的某个 ReplicaSet 的.spec.selector相匹配的标签。

在创建裸Pods前,必须完全排除跟任何RS有可能相同的标签,否则,RS认为你创建的Pod 就是要指定给自己接管的。

考点之线上预警k8s集群循环创建、删除Pod副本,一直无法稳定指定目标副本数量,排除了是Pod内部发生了故障,从RS角度你猜测可能是什么原因?

首先理解一下问题,循环创建Pod副本?

RS一直在正常工作,维持Pod副本数量,缺少就创建,多了就删除。问题来了,一直创建,然后又删除,却不能稳定Pod副本数量?

看下这个循环过程

RS指定Pod副本数量10个

当前副本7个
RS检测不够10个
RS开启平衡机制,创建2个维持稳定 再检测发现 15个
RS开启平衡机制,删除5个维持稳定 再检测发现13个
RS开启平衡机制,删除3个维持稳定 再检测发现9个
RS开启平衡机制,增加1个维持稳定 再检测发现10个
无需稳定 再检测发现8个...
再检测发现18个...

总之,RS检测副本数量,不是比10个多,就是比10少,一直难以维持10个有效副本

既然排除了是Pod内部故障问题,那么从RS角度进行可能分析,可以初步判定是多个RS标签选择器规则重复导致的。

分析初步判定原因

ReplicaSet会通过标签选择器(Label-Selector)管理所有带有与选择器匹配的标签的容器。

创建Pod时,它会认为所有Pod 是一样的,是无状态的,所以在创建顺序上不会有先后之分。

使用相同的标签选择器创建多个ReplicaSet,则多个RS无法识别哪个Pod是自己创建的,都会认为是归属于自己管理的Pod。

例如

第一个 RS-A,指定副本数量 10
标签选择器可以匹配 env=xxx RS-A生成10个Pod标签为 env=xxx
一组Pod:
Pod-1(env=xxx)
Pod-2(env=xxx)
Pod-3(env=xxx)
...
...
Pod-10(env=xxx) 这时候创建了一个RS-B 第二个 RS-B,指定副本数量 25
标签选择器和 RS-A 相同
标签选择器可以匹配 env=xxx 因为选择器匹配一样
RS-B 匹配到了RS-A创建的10个Pod
RS-B 发现Pod-x(env=xxx)数量不够25 RS-B 继续创建额外的10个 Pod-11(env=xxx)
Pod-12(env=xxx)
Pod-13(env=xxx)
...
... 此时RS-A 发现自己匹配的Pod > 10
它认为是自己创建多了
启动平衡机制 删除超过 10 个的额外Pod
删除 Pod-Xi(env=xxx) 而RS-B 发现自己匹配的Pod < 25
就启动平衡机制
创建 Pod-Xi(env=xxx) 就这样
一个不停的创建
一个不停的删除 最终总是无法满足稳定数量的 10 和 25

双方的当前状态始终不等于期望状态,这就会引发问题,因此确保ReplicaSet标签选择器的唯一性这一点很重要。


本期暂时讨论上述5点,下期完成下面4点

考点之标签Pod和可识别标签副本集ReplicaSet 先后创建顺序不同,会造成什么影响?
考点之生产环境想要对某个Pod排错、数据恢复、故障复盘有什么办法?
考点之缩放 RepliaSet 有哪些算法策略?
考点之如何去影响淘汰策略,设置单独偏好?

k8s初面考点ReplicaSet副本集极限9连击你懂了吗?的更多相关文章

  1. k8s之statefulSet-有状态应用副本集控制器

    1.概述 无状态应用更关注群体,任何一个成员都可以被取代,有状态应用关注的是个体.用deployment控制器管理的nginx.myapp等都属于无状态应用,像mysql.redis.zookeepe ...

  2. spring配置mongodb连接副本集多个节点

    mongodb版本3.4.x 1.配置副本集 先配置副本集,可参考我之前写的文章:http://blog.csdn.net/fuck487/article/details/78287362 注意:必须 ...

  3. MongoDB 副本集的原理、搭建、应用

    概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...

  4. MongoDB副本集的原理,搭建

    介绍: mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉.主服务器负责整个副本集的读写,副本集定期同步数据备份,一旦主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应 ...

  5. MongoDB学习笔记——Replica Set副本集

    副本集 可以将MongoDB中的副本集看作一组服务器集群由一个主节点和多个副本节点等组成,相对于之前讲到的主从复制提供了故障自动转移的功能 副本集实现数据同步的方式依赖于local数据库中的oplog ...

  6. 修改mongodb3.0副本集用户密码遇到的坑

    最近公司对项目安全方面的问题很是重视,进行了多次各种安全漏洞的扫描,于是乎就扫到了mongodb弱口令的问题. 在项目部署初期,因为大家对这个都不是特别重视,大概是因为觉得反正是内网项目吧,所以mon ...

  7. mongo(五)副本集

    mongo(五)副本集 配置文件 1-3为三个存储节点,其实一个为Primary,两个secondary作为备份,4为仲裁节点 # mongod.conf #where to log logpath= ...

  8. Mongodb3.0.5副本集搭建及spring和java连接副本集配置

    这是去年写的一篇文档,最近突然发现并没有发不出来,因此现在补上,希望能对某些朋友有所帮助.因为当时记录时没有截图,因此这里看起来可能就比较单调. 一.基本环境: mongdb3.0.5数据库 spri ...

  9. Mongodb4.0副本集构建

    目前最新的mongodb4.0.2已经支持事务这个重要特性,需要使用的话必须是复制或副本集,这是第一篇先研发如何构建副本集,因为副本集是目前最低成本的高可用群集方式. 1.准备三台服务器,本次使用是的 ...

随机推荐

  1. rocketmq实现延迟队列精确到秒级实现(总结编)

    前言篇: 为了节约成本,决定通过自研来改造rocketmq,添加任意时间延迟的延时队列,开源版本的rocketmq只有支持18个等级的延迟时间, 其实对于大部分的功能是够用了的,但是以前的项目,全部都 ...

  2. Java构造器(构造方法)

    类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的,并且构造器有以下两个特点: 1.必须和类名字相同 2.必须没有返回类型也不能写void public class Demo06 { //一 ...

  3. 毫米转像素dpi

    public static double MillimeterToPixel_X(double length) //length是毫米,1厘米=10毫米 { System.Windows.Forms. ...

  4. 【失败的经验】在linux下编译opencv for android

    cd /home/ahfu#选择opencv 3.4.6版本来编译wget https://github.com/opencv/opencv/archive/3.4.6.tar.gztar -zxvf ...

  5. Qt之QFontDialog

    widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> class Widget : public QWidget { ...

  6. atan2(y,x)和pow(x,y)

    atan2(y,x): 函数atan2(y, x)是4象限反正切,求的是y/x的反正切,其返回值为[-π,+π]之间的一个数.它的取值不仅取决于正切值y/x,还取决于点 (x, y) 落入哪个象限: ...

  7. 查看Linux系统信息

    1.查看内核 [root@localhost etc]# uname -aLinux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue No ...

  8. python 小兵(6)函数进阶

    阅读目录 函数参数-动态参数 名称空间 函数的嵌套 gloabal.nonlocal 回到顶部 函数参数-动态参数 之前我们说过传参,如果我们在传参数的时候不很清楚有哪些的时候,或者说给一个函数传了很 ...

  9. Charles和mitmproxy代理设置

    1.Charles安装: 1. windows 安装证书 2. 3. 4. 5   pc端设置: Android 手机上设置代理: 先查看pc 端的ip: 2.模拟器进入wifi,按住wifi 3. ...

  10. eureka 集群的实现方式?

    注意,本文还是对上一篇博客的延续,需要的配置,在前面的博客里面可以找到. eureka集群版 (正宗的eureka!) 2.1.配置eureka的集群之前首先先配置HOSTNAME和IP的映射 具体的 ...