重绘Kubernetes Operator的工作原理图
在以Kubernetes为事实标准的云原生环境中Kubernetes Operator是强有力的工具籍此Kubernetes集群得以充分扩展功能。为详述技术细节以加深理解特重绘与Kubernetes Operator核心技术相关的两张工作原理图。与常见的原理图相比在本文中呈现的两图更富技术细节技术过程的展现更为精确。基于此两图本文简述了Operator、Controller和Custom Resources自定义资源的协同工作机制。一、Kubernetes Operator的工作原理Kubernetes为集群管理提供了一个强大的API包括用于部署应用程序的Pod、Jobs和Deployments。然而在许多情况下标准API是不够的还需要额外的抽象级别及增强的功能。通过在Kubernetes中定义和管理应用程序和服务作为独立的自定义资源Kubernetes Operator模式解决了这一问题这也是有助于实现可重用性和降低整体复杂性的技术机制。Operator模式的实现是由特定于域的控制器实现的这些控制器监控Custom Resources自定义资源的生命周期。这种控制器不断地将当前状态与环境所期望之状态进行比对和同步以便对Kuberfnetes集群进行必要的更改。这一技术概念被称为Control Loop控制循环或Reconciliation Loop调谐循环为便于有效地叙述本文使用更为中文化的名称控制回路。Kubernetes项目对“Operator”的定义很简单“Operator 是使用自定义资源来管理应用程序及其组件的软件扩展software extensions”。换句话说使用 Operator 使我们能够将应用程序视为单个对象该对象仅公开对应用程序有意义的调整而不是一组原语primitives例如 Pod、Deployments、Services 或 ConfigMaps。此外对于运行在Kubernetes集群中的软件Operator允许自动执行典型的Day-1任务(安装、配置等)和Day-2任务(重新配置、升级、备份、故障转移、恢复等)并与Kubernetes概念和APIs进行原生集成。这些应用工具被称为“原生Kubernetes应用程序”而这一定义也可以从另一个更具操作性的角度去理解Kubernetes Operator 是用于在 Kubernetes 上打包、管理和部署应用程序的控制器。为了完成这些工作用户建立和更新自定义资源 (Custom Resources)形成自定义资源定义 (Custom Resource Definitions )的形式落实在Kubernetes Operator中并在环境中生效以此定义对特定应用程序的配置和状态configuration and state的期望。简言之Kubernetes Operator的作用是致力于将应用程序的实际状态与CRD所期望的状态进行协调使用控制回路对应用程序进行自动扩展、更新或重新启动。为此Kubernetes 提供了基本命令和原语primitivesOperator可用之以定义更复杂的操作。综上所述Operator是在集群中运行的实际程序通过Kubernetes API进行交互以此对超出Kubernetes自身掌控之原生功能范畴的复杂功能进行自动化。二、用Kubernetes Operators实现状态调整在机器人和自动化的应用中控制回路是指一个永不休止的循环用于调节系统状态。这一含义被映射到 Kubernetes 中每个控制器是一个控制回路通过 API 服务器监视集群的共享状态 并尝试进行更改以将当前状态转为期望状态。实际上Kubernetes在其核心API中就使用了这种控制回路模式Kubernetes控制器管理器Kube-controller-manager是一个守护进程内嵌Kubernetes的核心控制回路。与Kubernetes一样应用架构的实践者希望可以定义Custom Resources编写特定的控制器以理解声明性的自定义资源执行技术调整达成期望状态Kubernetes Operator正践行了这一理念。在Kubernetes中Control plane控制平面中的控制器运行在一个控制回路Control loop)中该回路持续不断地比对集群的期望状态和当前状态。如果状态不相匹配则控制器采取行动调整当前状态使其更接近于期望状态。类似地隶属于Kubernetes Operator的控制器监视Watches相关的Custom Resources自定义资源类型并采取特定于应用程序的操作使工作负载Workload的当前状态与用户在Custom Resources自定义资源中表达的期望状态相匹配。以上图表说明了Control plane如何在一个回路中运行各个控制器其中一些控制器天然内置于Kubernetes中如deployment controller和job controller而另一些则是属于Kubernetes Operator的一部分如Custom controller 1属于Memcached Operator而Custom controller 2则属于etcd Operator。Control plane的控制器针对无状态Stateless工作负载Workloads进行了优化一组控制器即可适用于所有的无状态工作负载因为它们都是相似的。隶属于某个Kubernetes Operator的控制器都是为特定的有状态Stateful工作负载而定制的。每个有状态的工作负载都有各自的Operator及其隶属控制器这些控制器知晓如何管理该工作负载。