谷歌大神详解 Kubernetes 配置管理最佳方法
Kubernetes Concepts1、Kubernetes 中的概念我们先来说一下 Kubernetes 中几个重要的概念:第一个要说也是最重要的就是 Declarative,Declarative 的意思是申明的、陈述的,与之相反的是 Imperative,Imperative 意思是命令式的。首先说一下 Kubernetes 设计完全是按照 Declarative 设计的。但为了初学者的学习方便,也是支持 Imperative。Declarative 对 Kubernetes 的功能非常重要,比如说它的自育性、自治能力都完全是依赖于 Declarative。第二个概念是 Level-triggered,Edge-triggered 。第三个概念是异步的。这些概念在后面会详细的介绍。 2、Declarative 与 Imperrative 的对比首先看一下 Declarative 和 Imperative 的区别和对比。Declarative 的定义是用户设定期望的状态,系统会知道它需要执行什么操作,来达到期望的状态。比如说我们看下面的例子。用户期望的状态是三个,系统观察到的状态是两个。于是系统就会知道创建一个新的来达到最终状态是三个。而对于 Imperative,需要用户告诉系统需要做什么。比如说用户说创建一个新的 Container,系统才会创建一个新的 Container。 3、Spec 与 Status 的对比大部分的 Kubernetes API 都有 Spec 和 Status 两个 Field。Spec 是让用户写入期望的状态,系统可以通过 Spec 读出用户的期望。Status 是系统写入观察到的状态,用户可以从中读出系统当前是什么状态。 4、Reconcile这两个 Field 对于 Reconciliation Loop 是非常重要的,接下来看一下什么叫 Reconcile? Reconcile 中文意思是 “调和”,“和解” 的意思,简单的说就是它不断使系统当的状态,向用户期望的状态移动。比如说右边的例子,用户期望的 Replica 是三个,Controller 通过 Watch 发现期望的状态是 3 个,但实际观测到的 Replica 的是 2 个,所以它就会 Create 一个新的 Pod。然后 Controller 会继续 Watch 这些 Pod,当它发现 Create 完成了,就会更新 Status 到 3 个,使 Status 和 Spec 达到一致的状态。 5、Level-triggered 与 Edge-triggered 的对比接下来再来说一下 Level–triggered 和 Edge-triggered 的区别。首先说一下 Kubernetes 是 Level-triggered。先看一下右边的例子。最上面是用户期望的状态变化。中间的是某一个 Edge-triggered Controller 的变化。最下面是 Level-triggered 的 Controller 的状态。在第二条虚线这个时刻,用户希望更新应用的版本,从 V1 到 V2,然而在第一条虚线和第三条虚线中间,我们的 Controller 死了。 对于 Edge-triggered 的 Controller 就会错过这个用户的更新请求,状态就没有变化。对于我们的 Level-triggered 的 Controller 就会在重新启动的时候发现用户的请求变化,就会更新版本到 V2。在这个时候用户想 Scale 他的应用的 Replica 到 3 个,这时候我们可以看到 Edge-triggered 的 Controller 就会直接 Scale V1,最终达到一个错误的状态。Level-triggered 的 Controller 就会最终达到正确的状态。 Kubelet CommandsKubectl 的 Commands 可以被分为三类:Imperative Commands、Imperative Object Configuration 和 Declarative Object Configuration。 1、Imperative Commands第一类是叫做 Imperative Commands。Imperative 的 Commands 主要就是通过命令行的 Flag 直接进行 Imperative 的操作,Create 或者是 delete 之类的。例子是 Kubectl run, Expose,或者是 Create deployment,它就会把底层对于对象配置的操作对用户隐藏了起来。 接下来我们再来看一下它们优缺点的对比。Edge-triggered 的 Controller 优点就是直接、简单,易于实现。缺点就是如果错过了一个 Edge,可能就会导致一个最终的错误的状态。Level-triggered Controller 的优点就是不用担心这个,Edge-triggered Controller 另外一个缺点是不会采用直接的路径达到当前的状态,比如说当前的版本是 V1,用户想要更新到 V2,紧接着用户发现了什么问题,马上想更新到 V3。对一个 Edge-triggered 的 Controller 就会完成 V2 的更新,然后再去更新 V3。而如果对一个 Level-triggered 的 Controller 会在接收到 V3 的更新请求的时候直接开始更新,而不会等完成 V2 再更新 V3。
2、Imperative Object Configuration第二类要说的是 Imperative 对象配置,Object configuration 的意思是一个对象可以被定义为 yaml 或者 json 的格式存储在文件中,我们叫它 Object Configuration。Imperative Object Configuration 是直接对 Object Configuration 进行 Imperative 的操作,比如说 Kubectl create, Replace,Delete。 然后说一下第一类和第二类的对比。第一种 Imperative 的 Commands 优点是简单直接易学易记,缺点是没有办法使用 Change review,就是先更改再去批准流程,而且没有办法使用 Audittrails。Audit trails 的意思就是审计追踪又可以叫做 Audit log,它会记录系统的各种变化。第三个缺点是没法提供一个模板。相对于 Imperative Commands, Imperative Object Configuration 的优点是可以进行版本控制,比如说可以用 Git,也可以用 Change review 这个流程,也可以用 Autid trails,它的确定就是需要用户对于对象的 Schema 有一个基本的理解,另一个缺点就是需要用户写 yaml 文件。 3、Declarative Object Configration第三类是 Kubectl 的 Commands 是 Declarative 的对象配置。它也是直接对 Object Configuration 进行操作的。用户不需要指定要 Create,Update 还是Delete,Commands 直接会帮你决定谁用哪一种。例子就是 ubectl apply –prune-f。 接下来对比第二类和第三类的区别。Imperative Object Configuration 对于 Declarative 的优点就是简单一些,稍微易理解一些。但它的缺点就是对于一个目录的配置文件只能选择同一种操作。它的第二个缺点就是其他用户的更新,必须被反应在配置文件中,不然其他用户的更新就会在下一次的更新中被丢掉。 接下来说一下 Declarative Object Configuration的优点。它的优点就是其他用户的更新可以被保留下来,比如说我的 Autoscaler 帮你管理的 Replica 这个 Field,你管理其他的 Field,你们之间就不会有冲突。第二个优点是对同一个目录下的对象可以有不同的操作,可以是 Create、Patch、Delete,缺点就是这个行为稍微难理解一些,需要时间来学习。
更多内容 https://www.kubernetes.org.cn/3031.html
|