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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(十一)

Watch操作通过 HTTPKubernetesAPIServer建立长链接, 接收 KubernetesAPIServer发来的变更时间,Watch操作的实现机制使用的是 HTTP的分块传输编码。Client-go调 用 KubernetesAPIServer 时, 在 ResponseHTTPHeader 中 设 置Transfer-Encoding的值为 Chunked。r.listerWatcher.Watch实际调用了 PodInformerwatchfunc函数。通过 ClientSet客户端与 APIServer 建立长链接,监控指定资源的变更事件。r.watchHandler用于处理资源的变更时间,当初发增删改AddedUpdated等事件时,将对应的资源对象更新到本地缓存 DeltaFIFO中,并更新 ResouceVersion。至此实现了 Reflctor组件的功能。

 

1. Client-goDeltaFIFO


DeltaFIFO是一个 FIFO队列,记录了资源对象的变化过程。作为一个 FIFO队列,它的生产者就是 Reflector组件,前面讲过 Reflector将监听对象同步到 DeltaFIFO中,DeltaFIFO对这些资源对象做了什么,见代码清单2-40。

typeDeltaFIFOstruct{

locksync.RWMutex

condsync.Cond//条件变量,唤醒等待的协程

itemsmap[string]Deltas//Delta存储桶

queue[]string//队列存储对象键实际就是和items⼀起形成了⼀个有序Map

//true通过Replace() 第⼀批元素被插⼊队列或者Delete/Add/Update⾸次被调⽤

populatedbool

//Replace() 被⾸次调⽤时插⼊的元素数⽬

initialPopulationCountint

 

//函数计算元素Key

keyFuncKeyFunc

 

//列出已知的对象

knownObjectsKeyListerGetter

//队列是否被关闭,关闭互斥锁

closedboolclosedLocksync.Mutex


}

FIFO接收 ReflectorAdds/Updates 添加和更新事件,并将它们按照顺序放入队列。元素在队列中被处理之前,如果有多个Adds/Updates 事件发生,事件只会被处理一次。

使用场景1仅处理对象一次2处理完当前事件后才能处理最新版本的对象;3删除对象之后不会处理4不能周期性重新处理对象。这里的Delta对象就Kubernetes系统中对象的变化。DeltaTypeObject两个属性DeltaType就是资源变化的类型, 比如 AddUpdateDeltaObject就是具体的 Kubernetes资源对象,见代码清单 2-41。例如,此时 Reflector中监听了一个PodAAdd事件,那么此DeltaType就是AddedDeltaObject就是 PodADeltaFIFO中的数据是什么样的呢?此时 Items中会有 Add类型的 Delta,Queue中也会有这个事件的 Key。这个 KeyKeyFunc生成。Client-go中默认的 KeyFuncMetaNamespaceKeyFunc,可以在tools/cache/store.go:76中找到。由 MetaNamespaceKeyFunc生成的 Key格式为/,用来标识不同命名空间下的不同资源。

typeDeltastruct{

Type    DeltaType                   //Delta类型,⽐如增、减,后⾯有详细说明

Objectinterface{}                  //对象,Delta的粒度是⼀个对象

}

typeDeltaTypestring                  //Delta的类型⽤字符串表达

const(

AddedDeltaType= "Added" //增加UpdatedDeltaType= "Updated" //更新DeletedDeltaType= "Deleted" //删除SyncDeltaType= "Sync" //同步

)

typeDeltas[]Delta                    //Delta数组

 


既然 DeltaFIFO是一个 FIFO,那么它就应该有基本的 FIFO功能,这里 DeltaFIFO实现了 Queue接口。下面看一下 Queue接口功能的定义。我们可以看出 Queue扩展了Store接口的功能,附加了 Pop、AddIfNotPresent、HasSynced、Close方法。Store是一个通用的对象存储和处理的接口,本身提供了 Add、Update、List、Get等方法,Queue接口增加了 Pop方法,实现了一个基本 FIFO队列,具体见代码清单 2-42。

typeQueueinterface{Store

Pop(PopProcessFunc)(interface{},error)AddIfNotPresent(interface{})errorHasSynced()bool

Close()

}

 

下面我们来看一下FIFO队列的基本功能是怎么实现的。首先是 Add方法,我们可以看到 Add方法会先根据 KeyFunc计算出对象的 Key,如果队列中没有这个对象,我们就在这个队列尾部增补对象的Key,并且将这个对象存入 Map,具体见代码清2-43

func(f*FIFO)Add(objinterface{})error{id,err:=f.keyFunc(obj)

iferr!=nil{

returnKeyError{obj,err}

}

f.lock.Lock()

deferf.lock.Unlock()f.populated=true

if _,exists:=f.items[id];!exists{f.queue=append(f.queue,id)

}

f.items[id]=objf.cond.Broadcast()returnnil


}

 

接下来我们看一下 Pop方法, 在 Queue中至少有一个资源时才会进行 Pop作。在处理资源之前,资源会从队列(和存储)中移除,如果未成功处理资源,应该用AddIfNotPresent()函数将资源添加回队列。处理逻辑由 PopProcessFunc进行执行,具体见代码清单2-44。

