专栏首页云原生实验室理解 Kubernetes 对象存储和控制器的工作原理

理解 Kubernetes 对象存储和控制器的工作原理

Kubernetes 是一个用于在一组节点(通常称之为集群)上托管容器化应用程序的容器编排引擎。本系列教程旨在通过系统建模的方法帮助大家更好地理解 Kubernetes 及其基本概念。

本文可以帮助你理解 Kubernetes 对象存储和控制器的工作原理。

Kubernetes 是一个声明式容器编排引擎。在声明式系统中,你可以声明期望的状态,系统将不断地调整实际状态,直到与期望状态保持一致。因此,“声明式系统”这个术语表示一组经过精确计算的相互协调的操作,用来将系统的当前状态调整为期望状态。但实际上 Kubernetes 并不是这么工作的!

Kubernetes 不会基于系统当前状态和期望状态来来确定接下来要执行的一组经过精确计算的相互协调的命令,而是仅基于系统当前状态确定下一个要执行的命令,然后不断迭代,直到没有下一个命令可以执行,系统就达到了稳定状态。

1. 状态转换机制


下面我将用一个抽象模型来表示 Kubernetes 的状态转换机制。

给定一个函数 NextCommand,用来表示下一个要执行的命令,系统会基于当前状态 k8s 来决定下一个要执行的命令,该命令会将系统从当前状态 k8s 转换成下一个状态 k8s'

NextCommand 函数事实上是每个 Kubernetes 控制器的 NextCommand 函数的集合。

所有的状态组成一个状态序列,状态序列的终止状态是 k8s.last,该状态的 NextCommand 函数不会产生下一个命令,此时系统就会进入稳定(steady)状态。

2. Kubernetes 资源对象


Kubernetes 对象存储表示持久化的 Kubernetes 资源对象集合。Kubernetes 的资源对象实际上是不同类型的数据记录,通常用 kind 来表示类型。

上述 manifest 内容描述了一个 Deployment 对象:

  • .kind 等于 Deployment
  • .spec.replicas 等于 3.
  • .spec.template.spec.containers[0].image 等于 BusyBox

3. Kubernetes 控制器


每一个控制器都是 NextCommand 函数的组成部分,控制器实际上是根据 Kubernetes 当前状态确定下一个要执行命令的一个连续的过程。

上述 Alloy 规范语言描述了 Deployment 控制器的实现原理:控制器对所有的 Deployment 对象进行监控,并为每个对象执行一组条件语句:

  • 条件: 如果匹配的 ReplicaSet 对象少于 1 个。 命令: 控制器就会生成 Create ReplicaSet 命令。
  • 条件: 如果匹配的 ReplicaSet 对象多于 1 个。 命令: 控制器就会生成 Delete ReplicaSet 命令。

从控制器的视角来看,如果任何一个条件语句的条件都不满足,Deployment 对象就会进入稳定状态,控制器也不会执行任何命令。

级联命令

Kubernetes 的控制器可以相互级联启用,他们是层层控制的关系:

  • 给定一个当前状态 k8s,如果启用了控制器 CC 会执行命令将状态转换为 k8s'
  • 给定一个当前状态 k8s',如果启用了控制器 C'C' 会执行命令将状态转换为 k8s''

上图展示了用户将 Deployment 对象提交给 API Server 之后生成的级联命令。

4. Kubernetes 是声明式系统吗?


上述规范语言描述了严格意义上的声明式系统的状态转换机制:给定一个期望状态,系统将找到一系列命令让自己从当前状态 sys.first 转换为期望状态 sys.last

如果我们不把 Kubernetes 的资源对象看成对实际描述的数据的记录,而是看成对最终期望的结果的记录,就可以认为 Kubernetes 是一个声明式系统。例如,我们可以将前文提到的 Deployment 对象解释为:最终期望的结果是存在 3 个 Pod 对象。

这种理解方式的可取之处在于:如果你将一个资源对象看成对最终期望的结果的记录,你就会对接下来要执行的操作有多种选择。例如,一个 Deployment 对象可以被看成:

  • 一个 ReplicaSet
  • 一组 Pod

按照这种理解方式,只有当存在一个 ReplicaSet 和与此相关联的一组 Pod时,才会被认为满足期望状态。

如果按照严格意义的声明式系统的理解方式:

  • 只要有一个 ReplicaSet 对象,k8s 的 Deployment 对象就会进入稳定状态(Deployment 控制器不会产生命令)。
  • 只要有一组 Pod 对象,k8s 的 ReplicaSet 对象就会进入稳定状态(ReplicaSet 控制器不会产生命令)。

5. 总结


在大多数情况下,如果定义不是很严格,Kubernetes 可以被看成声明式系统,Kubernetes 资源对象被当成对最终期望的结果的记录。但当涉及到 Kubernetes 的行为时,你要知道它并不会像真正意义上的声明式系统那样通过一系列相互协作的命令来过渡到理想状态,而是通过持续迭代方式一步一步过渡到稳定状态。

6. 后记


本系列文章是 CNCF,Google 和 SAP 之间合作努力的结果,旨在促进大家对 Kubernetes 及其基本概念的理解。

本文分享自微信公众号 - 云原生实验室(cloud_native_yang),作者:杨传胜

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 云原生周报第 1 期 | 2019-06-24~2019-06-28

    云原生不但可以很好的支持互联网应用,也在深刻影响着新的计算架构、新的智能数据应用。以容器、服务网格、微服务、Serverless 为代表的云原生技术,带来一种全...

    米开朗基杨
  • Kubernetes 设计与开发原则

    Kubernetes 正迅速成为在分布式系统中部署工作负载的事实标准。在这篇文章中,我将通过揭示其底层的设计原则,帮助您更深入地了解 Kubernetes。

    米开朗基杨
  • 浅析 Kubernetes 控制器的工作原理

    Kubernetes 中运行了一系列控制器来确保集群的当前状态与期望状态保持一致,它们就是 Kubernetes 的大脑。例如,ReplicaSet 控制器负责...

    米开朗基杨
  • SpringCloud笔记-Eureka(二)

    eureka是Netflix的子模块,也是一个核心的模块,eureka中有两个组件,一个是EurekaServer(一个独立的项目),这个是用于定位服务以及实现...

    DH镔
  • 对 COM 组件的调用返回了错误 HRESULT E_FAIL。

    win7系统,用c#调用Interop.SHDocVw.dll时,报了个对“ COM 组件的调用返回了错误 HRESULT E_FAIL”的错误。网上...

    明年我18
  • 最新Android手机导出ANR、tombstones文件 - 无惧Permission denied

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    望天
  • Java数据结构和算法(六)——前缀、中缀、后缀表达式

      前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆...

    IT可乐
  • JavaScript立即执行函数的解释分析(1)—表达式与语句的区别

    也许你知道,这是立即执行函数,但为什么这样能立即执行呢?也许是该好好聊聊了!但是,我们先来聊点其他的。

    FEWY
  • Discuz!X3.1QQ互联Unknown column 'conuintoken' in 'field list'的解决办法

    汐楓
  • Vue 的几种数据类型处理方式

    在table的tr中,有些做为父级,有些做为子级,区别是用class来区分,点击父级的按钮,子级会隐藏和显示切换。

    tianyawhl

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动