k8s controller-runtime 介绍

发布时间: 更新时间: 总字数:3516 阅读时间:8m 作者: IP:上海 网址

controller-runtime 是一套用于构建 kubernetes 控制器的 go 库。它被KubebuilderOperatorSDK所引用

介绍

  • 第三方开发时绕开复杂的 client-go 实现
  • kubernetes-sigs/controller-runtime 代码架构如下
controller-runtime 架构

上图参考

  • 调用关系如下
understand-the-flow-of-k8s-controller

上图参考

Managers

每个 控制器(controller)网络钩子(webhook) 最终都由一个管理器(Manager, pkg/manager)运行。管理器(Manager) 负责运行 控制器(controller)网络钩子(webhook),设置 共享缓存(cache,Infomer实现) 和客户端等常见依赖项,以及管理领导者选举(pkg/leaderelection)。管理器通常会通过连接信号处理程序(pkg/manager/signals),在 pod 终止时优雅地关闭控制器。

Controllers

控制器(pkg/controller)使用事件(pkg/event)来最终触发调和请求。它们可以手动构建,但通常使用构建器(pkg/builder)来构建,该构建器可简化事件源(pkg/source)(如 Kubernetes API 对象变更)与事件处理程序(pkg/handler)的连接,如 “为对象所有者queue 一个对账请求”。谓词(pkg/predicate)可用于过滤哪些事件会真正触发调节器(reconciles)。常用情况下有预写的实用程序,高级情况下有接口和帮助程序。

PS: Controller 一方面会向 Informer 注册 eventHandler,另一方面会从队列中拿数据并执行用户侧 Reconciler 的函数

Reconcilers

控制器逻辑是通过调节器(pkg/reconcile)实现的。调节器实现了一个函数,该函数接收包含要调节对象名称和命名空间的调节请求,调节对象,并返回一个 Response 或一个错误信息,表明是否重新请求进行第二轮处理。

Clients and Caches

调和器使用客户端(pkg/client)访问 API 对象。管理器提供的默认客户端从本地共享缓存(pkg/cache)中读取,并直接写入 API 服务器,但也可以构建只与 API 服务器对话的客户端,而不使用缓存。缓存会自动填充监视对象,并在请求其他结构化对象时自动填充。默认的拆分客户端不承诺在写入过程中使缓存失效(也不承诺按顺序创建/获取一致性),代码不应假定在创建/更新后立即获取会返回更新的资源。缓存还可以有索引,索引可以通过从管理器获取的 FieldIndexer (pkg/client) 创建。索引可用于快速、轻松地查找设置了某些字段的所有对象。调节器可检索事件记录器(pkg/recorder),以便使用管理器发出事件。

PS:Cache(缓存) 用于建立 Informer 对 ApiServer 进行连接 watch 资源,并将 watch 到的 object 推入队列

Schemes

Kubernetes中的客户端、缓存和许多其他东西都使用方案(pkg/scheme)将 Go 类型与 Kubernetes API Kinds(具体来说是 Group-Version-Kinds)相关联。

Webhooks

同样,网络钩子(pkg/webhook/admission)也可以直接实现,但通常使用构建器(pkg/webhook/admission/builder)来构建。它们通过由管理器管理的服务器(pkg/webhook)运行。

Logging and Metrics

controller-runtime 中的日志 (pkg/log) 是通过结构化日志完成的,使用的是名为 logr 的日志接口集 (https://pkg.go.dev/github.com/go-logr/logr)。虽然 controller-runtime 提供了使用 Zap(https://go.uber.org/zap, pkg/log/zap)的简易设置,但你也可以提供任何 logr 实现作为 controller-runtime 的基础日志记录器。 controller-runtime 提供的指标 (pkg/metrics) 会注册到特定于 controller-runtime 的 Prometheus 指标注册表中。管理器可通过 HTTP 端点为这些指标提供服务,其他指标也可正常注册到该注册表中。

示例

  • 重要方法说明
    • sigs.k8s.io/controller-runtime 中通过变量定义入口,包括
      • GetConfigOrDie 创建 *rest.Config,用于调用 Kubernetes apiserver
      • GetConfig
        • 支持通过 --kubeconfig指定,默认为 $HOME/.kube/config
      • NewControllerManagedBy
      • NewWebhookManagedBy
      • NewManager 等
    • builder
      • ControllerManagedBy 返回一个新的 控制器构建器(controller builder),该构建器将由提供的管理器启动
      • Complete 构建Application Controller
      • For 定义了 reconciled 的对象类型,并配置 ControllerManagedBy 通过 reconciling the object 来响应创建/删除/更新事件。这等同于调用 Watches(&source.Kind{Type: apiType}, &handler.EnqueueRequestForObject{})
      • Watches 定义要监控的对象类型,配置 ControllerManagedBy,使其通过 reconciling the object 与给定的 EventHandler 来响应创建/删除/更新事件
      • WatchesMetadata 与 Watches 相同,仅监控 Metadata
        • 当观察大量对象、非常大的对象或只知道 GVK 但不知道其结构的对象时,这非常有用
  • 优化技巧

Reconcile 用法

Reconcile 用法 ...

EventHandler 用法

EventHandler 用法 ...

Cache selector 用法

Cache selector 用法 ...

Custom Handler 用法

Custom Handler 用法 ...

LimitToNamespaces 用法

LimitToNamespaces 用法 ...

Builder-Metadata_only 用法

Builder-Metadata_only 用法 ...

LeaderElection 用法

LeaderElection 用法 ...

webhook 用法

webhook 用法 ...
本文总阅读量 次 本站总访问量 次 本站总访客数