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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 带你读《云原生应用开发: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 类型中。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Kubernetes 监控 Cloud Native
云原生时代下的应用开发与部署实践
【10月更文挑战第4天】在云原生的浪潮中,开发者和运维人员面临着新的挑战和机遇。本文将通过实际案例,展示如何在云平台上高效地开发、部署和管理应用,同时确保系统的可扩展性和高可用性。我们将深入探讨容器化技术、微服务架构以及持续集成/持续部署(CI/CD)流程的实施策略,旨在为读者提供一套完整的云原生解决方案框架。
|
2月前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的角色与实践
【9月更文挑战第9天】 随着云计算技术的飞速发展,云原生(Cloud Native)已经成为推动企业数字化转型的核心力量。本文将深入探讨云原生的基本概念、关键技术及其在实际开发中的应用案例,旨在为读者提供一条清晰的云原生技术学习路径和应用指南。通过实例分析,我们将揭示云原生如何优化资源管理、提升应用性能及加快部署速度,进而帮助企业构建更加灵活、可靠和高效的软件系统。
|
12天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的实践与思考
【10月更文挑战第35天】云原生技术,作为云计算的进阶形态,正引领着软件开发和运维的新潮流。本文将深入探讨云原生技术的核心理念、关键技术组件以及在实际项目中的应用案例,帮助读者理解如何利用云原生技术优化应用架构,提高开发效率和系统稳定性。我们将从容器化、微服务、持续集成/持续部署(CI/CD)等角度出发,结合实际代码示例,展现云原生技术的强大能力。
|
20天前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
1月前
|
Kubernetes Cloud Native 持续交付
云原生技术:重塑现代应用开发与部署模式####
本文深入探讨了云原生技术的核心概念、发展历程及其在现代软件开发和部署中的关键作用。通过分析云原生架构的特点,如容器化、微服务、持续集成与持续部署(CI/CD),以及它如何促进应用的可伸缩性、灵活性和效率,本文旨在为读者提供一个关于云原生技术全面而深入的理解。此外,还将探讨实施云原生策略时面临的挑战及应对策略,帮助组织更好地把握数字化转型的机遇。 ####
|
1月前
|
人工智能 Serverless API
云原生应用开发平台CAP:一站式应用开发及生命周期管理解决方案
阿里云的云应用开发平台CAP(Cloud Application Platform)是一款一站式应用开发及应用生命周期管理平台。它提供丰富的Serverless与AI应用模板、高效的开发者工具链及企业级应用管理功能,帮助开发者快速构建、部署和管理云上应用,大幅提升研发、部署和运维效能。
94 1
|
1月前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的实践与展望
【10月更文挑战第7天】随着技术的不断演进,云计算已从简单的资源租用模式转变为支持复杂、高效、灵活的云原生应用架构。本文将深入探讨云原生技术的核心概念及其在现代应用开发中的应用,通过分析Kubernetes容器编排和微服务架构的实践案例,揭示云原生技术如何推动软件开发的现代化进程。文章旨在为开发者和架构师提供一套实用的云原生应用开发指南,同时展望未来云原生技术的发展方向。
29 8
|
1月前
|
Cloud Native 测试技术 云计算
云原生技术在现代应用开发中的角色与实践
【9月更文挑战第31天】本文深入探讨了云原生技术如何革新现代应用开发流程,通过实际案例分析,揭示了其对提高开发效率、确保系统可扩展性和可靠性的显著影响。文章不仅介绍了云原生的核心概念,还提供了实施策略和最佳实践,旨在为开发者提供一条清晰的云原生转型之路。
|
2月前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的实践与思考
【9月更文挑战第23天】本文将深入探讨云原生技术如何革新现代应用的开发流程。通过分析云原生的核心概念、优势以及实际应用案例,我们旨在揭示这一新兴技术范式如何助力开发者和企业更高效、灵活地构建和部署应用程序。文章还将提供具体代码示例,展示云原生技术在实际项目中的应用,帮助读者更好地理解和掌握该技术。
|
2月前
|
Cloud Native 持续交付 开发者
云原生技术在现代应用开发中的应用与实践
【9月更文挑战第22天】本文将深入探讨云原生技术如何革新现代应用开发,通过实际案例分析其对提高开发效率、促进持续集成与交付的显著影响。我们将从云原生的基本概念出发,逐步展开到容器化、微服务架构、自动化管理的实践操作,以及这些技术如何协同工作以支持复杂应用的快速迭代和扩展。文章旨在为开发者提供一套云原生技术的实践框架,帮助他们构建更加灵活、可维护的应用系统。
下一篇
无影云桌面