操作器是打包、部署和管理 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 指标和调和器等功能,可持续监控资源的理想状态。