带你读《云原生应用开发:Operator原理与实践》——2.2.4 Discovery 原理

简介: 带你读《云原生应用开发:Operator原理与实践》——2.2.4 Discovery 原理

2.2.4 Discovery 原理


在分析 Discovery 原理之前,首先介绍一下 Kubernetes 的资源模型,图 2-7 是获取所有 Deployements 资源的 RESTful API,URL 中各字段含义如下。

(1) apps 是 Group 资源组,包含一组资源操作的集合。

(2) v1 是 Version 资源版本,用于区分不同 API 的稳定程度及兼容性。

(3) Deployments 是 Resource 资源信息,用于区分不同的资源 API。

image.png

图 2-7 Deployments 资源 URL

由于历史原因,Kubernetes 中有两种资源组:有组名资源组和无组名资源组(也叫核心资源组,Core Groups)。上面介绍的就是有组名资源组,而 Pods、Services 等资源属于无组名资源组,图 2-8 是获取 Pods 资源的 RESTful API,其中未包含 Group 信息,但拥有 Version 和 Resource 信息。

image.png

图 2-8 Pods 资源 URL

常用的 Kubectl 命令,当执行 kubectl api-versions 和 kubectl api-resources 命令时,返回的就是 GVR(Group,Version,Resource)信息(见代码清单 2-29)。

代码清单 2-29

$ kubectl api-versions
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
...
$ kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
bindings true Binding
componentstatuses cs false 
ComponentStatus
configmaps cm true 
ConfigMap
endpoints ep true Endpoints
events ev true Event
...

前面我们介绍的是标准的 DiscoveryClient ,由于 GVR 信息变动很少,因此,可以将 Kubernetes APIServer 返回的 GVR 信息缓存在本地,以此减轻 Kubernetes APIServer 的压力,这里可以使用 Discover/Cached 目录下的两个客户端:CachedDiscoveryClient 和 memCacheClient,分别将 GVR 信息缓存到本地文件(~ /.kube/cache 和 ~ /.kube/http-cache)和内存中。

Kubectl 的 apiVersions 命令就是利用 CachedDiscoveryClient 来实现的,如 APIVersionsOptions 结构体中 discoveryClient 变量是 CachedDiscoveryInterface 类型,而 CachedDiscoveryClient 结构体实现了该接口,且在 APIVersionsOptions 的 Complete 方法中会将 CachedDiscoveryClient 客户端赋值到 discoveryClient 变量(见代码清单2-30)。

代码清单 2-30

// APIVersionsOptions have the data required for API versions
type APIVersionsOptions struct {
 discoveryClient discovery.CachedDiscoveryInterface
 genericclioptions.IOStreams
}

CachedDiscoveryClient 获取 Group、Version 和 Resource 的流程与 DiscoveryClient 类似,只是在 ServerResourcesForGroupVersion 方法的实现上存在差异。

(1) CachedDiscoveryClient 首先通过 getCachedFile 方法查找本地缓存。

(2)如果信息不存在(未命中)或超时时才会通过 CachedDiscoveryClient 结构体成员 delegate 的 ServerResourcesForGroupVersion 方法访问 Kubernetes APIServer,此时相当于通过 DiscoveryClient 访问(见代码清代 2-31)。

代码清单 2-31

type CachedDiscoveryClient struct {
 delegate discovery.DiscoveryInterface
 //...
}

(3)最后通过 writeCachedFile 方法将 Kubernetes APIServer 返回的数据存储在本地硬盘。

具体代码分析见代码清单 2-32。

代码清单 2-32

func (d *CachedDiscoveryClient) ServerResourcesForGroupVersion(groupVersion 
string) (*metav1.APIResourceList, error) {
 // 查找本地缓存
 filename := filepath.Join(d.cacheDirectory, groupVersion, "serverresources.
json")
 cachedBytes, err := d.getCachedFile(filename)
 //...
 // 利用 DiscoveryClient 中的 RESTClient 访问 Kubernetes APIServer
 liveResources, err := d.delegate.ServerResourcesForGroupVersion(groupVersion)
 //...
 // 将 Kubernetes APIServer 响应的数据缓存到本地硬盘
 if err := d.writeCachedFile(filename, liveResources); err != nil {
 //...
}

另一种实现方法 memCacheClient 与之类似,只是将数据缓存在 map[string]*cacheEntry 类型中。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
缓存 Java API
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
【云原生】Spring Cloud Gateway的底层原理与实践方法探究
|
2月前
|
Kubernetes Cloud Native 开发工具
带你读《云原生应用开发:Operator原理与实践》精品文章合集
带你读《云原生应用开发:Operator原理与实践》精品文章合集
|
2月前
|
Kubernetes Cloud Native 微服务
作者推荐|剖析云原生服务框架中服务发现机制的核心原理与实现机制
作者推荐|剖析云原生服务框架中服务发现机制的核心原理与实现机制
46 0
|
2月前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
44 0
|
2月前
|
运维 Cloud Native 持续交付
云原生技术的未来展望:如何塑造下一代应用开发
【2月更文挑战第30天】 随着云计算的不断发展,云原生技术已经成为推动现代应用开发的重要力量。本文将深入探讨云原生技术的核心概念,分析其在提高开发效率、降低运维成本以及支持复杂业务场景中的作用。同时,文章还将预测云原生技术的发展趋势,并讨论如何在不断变化的技术环境中保持应用的敏捷性和可靠性。
|
2月前
|
消息中间件 存储 Cloud Native
【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程
【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程
|
21天前
|
消息中间件 Cloud Native 开发者
电子好书发您分享《阿里云云原生开源开发者沙龙北京站 PPT 合集 》
**阿里云开源沙龙PPT合集:北京站聚焦云原生技术** 探索云原生领域的深度与广度,[阿里云](https://developer.aliyun.com/ebook/8334/116563?spm=a2c6h.26392459.ebook-detail.5.da096cf6t38G15)分享了北京开发者沙龙的精彩内容,涵盖微服务、消息队列等主题,助力开发者洞悉行业趋势。![image](https://ucc.alicdn.com/pic/developer-ecology/cok6a6su42rzm_67b12f6cad6e4b2786859b3a668b3351.png)
19 3
|
2月前
|
人工智能 监控 Cloud Native
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
|
3月前
阿里云云原生恭祝大家新年快乐!
阿里云云原生恭祝大家新年快乐!
|
3月前
|
人工智能 监控 Cloud Native
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态
阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态

热门文章

最新文章