【问题标题】:What happens when creaing crd without relating operator?在没有相关运算符的情况下创建 crd 会发生什么?
【发布时间】:2021-09-16 09:40:20
【问题描述】:
  1. 一旦我将 crd 注册到 k8s 集群中,我就可以使用 .yaml 来创建它,而无需运行 operator。那么这些创建的资源怎么办?

  2. 我见过Reconciler of 运算符,但它更像是异步状态传输。我们在创建 pod 时,可以直接从创建结果中获取 pod ip。但是好像没找到写OnCreate钩子的地方。 (我只看到一些validate webhook,但从来没有看到在创建请求时调用的钩子,定义了如何创建资源,并将创建的资源信息返回给调用者)。

  3. 如果我的故事是,对于一种资源,在一个时间窗口内,所有即将到来的创建都将只复用一个 pod。你能给我一些建议吗?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    这是kubernetescrd/controller生命周期的大故事,我试着做一个简单的表示。

    1. 注册一个新的 CRD,创建 CR 后,kube-api-server 不关心是否存在相关的controller。看过程:

    这意味着资源(您的 CR)将存储到 etcd,与您的 controller 无关

    1. 好的,让我们谈谈您的控制器。您的控制器将为api-server 设置一个list/watch(实际上是一个长寿命的http 链接)并为不同的事件注册hook(你问什么,对吗?):onCreate、onUpdate 和onDelete。实际上,您将在控制器的 reconcile 中处理所有事件(记住 kubernetes reconcile 的职责:将当前状态移动到所需状态)。看图:
    1. 对于controller 中的list/watch 链接,您需要为不同类型的资源设置不同的链接。例如:如果你关心pod的事件,你需要设置podlist/watch或者关心部署,并设置一个deploymentlist/watch...

    【讨论】:

    • 谢谢,学到了很多。我还有一个问题,什么时候会调用reconcile?如果是回调,在没有任何变化的情况下,我们如何执行我们的例程?例如,我们要实现一个 cronjob,那么在我看来,reconcile 应该由 cron 表达式定期调用。
    • 常规的事情(如cronjob)不应该采用controller/reconcile,controller/reconcile是事件驱动的,如果什么都没发生,它应该什么都不做。您可以利用 Kubernetes 中的特定资源,例如 cronjob。另一个解决方案是很少的硬代码,你可以让资源在第一个reconcile之后重新入队(并设置下一个出队时间,例如10分钟后)。然后你得到一个例程的东西......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2016-05-19
    • 1970-01-01
    • 2020-10-19
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多