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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 带你读《云原生应用开发: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搭建和管理企业级网站应用
相关文章
|
10天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的角色与实践
【9月更文挑战第9天】 随着云计算技术的飞速发展,云原生(Cloud Native)已经成为推动企业数字化转型的核心力量。本文将深入探讨云原生的基本概念、关键技术及其在实际开发中的应用案例,旨在为读者提供一条清晰的云原生技术学习路径和应用指南。通过实例分析,我们将揭示云原生如何优化资源管理、提升应用性能及加快部署速度,进而帮助企业构建更加灵活、可靠和高效的软件系统。
|
7天前
|
Cloud Native 持续交付 云计算
云原生技术在现代应用开发中的应用与实践
【9月更文挑战第12天】随着云计算技术的飞速发展,云原生已成为推动企业数字化转型的关键技术之一。本文将深入探讨云原生的基本概念、核心价值及其在现代应用开发中的实际应用案例,旨在为读者提供一套清晰的云原生应用开发指南。通过分析容器化、微服务架构、持续部署等核心技术的实践过程,我们将揭示云原生如何助力开发者高效构建、部署和管理可扩展的应用。你将看到代码示例,这些示例均选自真实世界的开发场景,帮助你理解云原生技术的强大功能和灵活性。
|
6天前
|
运维 Cloud Native 持续交付
云原生技术:探索现代应用开发的新纪元
本文深入探讨了云原生技术的崛起,以及它如何彻底改变现代应用开发和部署的方式。我们将从云原生的基本概念入手,逐步解析其核心技术如容器化、微服务架构及自动化运维,并展示这些技术如何帮助开发者和企业实现更高效、更灵活的应用管理。通过实际案例分析,我们将揭示云原生技术在提升开发效率、优化资源利用和增强系统可扩展性方面的巨大潜力。
|
7天前
|
Cloud Native 持续交付 开发者
云原生技术在现代应用开发中的角色与实践
【9月更文挑战第12天】本文将探索云原生技术的核心概念及其在现代软件开发中的应用。通过分析容器化、微服务架构、持续集成/持续部署(CI/CD)和DevOps文化的融合,我们旨在揭示如何利用这些技术提升软件的可靠性、可扩展性和交付速度。同时,文章还将展示一个简化的代码示例,以直观地说明云原生技术的实际应用。
|
1月前
|
运维 Cloud Native Android开发
云原生之旅:容器化与微服务架构的融合之道安卓应用开发入门指南
本文将深入探讨云原生技术的核心要素——容器化和微服务架构,并揭示它们如何共同推动现代软件的开发与部署。通过实际案例分析,我们将看到这两种技术如何相辅相成,助力企业实现敏捷、可扩展的IT基础设施。文章旨在为读者提供一条清晰的道路,指引如何在云原生时代利用这些技术构建和优化应用。 本文将引导初学者了解安卓应用开发的基本概念和步骤,从安装开发环境到编写一个简单的“Hello World”程序。通过循序渐进的讲解,让读者快速掌握安卓开发的核心技能,为进一步深入学习打下坚实基础。
40 1
|
22天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用开发中的应用
【8月更文挑战第29天】本文将探讨云原生技术在现代应用开发中的重要性,包括其概念、优势和实践。我们将通过代码示例来展示如何在云平台上构建和部署云原生应用。
|
3月前
|
运维 Cloud Native 持续交付
云原生技术:现代应用开发的革命性变革
云原生技术正在重新定义软件开发和部署的方式。通过采用容器、微服务、持续集成与持续交付(CI/CD)等关键技术,企业可以显著提升开发效率、缩短上市时间,并提高应用的可扩展性和可靠性。本文深入探讨了云原生技术的核心组件及其带来的实际业务价值,展示了其在现代应用开发中的革命性影响。
44 1
|
4月前
|
Cloud Native 云计算
云原生技术:重塑现代应用开发
本文将深入探讨云原生技术如何革新传统应用开发模式,提升应用性能与开发效率。我们将通过分析云原生的核心概念、优势以及实践案例,揭示其对现代企业数字化转型的深远影响。
|
4月前
|
运维 Cloud Native 持续交付
构建未来:云原生架构在现代应用开发中的演进
【5月更文挑战第30天】 随着企业数字化转型的不断深入,云原生技术正成为推动应用现代化的关键力量。本文将探讨云原生架构的核心组件、实施策略及其在提高业务敏捷性、可扩展性和运维效率方面的优势。通过分析微服务、容器化、持续集成/持续部署(CI/CD)和自动化管理的实践案例,我们将揭示如何利用云原生原则来构建一个灵活、高可用的应用生态系统,并讨论在采用这些技术时可能面临的挑战及应对策略。
|
3月前
|
Kubernetes Cloud Native Devops
云原生架构:现代应用开发的未来之路
在当今快速发展的技术环境中,云原生架构正成为企业构建和部署现代应用的首选方式。本文探讨了云原生的基本概念、优势以及在实际应用中的关键组件和最佳实践,为企业如何利用云原生实现更高效、更灵活的应用开发提供了深入分析。

热门文章

最新文章