也许,这样理解K8s的Pod自动化扩缩容机制更容易

本文尝试以通俗的方式向读者介绍K8s的Pod的自动化横向扩缩容的领域模型。其实是以领域驱动设计(DDD)的思考方式来学习一项技术。希望能对读者帮助。

问题是什么

当要理解一个解决方案时,我们从问题域开始理解,会更容易。

比如存在一个场景:基于Pod的CPU使用率进行自动化扩容。当一个Pod的CPU使用率大于60%,并持续15秒时,我们就希望Pod的数量从10个扩到13个。

要实现这个场景,我们推断K8s应该存在一种机制方便我们实现这个场景。这种机制就是HPA(Horizontal Pod Autoscaler)。

换位思考一下,如果你是HPA机制的使用者,你会如何使用HPA呢?

你可能会配置如下:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

(如果看不懂,也没有关系,你只需要知道,你可以通过代码来定义HPA的行为)

作为用户,你只需要通过YAML文件定义清楚你的期望就可以了。至于如何实现,是由HPA机制的实现者实现的。

就好比司机开车过程中是不需要考虑动力系统是由电机实现的,还是由柴油引擎实现的。这就是“接口是用户的”的含义了。当然,作为汽车的设计者,你就必须考虑动力系统的设计与实现。

同样的,作为K8s的设计者,就必须考虑HPA机制的设计与实现。

当用户通过kubectl apply -f hpa.yaml命令部署HPA到K8s中时,我们的K8s该做什么呢?它需要考虑以下问题:

  1. 我该如何拿到用户Pod的某一个指标的值呢?
  2. 多久拿一次指标呢?
  3. 当这个指标不是CPU,内存等资源指标,而是应用本身的自定义指标呢?如果指标数据甚至不在K8s内部呢?
  4. Pod本来已经是由控制器控制的了,我们是该控制控制器去完成工作,还是直接控制Pod去完成?
  5. 当用户需要根据多个指标的值共同决定扩容时,我们该如何权衡其中的策略?
  6. 如果Pod中有多个容器,如何根据其中一个容器的指标进行扩容?
  7. 以上说的都是扩容,如何缩容呢?
  8. 缩容太快了,怎么办?即如何保证缩容时的稳定性?

笔者对以上相对口语的表述进行抽象。当我们作为K8s的HPA的设计者与实现者时,我们需要考虑以下问题:

  1. 指标来源问题;
  2. 指标的数量问题:即不仅只支持针对一个指标的扩缩容;
  3. 指标类型支持问题:资源指标、自定义指标、外部指标;
  4. Pod扩缩的控制器实现;
  5. 自定义Pod扩缩行为:扩容行为应该可以由用户自定义。

接下来我们分别看下K8s是如何解决以上问题的。

指标来源与指标类型

HPA控制器会从Metrics API中获取指标。而Metrics API根据不同的指标类型去不同的Metrics API的实现中去获取指标。

Untitled.png

Metrics API支持三类指标:

  • 资源指标:CPU和内存的使用率指标,由Metrics Server提供。Metrics Server需要单独安装;
  • 自定义指标:比如应用的连接数大小。最终由你的Custom Metrics API的实现者提供;
  • 外部自定义指标:与K8s 对象无关的自定义指标。

自定义指标与外部自定义指标的区别是该自定义指标是否来自于与应用同处于同一个K8s集群。

虽然定义是这样,这个界线也可以被打破,如下图:

Untitled 1.png

Pod扩缩的控制器实现及自定义Pod扩缩行为

当HPA拿到指标后,在哪里,又该如何实现对Pod的数量的控制呢?

既然Pod已经存在Deployment 及其 Replicate Controller了,没有必要再重新设计一个新的控制器,在现有的控制器之上进行操作即可。

这部分逻辑是HPA的核心逻辑。具体实现在kube-controller-manager。网络上已经有很多源码分析。此处不再赘述。

Untitled 2.png

小结

本文虽说的是K8s的HPA的机制的领域模型,但是,你发现这个领域模型也适用于非K8s的部署方式。

总的来说,关于HPA你只需要记住两个问题:

  1. 指标从何而来
  2. 如何根据指标进行扩缩容

然后找到这两个问题答案。当我们想通这两个问题后,即使不在K8s中实现HPA,我们也会有思路实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341

推荐阅读更多精彩内容