Kubernetes controller源码分析小记(基于release-1.21)

在学习讲解执行kubectl run ...命令时发生了什么的这篇文章时,想到一个问题,既然controller是状态驱动的,只有当资源发生了改变才会触发controller的处理,那如果在处理资源的过程中controller挂掉,因为apiserver是无状态的,不存在事件交付处理过期等机制,那这个资源就一直处于未处理的状态吗。例如新建了一个deployment,再deployment controller准备新增replicaset的时候挂掉,那这个deployment会一直没有replicaset吗。首先答案当然是否定的,controller会以某种机制,确保已知的资源是已经被正确处理了,那具体代码是怎么实现的,本文主要基于这篇博客进行一些源码阅读和分析,这篇博客已经讲得非常好了,但是基于的codebase比较老旧,本文从release-1.21分支出发去扒一下具体的实现过程,对大部分函数都进行了一定程度的简化。

首先看到deployment controller的核心代码,主要就是在几个informer中注册handler,这些handler主要是将相关的deployment enqueue到队列(deployment controller自己的队列,和informer的队列不是同一个)中,交给处理协程。

// pkg/controller/deployment/deployment_controller.go
func NewDeploymentController(
	dInformer appsinformers.DeploymentInformer,
	rsInformer appsinformers.ReplicaSetInformer,
	podInformer coreinformers.PodInformer,
	client clientset.Interface,
) (*DeploymentController, error) {
   
	dc := &DeploymentController{
   }
	dInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
   
		AddFunc:    dc.addDeployment,
		UpdateFunc: dc.updateDeployment,
		DeleteFunc: dc.deleteDeployment,
	})
	rsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
   
		AddFunc:    dc.addReplicaSet,
		UpdateFunc: dc.updateReplicaSet,
		DeleteFunc: dc.deleteReplicaSet,
	})
	podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
   
		DeleteFunc: dc.deletePod,
	})
}

既然deployment controller中只是根据到来的event进行处理,那么相关机制应该隐藏在了informer中。NewDeploymentController在app中被调用:

// cmd/kube-controller-manager/app/apps.go
func startDeploymentController(ctx ControllerContext) (http.Handler, bool, error) {
   
	dc, err := deployment.NewDeploymentController(
		ctx.InformerFactory.Apps().V1().Deployments(),
		ctx.InformerFactory.Apps().V1().ReplicaSets(),
		ctx.InformerFactory.Core().V1().Pods(),
		ctx.ClientBuilder.ClientOrDie("deployment-controller"),
	)
	if err != nil {
   
		return nil, true, fmt.Errorf("error creating Deployment controller: %v", err)
	<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes Job ControllerKubernetes 中的一种 Controller,用于管理 Job 资源,确保它们成功地完成任务。在 Kubernetes 中,Job 是一种用于运行任务的资源类型,通常用于批处理处理和定时任务。 Job Controller 的主要功能是监控 Job 资源的状态,并根据需要创建、更新、删除 Pod 资源,以确保 Job 能够成功地运行。具体来说,Job Controller 会创建一个或多个 Pod 来执行 Job 的任务,如果 Pod 运行成功,则 Job 将被视为已完成;如果 Pod 运行失败,则 Job 将被视为已失败;如果 Pod 没有运行成功或失败,则 Job 将被视为正在运行。 Job Controller源码实现位于 Kubernetes 代码库中的 `k8s.io/kubernetes/pkg/controller/job` 目录下。其中,Job Controller 的主要代码实现位于 `job_controller.go` 文件中。 Job Controller 的主要实现逻辑如下: 1. Job Controller 会使用 Kubernetes API 客户端来监视 Job 资源的变化,包括创建、更新和删除操作。 2. 当 Job 资源发生变化时,Job Controller 会根据 Job 的当前状态来决定如何处理它。如果 Job 还没有创建任何 Pod,则 Job Controller 将创建一个或多个 Pod 来执行 Job 的任务。如果 Job 已经创建了 Pod,则 Job Controller 将检查这些 Pod 的状态,并根据需要创建、更新或删除 Pod。 3. 当一个或多个 Pod 成功地完成 Job 的任务后,Job Controller 将删除这些 Pod。如果 Job 的任务失败,则 Job Controller 将根据需要重试任务,直到达到最大重试次数或任务成功为止。 4. 当 Job 被删除时,Job Controller 将删除与该 Job 相关的所有 Pod。 总之,Job ControllerKubernetes 中非常重要的一种 Controller,它可以确保 Job 资源的正确执行,并帮助用户轻松地管理批处理处理和定时任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值