当前位置: 首页 > 原理解释

k8s deployment工作原理-K8s 部署工作原理

k8s 的 deployment 说白了就是个“快递发货单”。当你把一堆代码扔进 pod 的时候,它是啥也没干的,就像你往刚打满气的轮胎里塞了一百块石头。
这时候,k8s 也没动作,只是默默记录着:哦,有个叫 my-app 的东西,在 pod 1 和 pod 2 里,并且它目前有 100 块石头。 你靠不住。 真正干活的是 kubelet,它是个超级严格的质检员,盯着 pod 存活倒计时。
只要工夫一到,要么检测到磁盘满了,它就得启动处理。就像过安检,要么放行,要么换个盒子装新货。
这时候,operator 要么 Reconciler 才会收到通知,启动做点实事。 要是业务逻辑复杂点,比如需求自拉起一个后端服务,那还得去调用那个外部服务的 API。好比你去买一辆法拉利,你直接给法拉利车架号(ID)就行,它会自动去 4S 店买引擎(启动后端),再去 4S 店买轮胎(启动数据库),最终装出来。
这时候,deployment 本身实际上就松了,它只管容器运行,至于那两三个外部服务如何跑,它不关心,也不负责。 这就造成了个尴尬的局面:container 在跑,但整个系统有点懵。 这时候,监控组件就登场了。它像是一个一辈子在线的点头大哥,每两秒就问你:嘿,服务端还在吗? грузы 还在吗?服务挂了没?k8s 的默认策略就是"Replica"模式,也就是副本数。
比如你设了 3 个副本,它就得去够 3 个活着的 pod。
要是其中一个挂了,它立马去把那个挂的删掉,然后找地上的两个兄弟接盘。
要么,要是它发现其中一个兄弟跑不动了,它可能会默默把那个兄弟拉下来重启,要么干脆把那个兄弟直接替换掉。 这就引出了扩容的机制。你搞个 3 副本的 pod,要是业务突然来了 10 个用户,k8s 得想办法把现有的 3 个 pod 塞进 10 个用户。它不会直接让那 3 个 pod 变 10 个,那会害得内存溢出。k8s 会先给现有的 3 个 pod 扩容,比如给每个 pod 分配 10 个内存。
要是还不够,它再启动新的 7 个 pod。
这个过程是渐进的,不会瞬间炸裂。 再说说故障恢复。假设新到 10 个用户,但你的 pod 还在用 3 个内存。k8s 的默认行为是把新到的服务先塞进那 3 个内存里,让现有的服务先跑起来。
这叫"Eviction"策略,意思是先把旧的外卖小哥踢出去,再招新的。等到新的 7 个 pod 启动完,把旧的外卖小哥调走,要么把内存加到 10 个用户身上,再踢掉旧的外卖小哥。 还有一种叫"Provisioning"策略,比较激进。它不会等旧的外卖小哥走了,直接把新到的 7 个 pod 塞进那 3 个内存里,然后踢掉旧的外卖小哥,再把内存加到 10 个用户身上。
这操作上有点紧,好办把现有的服务给气死。
故此,一般建议用 Replica 策略,让它慢慢来,给旧的外卖小哥腾点地儿。 数据层面,k8s 集群里存了个庞大的账本叫 etcd。deployment 的副本数、状态、镜像地址、配置哈希,全在这账本上。
这账本数据量庞大,一旦硬盘坏了,整个集群都得停摆。
故此,recovery 策略也得寻思这块儿。
比方说,要是硬盘出了故障,k8s 优先救活已经活着的 pod,它不介意多跑待会儿。
要是那 3 个 pod 都撑不住了,它可能会抖三抖,把其中一个 pod 重启,要么干脆删掉,重新生成一个新的镜像。 镜像镜像,这玩意儿要是更新,k8s 得知道。
要是 deployment 里的镜像变了,它得把已有的 pod 里的镜像更新掉。
要是 pod 还活着,它直接更新;要是 pod 挂了,它先把这个 pod 里的镜像重新拉一遍,再启动。 最核心的那个"Replica"策略,就是它的心脏。在这个策略下,k8s 是个自张罗集群。它不管你的代码写得有多烂,也不管你的架构有多复杂。
只要 pod 跑了,它就认。
哪怕你是用 Kubernetes 做的游戏,还是用 Kubernetes 做的物流调度,GlobalScope 不管它。它只管容器活着,容器活着,业务就活着。 这就回到了最启动的难题:你不想让业务停。你不想让服务挂。你只需求保证那 3 个副本里的 service 都能跑通。
要是其中一个挂了,系统自动切换,业务不中断。
要是所有都挂了,系统自动重启,要么把其中一个重启掉,再启动一个。整个流程就像人一样,有备份,有替补,失误了也不慌,持续干活。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站