Kubernetes Operator基础入门

本文转自Rancher Labs

你是否曾经想过SRE团队是如何有效地成功管理复杂的应用?在Kubernetes生态系统中,Kubernetes Operator可以给你答案。在本文中,我们将Q j ~ x研究Operator是什么以及它们如何工作。

Kubernetes Operator这一k P B H a v v r i概念是由CoreOS的工程师于2016年提出的,这是一种原生的方式@ 8 J 2来构建和驱动Kubernetes集群上的每一个应用,它需要特定领域的知识。它提供了一种一致的方法,通过与Kubernetes API的紧密合作,自动处理所有应用操作D ( r _ = c ? T过程,而不需要任何人工干预。换句话说- 5 =,Operator是一种包装、运行和管理Kubernetes应用的方式。

Kubernetes Operator模式遵循Kubernetes的核心原则之一:控制理论(control thei Z + # 9ory)。在机器人和自动化领域,它是一种持续运行动态系统的机制。它依赖于一种快速调整工作负载需求的能力,进而能够尽可能准确地适应` h V q S ] d现有资源。其目标是开发一个Q } * : g r具有必要逻辑的控制模型,以帮助应用程序或系统保持稳定。在Kubernetes世界中,这部分由contk w nroller处理。

在循环中,Controller是个特殊的软件,它可以对集群的变化做出响应,并执行适应动作。第一个Kubernetes controller是一个kube-controller-manager。它被认为是所有Operator的前身,Operator是后来建立的。

什么是Controller Loop?

简单来说,Con, g ( D )troller Loop是Controller动作的基础。想象一下,有一个非终止的进程G L S ! ,(在Kubernetes中称为和解循环)在不断地发生,如下图所示:

Kubernetes Operator基础入门

这个过程至少观察一个Kubernetes对象| b s R,该对象包含有关所需状态的信息。比如:

  • Deployment

  • Services

  • Secrets

  • Ingress

  • Config Maps

这些对象由JSY @ ` /ON或YAML中的manifest组成的配置文件定义。然后 ! j o v R 5 8 Zcontroller根据内置逻辑,通过Kubernetes API进行H 9 6 g S : g持续调整,模仿所需状态,直到当前状态o , Y / r 2变成所需状态。

通过这种方式,Kubernetes通过处理不断的更改来处理Cloud Native系统的动态性质。为达到预期状态而执行的修改实例包Q z Z h P I括:

  • 注意到节点宕机时,要求更换新的节点。

  • 检查是否需要复制pods。

  • 如果需要,创建一个新的负载均衡器。

    Kubernetes Operator如何工作?

Operator是一个特定应用程序的controllh q x h ker,它扩展了一个Kubernetes API,替代运维工程师或SRE工程师来创建、配置和管理复杂的应用程序。在Kubernetes官` - } { N 6方文档中对此有g O _ d以下描述:

Operator是Kubernetes的软件拓展,它利用自定义资源来管理应用程序及其组件。Operator遵循Kubernetes的原则,尤其遵循control loop。

到目前为止,你已经了解Operator会利用观察Kubernetes对象的controller。这些controller有点不同,因为它们正在追踪自定义对象,通常称为自定义资源(CR)。CR是Kuber@ I 9 8 t S K , :netes API的扩展,它提供了一个可以存F 7 O 7 U 7 | n储和检索结构化数据的q E E d t _ ( g 6地方——你的应用程序的期望状态。整个操作原理如下图所示:

Kubernetes Operator基础入门

Operator会持续跟踪与特定类型的自定义资源相关的集群事件。可以跟踪的关于这些自定义资源的事件类型有:

  • Add

  • Update

  • Delete

当Operator接收任何信息时,它将采取行动将Kubernetes集群或外部系统调整到所需的a ( b N B n Ma , Y T +态,作为其在自定义contJ q _ ~ = 0 ]roller中的和解循环(reconciliation loop)的一部分。

如何添加一个自定义资源

自定义资源通过添加对你的应用有帮助的新型对象来扩展Kubernetes功能。Kubernj S 2etes提供了两种向集群添加自定义资源的z 3 T : f方法:

通过API Aggregation添1 I w o J Q加,这是一种高级方Z 6 H * U f P法,需要你建立自己的API服务器,但你有更多的控制权限。

通过自定义资源定义(CRD)添加,一种不需要复杂; O Z + e 6 S f编程知识就可以创建的简单方式,作为Kubernetes API服务器的扩展。

这两种方案满足了不同用户的需求,他们可以在灵活性和易用性之间进行选择。Kubernetes社区对两者进行了比较,将帮助你决定哪种方法适合你,但目前最受欢迎的选项是CRD

https://kubernetes.io/docs/con7 c O Q S d = k mcepts/extend-kubernetes/api-extension/custom-resources/#choosing-a-method-for-adding-custom-resources

自定义资源定义(CRD

自定义资` 0 0 u }源定义(CRD)的出现已经有一段时间了,第一个主要的API规范是与Kubernetes 1.16.0一起发布的。下面的manifest介绍了一个例子:

apiVersion: apiextensions.k8s.io/v1beta1
kind: Custo4 o * S g * ]mResourceDw - ^ D 6efinitiot 6 _ ~ E `n
metadata:
name: app8 ) / V . , D t ?lication.stable.example.com
spec:
group: stable.example.com
version: v1
scope: Namespaced
names:
ple T q mural: application
singular: applications
kN k l 1 p .ind: Application
shortN_ 9 p ] R Rames:P A $ - S
- app 

这个CRD可以让你创建一个名为9 a Q _ ? }“Application”的CR(我们将会在下一个部分使用它)2 8 l。前两行定义了apiVersion和你要创建的对象种类。

Metadata描述了资源名称,但这里最重要的部分是“sp& o h P !ec”字段。它让你可以指定组、版本以及可见性范围——命名空间或集群范围。

然后,你可以用多种格式定义名称,并创建一个方便的缩写,让你执行命令kubectl get az X [ q p Q hpp来获取现有的CRb Z L 2

自定义资源

以上CRD可以让你创建以下自定义资源的manifest。~ [ r % u q p % a

apiVersion: stable.example.com/v1
kind: Application
metadata:
name: app@ v & R  ( Q . #lication-config
spec:
image: container-registry-image:v1.0.0
domain: teamx.yoursaas.io
plan: premium

如你所d _ c Z @ R x见,在这里包含了运行特定情况下的j 8 e 8 ` u ! c应用程序所需的所有必要信息。这个自定义资源将被我们的Operator观察到——准5 ) z Q . u q X C确地说,G 1 + t y o是被Operator的自定义controller观察到。根据controller中的内置逻辑,将模仿所需的状态。它可以为我们的应用程序创建部署、服务和必要的ConfigMaps。运行它,并在特定的域上通o D - 7 ; 8 d % b过 ingress 暴露它。这只是一个 p o [ 0 6 o简单的用例,但你可以根据自己的需求对它进行任何设计。

Operator还可以配置在o F C % [ % -Kubernetes之外的资源。你可以l M o在不离开Kuber& ` G `netes平2 M P B台的情况下控制外部G e [ z b H 1路由器的配置或在云中创建数据库。

Kubernetes Operators:案例研究

为了对Kubernetes Operator有一个整t z f r C体清晰的认识,我们来看看Prometheus Operator,它是最早也是最流行的Operator之一。它简化了Prometheus、Alertmanager以及相关监控组件的部署和配置。

Prometheus/ ; c Operator的核] y g U ; R ] { !心功能是监控Kubernetes API服务器上指定对象的变化,) ? 7 / |并确保当前的Prometheus部署与这些对象相匹配~ y + u m . 5 a b。Operator作用于以下自定义资源定义(CRD):

  • Prometheus:定义了所需PromethH { Ieus部署

  • Alertmanager:定义了所需的Alertmanager部署

  • ServiceMonitor:它声明性地指定c N h ; A u了应该如何监控KuberneteV } us服务的组。Operator会根据API服务器中对象的当前状态自动生成Prometheus scrape配置。

  • PodMonitor:声明性地指定了应如何监控一组 pod。Operator 会根据 API 服务器中对J V I K * ; Z象的当前状态自动生成 Prometheus scrape 配置。

  • PrometheusRule:定义了一组所需的 Prometheus 告警和/或记录规则。Operator会生成一个规则文件,可f O 8 S % y . (供 PrometZ I Y ~heus 实例使用。

Prometheus OperaQ c Otor会自动检测Kubernetes API服务器中对上述任何对象的更改,并确保匹配的部署和配置保持同步。