返回

架构师视角解读Client-Go/informer处理流程

后端

Kubernetes 集群是一个动态环境,资源会不断地被创建、更新和删除。为了让应用程序能够及时地感知到这些变化,Kubernetes提供了informer 机制。Informer是一个客户端库,它负责监视Kubernetes API服务器上的资源变化,并将其通知给应用程序。

Informer 是一个非常重要的组件,它可以帮助应用程序保持与Kubernetes集群的同步。如果应用程序没有使用informer,那么它就无法及时地感知到集群中的变化,从而导致应用程序出现故障。

Informer 的处理流程如下图所示:

[插入图片]

如上图所示,informer的处理流程主要分为以下几个步骤:

  1. informer 首先会向Kubernetes API服务器发送一个List请求,获取所有资源的列表。
  2. informer 会将获取到的资源列表保存在本地缓存中。
  3. informer 会持续监视Kubernetes API服务器上的资源变化。
  4. informer 一旦发现资源发生变化,就会将变化通知给应用程序。

Informer 的主要组件包括:

  • Reflector :Reflector负责与Kubernetes API服务器进行绑定,并定期获取资源列表。
  • Store :Store负责将获取到的资源列表保存在本地缓存中。
  • Controller :Controller负责监视Store中的资源变化,并将其通知给应用程序。

Informer 的使用非常简单,我们只需要创建一个informer对象,然后将其添加到informer工厂中即可。如下所示:

import (
	"time"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/informers"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/cache"
)

func main() {
	// 创建一个kubernetes客户端
	client, err := kubernetes.NewForConfig(restConfig)
	if err != nil {
		// 处理错误
	}

	// 创建一个informer工厂
	factory := informers.NewSharedInformerFactory(client, time.Second*30)

	// 创建一个pod informer
	podInformer := factory.Core().V1().Pods()

	// 将pod informer添加到informer工厂中
	factory.Start(podInformer.Informer())

	// 等待informer工厂启动
	factory.WaitForCacheSync(podInformer.Informer().HasSynced)

	// 使用pod informer
	podInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
		AddFunc: func(obj interface{}) {
			// 处理新增的pod
		},
		UpdateFunc: func(oldObj, newObj interface{}) {
			// 处理更新的pod
		},
		DeleteFunc: func(obj interface{}) {
			// 处理删除的pod
		},
	})
}

通过上面的示例代码,我们就可以看到如何使用informer来监视Kubernetes API服务器上的资源变化。

Informer 是一个非常强大的工具,它可以帮助应用程序保持与Kubernetes集群的同步。如果您正在使用Kubernetes进行应用程序开发,那么强烈建议您使用informer。