赞
踩
配置和 Restclient或者 ClientSet 准备好后就可以通过客户端 CRUD k8s集群里面的资源
reflector 就是 watch和list k8s api 。就是监控资源变化和列出资源
ResourceVersion 资源版本,bookmark更新客户端保存的最近一次 ResourceVersion
reflector 与 api 交互需要通过各种client
缓存cache中的store.go, 通过crud将数据和store交互,key value形式构成的obj。
FIFO 就是queue,pop方法用来消费数据,传到下游,队列有两个下游,一个是sharedProcessor,另一个是存储的Cache,并实时更新。worker可以去Cache读取,不用去API server,减少了API server的压力
indexer/cache中的indexer的作用就是维护几个map,这样找东西好找,效率高,有的map,key是namespace,就很容器获取这个namespace下所有的资源。这就是索引的意义
这个图展示了 Kubernetes 中使用的 Informer 和 WorkQueue 之间的交互流程,是 Operator 框架的核心组件之一。以下是各个组件的作用和它们之间的工作流程:
Reflector
从 Kubernetes API 服务器中拉取资源对象的最新状态,并将这些对象的变更(增量)存储在 Delta FIFO Queue
中。List and Watch
操作,Reflector
持续监听指定资源对象的变化。Delta FIFO Queue
维护了资源对象的变更(增量)队列,这些变更包括添加、更新和删除操作。Reflector
从 API 服务器接收到资源变更时,它会将这些变更放入 Delta FIFO Queue
中。此队列确保变更按照它们发生的顺序进行处理。Indexer/Cache
负责将 Delta FIFO Queue
中的变更应用到内存缓存中。缓存存储了当前集群中资源对象的完整状态,并允许通过索引高效地查找特定对象。Shared Processor
负责将变更事件分发给注册的事件处理器。Delta FIFO Queue
中有变更时,Shared Processor
会将这些事件传递给所有注册的 EventHandler
。EventHandler
处理来自 Shared Processor
的变更事件,并将需要处理的资源对象放入 WorkQueue
中。EventHandler
将处理事件并确定哪些对象需要进一步处理,通常是将它们的键(标识符)添加到 WorkQueue
中。WorkQueue
存储需要处理的资源对象,通常按顺序处理每个对象。WorkQueue
中有资源对象时,它会依次将这些对象传递给 Worker
进行处理。Worker
是实际执行操作的组件,它从 WorkQueue
中取出资源对象,并根据需要与 Kubernetes API 服务器交互(写操作)。Worker
可能会执行一些复杂的业务逻辑,如创建、更新或删除 Kubernetes 资源对象,并将结果提交回 API 服务器。整个流程涉及从 API 服务器监听对象变更,处理这些变更,并在需要时采取进一步操作。Informer 是一个高效的机制,允许 Kubernetes 控制器(如 Operator)保持对集群状态的了解,并根据资源的变化做出响应。
Kubernetes Operator 由多个组件组成,每个组件都有其特定的作用,以下是一些关键组件的介绍:
这些组件协同工作,帮助开发者高效地构建、管理和操作 Kubernetes Operator,实现 Kubernetes 集群内复杂操作的自动化。
operator = CRD + Custom Controller 扩展 k8s 功能, 必须学习 Client-go, 来跟APIServer 交互
client-go
来提供与Kubernetes集群的交互能力。让我们用一个非常简单的例子来说明Kubernetes中Webhook的作用。
假设你正在管理一个Kubernetes集群,并且你想要确保所有部署(Deployment)的副本数量(replicas)都不会超过3个。为了实现这一点,你可以使用一个Validating Webhook。
首先,你需要定义一个Validating Webhook,它会在任何Deployment资源创建或更新之前被调用。
然后,你需要在Kubernetes集群中注册这个Webhook,这样API Server就知道在处理Deployment资源之前调用它。
接下来,你需要实现Webhook的逻辑。这个逻辑会检查传入的Deployment对象的副本数量。如果副本数量大于3,Webhook将拒绝这个Deployment的创建或更新,并返回一个错误信息。
一旦Webhook被注册和实现,每当有人尝试创建或更新Deployment时,API Server就会先调用这个Webhook。如果Deployment的副本数量大于3,Webhook将阻止这个操作,并返回一个错误,比如:“副本数量不能超过3个。”
假设有一个Deployment的YAML定义如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 4 # 这里设置的副本数量是4
# 其他配置...
当尝试应用这个YAML时,API Server会调用Validating Webhook。Webhook检查spec.replicas
字段,发现它设置为4,超过了3的限制。因此,Webhook返回错误,Deployment不会被创建或更新。
这个例子展示了Webhook如何在Kubernetes集群中实现自定义的验证逻辑,确保资源的创建和更新符合特定的规则。
Operator的主要目标是将工程师的逻辑转换为代码,以便实现原生Kubernetes无法完成的某些任务的自动化。
Operator由两个组件组成,自定义资源定义(CRD, Custom Resource Definition)和控制器(controller)。
控制器是特定于某种类型的资源的,但也可以对一组不同的资源执行CRUD(创建、读取、更新和删除)操作。
在Kubernetes的文档中举了一个控制器的例子: 恒温器。当我们设置温度时,告诉恒温器所需的状态,房间的实际温度就是当前的实际状态,恒温器通过打开或关闭空调,使实际状态更接近预期状态。
那管理器(manager)呢?该组件的目标是启动所有控制器,并使控制循环共存。假设项目中有两个CRD,同时有两个控制器,每个CRD对应一个控制器,管理器将启动这两个控制器并使它们共存。
定义 CRD (Custom Resource Definition):
RedisCluster
),并指定了这些资源的结构和字段。kubectl apply -f crd.yaml
命令将 CRD 应用到 Kubernetes 集群中。编写 Controller 逻辑:
RedisCluster
)。打包 Operator:
make docker-build
构建镜像,然后使用 make docker-push
将镜像推送到 Docker 仓库。部署 Operator 到 Kubernetes:
kubectl apply -f config/deploy/
将 Operator 部署到 Kubernetes 集群中。创建自定义资源实例:
RedisCluster
),描述特定应用的配置。kubectl apply -f rediscluster.yaml
创建这个实例,Kubernetes API 会将其存储并触发 Controller 的事件监听。Controller 监听和操作:
RedisCluster
资源被创建的事件,读取其配置,并在 Kubernetes 集群中创建相应的资源(如 Pod、Service、StatefulSet 等)。RedisCluster
资源的状态,处理扩展、缩容、备份等操作。状态反馈与更新:
RedisCluster
资源的 Status
字段。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。