带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(十六)

简介: 带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理

2.2.8        Controller关于 Client-go典型场景


我们了解了Client-go的各个组件(Reflector、Informer、Indexer,Client-go包含编写自定义Controller所使用的各种机制,这些机制在 Client-go库中的 Tools包和Util包中进行了定义。在 k8s中,可以利用 Client-go中提供的 Controller机制对所需资源的变化进行监控,根据资源状态的变化进行一系列操作。为加深对前面知识的理解,下面利用 Client-go工具实现一个简单的 Controller。


 

下面编写一个简易的 Controller,用于监听Pod 创建、删除信息,并将信息打印出来。Controller逻辑如下。

(1) 首先我们需要定义一个 Controller结构体,见代码清单 2-54

typeControllerstruct{

indexercache.Indexer//Indexer的引⽤

queue     workqueue.RateLimitingInterface//Workqueue的引⽤

informercache.Controller//Informer的引⽤


}

 

(2)  初始化一个 Controller,见代码清单 2-55

//WorkqueueInformerIndexer的引⽤作为参数返回⼀个新的Controller

funcNewController(queueworkqueue.RateLimitingInterface,indexercache.Indexer,informercache.Controller)*Controller{

return&Controller{informer:informer,indexer:indexer,queue:queue,

}

}


(3)  定义 Controller的工作流,见代码清单 2-56

func(c*Controller)Run(threadinessint,stopChchanstruct{}){deferruntime.HandleCrash()

deferc.queue.ShutDown()klog.Info("Startingpodcontroller")

//启动 Informer线程,Run函数做两件事情 :第⼀,运⾏⼀个 Reflector,并从 ListerWatcher

中获取对象的通知放到队列中(DeltaQueue);第⼆,从队列中取出对象并处理该对象相关业务goc.informer.Run(stopCh)

//等待缓存同步队列

if!cache.WaitForCacheSync(stopCh,c.informer.HasSynced){

runtime.HandleError(fmt.Errorf("Timeoutwaitngforcachestosync"))return

}

//启动多个Worker线程处理Workqueue中的Object


fori:=0;i<threadiness;i++{

gowait.Until(c.runWorker,time.Second,stopCh)

}

<-stopCh

klog.Info("StoppingPodcontroller")

}

 

相关文章
|
1月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
国诚投顾携手阿里云,依托Serverless架构实现技术全面升级,构建高弹性、智能化技术底座,提升业务稳定性与运行效率。通过云原生API网关、微服务治理与智能监控,实现流量精细化管理与系统可观测性增强,打造安全、敏捷的智能投顾平台,助力行业数字化变革。
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
|
3月前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
3月前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods 技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
25天前
|
弹性计算 运维 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生Serverless实践
简介: 通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
|
17天前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
80 8
|
5月前
|
运维 Cloud Native 测试技术
极氪汽车云原生架构落地实践
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。
|
1月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
|
2月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
云原生信息提取系统:容器化流程与CI/CD集成实践
|
2月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
91 24
|
2月前
|
存储 人工智能 安全
深入理解 go sync.Map - 基本原理
本文介绍了 Go 语言中 `map` 在并发使用时的常见问题及其解决方案,重点对比了 `sync.Mutex`、`sync.RWMutex` 和 `sync.Map` 的性能差异及适用场景。文章指出,普通 `map` 不支持并发读写,容易引发错误;而 `sync.Map` 通过原子操作和优化设计,在某些场景下能显著提升性能。同时详细讲解了 `sync.Map` 的基本用法及其适合的应用环境,如读多写少或不同 goroutine 操作不同键的场景。
135 1