func(f*DeltaFIFO)Pop(processPopProcessFunc)(interface{},error){

f.lock.Lock()

deferf.lock.Unlock()for{

forlen(f.queue)==0{

//Whenthequeueisempty,invocationofPop()isblockeduntilnewitemisenqueued.

//WhenClose()iscalled,thef.closedissetandtheconditionisbroadcasted.

//Whichcausesthislooptocontinueandreturnfromthe

Pop().


iff.IsClosed(){

returnnil,FIFOClosedError


}

 

f.cond.Wait()

}

id:=f.queue[0]

 

f.queue=f.queue[1:]item,ok:=f.items[id]

iff.initialPopulationCount>0{f.initialPopulationCount--

}

if!ok{

//Itemmayhavebeendeletedsubsequently.continue

}

delete(f.items,id)err:=process(item)

if e,ok:=err.(ErrRequeue);ok{f.addIfNotPresent(id,item)err=e.Err

}

//Don'tneedtocopyDeltashere,becausewe'retransferring

//ownershiptothecaller.returnitem,err

}

}

 

func(f*DeltaFIFO)KeyOf(objinterface{})(string,error)

if d,ok:=obj.(Deltas);ok{iflen(d)==0{

return"",KeyError{obj,ErrZeroLengthDeltasObject}

}

obj=d.Newest().Object

}

ifd,ok:=obj.(DeletedFinalStateUnknown);ok{

returnd.Key,nil

}

returnf.keyFunc(obj)

}

 

值得注意的是DeltaFIFO中用于计算对象键的函数KeyOf为什么要先进行一次Deltas的类型转换呢?是因为Pop 出去的对象很可能还要再添加进来(比如处理失败需要再放进来,此时添加的对象就是已经封装好的Delta对象了。至此,已实现DeltaFIFO基本功能。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
18天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的角色与实践
【9月更文挑战第9天】 随着云计算技术的飞速发展,云原生(Cloud Native)已经成为推动企业数字化转型的核心力量。本文将深入探讨云原生的基本概念、关键技术及其在实际开发中的应用案例,旨在为读者提供一条清晰的云原生技术学习路径和应用指南。通过实例分析,我们将揭示云原生如何优化资源管理、提升应用性能及加快部署速度,进而帮助企业构建更加灵活、可靠和高效的软件系统。
|
4天前
|
设计模式 Cloud Native API
云原生时代的微服务架构实践
【9月更文挑战第23天】在这篇文章中,我们将深入探讨云原生环境下的微服务架构设计原则、优势以及实施策略。文章不仅涉及理论概念,还结合具体的代码示例,帮助读者理解如何在实际项目中应用微服务架构。通过阅读本文,你将获得构建、部署和管理微服务的实用知识,为你的云原生项目奠定坚实的基础。
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术在现代企业中的应用与实践
【9月更文挑战第22天】 在数字化浪潮的推动下,云原生技术已经成为企业IT架构转型的重要方向。本文将深入探讨云原生技术的核心概念、优势以及如何在企业中实施云原生策略。我们将从容器化技术的基本原理出发,逐步引导读者理解服务网格和微服务架构的设计思路,并通过实际案例分析,展示云原生技术如何助力企业实现敏捷开发和高效运维。文章旨在为技术人员提供云原生实践的参考,并启发企业决策者对于云原生转型的深度思考。
|
2天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
12 4
|
4天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的实践与思考
【9月更文挑战第23天】本文将深入探讨云原生技术如何革新现代应用的开发流程。通过分析云原生的核心概念、优势以及实际应用案例,我们旨在揭示这一新兴技术范式如何助力开发者和企业更高效、灵活地构建和部署应用程序。文章还将提供具体代码示例,展示云原生技术在实际项目中的应用,帮助读者更好地理解和掌握该技术。
|
5天前
|
Cloud Native 持续交付 开发者
云原生技术在现代应用开发中的应用与实践
【9月更文挑战第22天】本文将深入探讨云原生技术如何革新现代应用开发,通过实际案例分析其对提高开发效率、促进持续集成与交付的显著影响。我们将从云原生的基本概念出发,逐步展开到容器化、微服务架构、自动化管理的实践操作,以及这些技术如何协同工作以支持复杂应用的快速迭代和扩展。文章旨在为开发者提供一套云原生技术的实践框架,帮助他们构建更加灵活、可维护的应用系统。
|
7天前
|
Kubernetes Cloud Native Serverless
探索云原生技术:从基础架构到应用实践
本文深入探讨了云原生技术的各个方面,包括其定义、核心原则、关键技术组件以及在现代企业中的应用。通过分析云原生如何推动数字化转型和提高业务敏捷性,文章旨在为读者提供对这一领域的全面了解和实际应用的指导。
33 7
|
5天前
|
Kubernetes Cloud Native 云计算
云原生技术入门与实践
【9月更文挑战第22天】本文将带你了解云原生技术,并探讨如何利用它来构建高效、可扩展的应用。我们将从基础概念开始,逐步深入到实际应用,最后通过一个简单的示例展示如何在Kubernetes上部署一个容器化应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
|
15天前
|
Cloud Native 持续交付 云计算
云原生技术在现代应用开发中的应用与实践
【9月更文挑战第12天】随着云计算技术的飞速发展,云原生已成为推动企业数字化转型的关键技术之一。本文将深入探讨云原生的基本概念、核心价值及其在现代应用开发中的实际应用案例,旨在为读者提供一套清晰的云原生应用开发指南。通过分析容器化、微服务架构、持续部署等核心技术的实践过程,我们将揭示云原生如何助力开发者高效构建、部署和管理可扩展的应用。你将看到代码示例,这些示例均选自真实世界的开发场景,帮助你理解云原生技术的强大功能和灵活性。
|
15天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
24 3

热门文章

最新文章