操作器是打包、部署和管理 Kubernetes 应用程序的一种方法。操作器扩展了 Kubernetes 管理复杂、有状态工作负载的能力,提供了编码到自定义控制器中的操作知识。


让我们创建一个基本的操作符,它可以监控自定义资源(MyApp),并在创建或更新资源时自动执行操作。本示例演示了操作符的概念及其与 CRD 的交互。

【代码清单】

package main
import (
  "context"
  "fmt"
  "sigs.k8s.io/controller-runtime/pkg/client"
  "sigs.k8s.io/controller-runtime/pkg/manager"
  "sigs.k8s.io/controller-runtime/pkg/manager/signals"
)
type MyApp struct {
  Spec struct {
​    Config string `json:"config"`
  } `json:"spec"`
}
func main() {
  mgr, err := manager.New(manager.GetConfigOrDie(), manager.Options{})
  if err != nil {
​    fmt.Println("Error creating manager:", err)
​    return
  }
  c := mgr.GetClient()
  myApp := &MyApp{}
  key := client.ObjectKey{Name: "my-first-app", Namespace: "default"}
  err = c.Get(context.Background(), key, myApp)
  if err != nil {
​    fmt.Println("Error getting MyApp resource:", err)
​    return
  }
  fmt.Printf("Found MyApp with config: %s\n", myApp.Spec.Config)
  stop := signals.SetupSignalHandler()
  if err := mgr.Start(stop); err != nil {
​    fmt.Println("Error starting manager:", err)
  }
}
Build and deploy this operator within your Kubernetes cluster.

【执行结果】

使用 config 找到 MyApp:配置示例

Kubernetes 操作员是一种管理有状态应用程序的模式。操作员通过封装部署和管理复杂应用所需的操作知识来扩展 Kubernetes API。在代码示例中,我们有一个与 MyApp 自定义资源交互的基于 Go 的简单 Operator。操作员使用 Kubernetes 控制器运行库来管理 MyApp 资源的生命周期。当创建一个 MyApp 资源时,操作员会获取其配置并执行一个操作--在这里,它只是简单地打印配置。在生产中,操作员可能会自动配置数据库、管理应用程序集群或处理其他需要人工干预的复杂任务。

【小知识】

操作器模式由 CoreOS 于 2016 年引入。操作器可以用多种语言编写,其中 Go 语言最为常见,因为它与 Kubernetes 紧密集成。高级操作器通常包括领导者选举、Prometheus 指标和调和器等功能,可持续监控资源的理想状态。