首页 > 其他分享 >理解K8S的CRD

理解K8S的CRD

时间:2023-12-17 21:05:55浏览次数:30  
标签:Kubernetes SVC 理解 CRD Deployment MicroService K8S 资源

CRD本身是Kubernetes内置的资源类型,全称是CustomResourceDefinition,可以通过命令查看,kubectl get查看集群内定义的CRD资源。

NAME                         CREATED AT
apps.app.o0w0o.cn            2019-07-25T07:02:47Z
microservices.app.o0w0o.cn   2019-07-25T07:02:47Z

在与人们谈论CRD时,我发现人们对CRD存在一些常见的误解,因此需要提前澄清一些概念:

  1. 在 Kubernetes 中,一切都称为资源,如 Yaml 中的 Kind 项所述。
  2. 但除了 Deployment 等常见的内置资源之外,Kube 还允许用户定义资源(CR)。
  3. CRD 并不是真正的自定义资源,而是自定义资源的定义(描述我们定义的资源的样子)

对于 CRD,它本质上是一个 Open Api 架构,正如 Kuber 博客文章 ( kubernetes.io/blog/2019/0… ) 所说,R 和 CR 都需要 Yaml。但是如何保证Yaml描述的资源是规范的、合法的,这就是schema的作用,而CRD的作用就是向集群注册一个新的资源,并告诉ApiServer这个资源是如何合法定义的

控制器模式

在详细介绍 CRD 之前,我们先简要解释一下控制器模型。如果你对 Kubernetes 有了解的话,就知道我们可以通过创建 Deployment 来管理 Pod,但是 Deployment 并不是直接创建 Pod,而是 Deployment 管理 RS,RS 管理 Pod,这实际上就是控制器模式。

理解K8S的CRD_kubernetes

控制器模式允许基于现有资源定义更高阶的控制器,以实现更复杂的功能,当然,具体细节肯定会更复杂。

CRD 可以做什么

总的来说,我们用CRD定义的CR是一个新的控制器,我们可以自定义Controller的逻辑来完成一些Kubernetes集群原生不支持的功能。

举个具体的例子,我使用 Kubebulder 创建了一个简单的 CRD(github.com/Coderhypo/K…),尝试将微服务管理构建到 Kubernetes 集群中。

我创建了两个资源,一个名为App,负责管理整个应用程序生命周期,另一个名为MicroService,负责管理微服务的生命周期。

具体逻辑结构可以理解如下

理解K8S的CRD_kubernetes_02

App可以直接管理多个MicroServices,每个都MicroService支持多个版本,并且得益于控制器模型,MicroService可以Deployment为每个版本创建一个,允许多个版本同时部署。

如果管理应用部署过于简单,MicroService支持创建ServiceIngress为每个微服务启用四层负载均衡和七层负载均衡。

理解K8S的CRD_k8s_03

并且,如果启用负载平衡,将为每个版本创建一个 SVC,因此一个服务将有 n + 1 个 SVC,其中 n 为每个版本 1 个,额外的 1 个 SVC 在运行后不会更改(名称和 clusterIP)MicroService。微服务创建完成后,该SVC的Selector将始终与CurrentVersion SVC相同。

换句话说,存在一个稳定的SVC,它向其他组件提供当前版本的服务,而其他组件则可以访问特定版本的服务。这种SVC+CurrentVersion使得实现蓝绿发布能力变得非常容易。

除了SVC之外,MicroService还基于nginx Ingress控制器的能力实现灰度发布,通过修改canaryLoadBalance中的配置,可以通过scale/header/cookie实现灰度发布。

在这个例子中,AppMicroService没有创建new capabilities,而是通过组合 Kubernetes 中已有的资源来实现新功能。

但是,除了快速蓝绿化和灰化微服务之外,还有什么新价值吗AppMicroService另一个看不见的价值是管理的标准化,以前应用程序下的任何操作都需要翻译成“Kube语言”,即对Deployment或Ingress进行管理,现在可以通过统一的入口点规范化进行管理。

概括

通过一个简单的小演示来描述 CRD 是什么,很容易概括。从我目前的想法来看,我认为CRD有两个非常重要的能力。

  • 首先,从功能上来说,CRD 将 Kubernetes 中已有的资源和能力变成了乐高积木,我们可以轻松地使用它来扩展 Kubernetes 原生不具备的能力。
  • 其次,基于Kubernetes的产品不可避免地要求我们将产品术语与Kube术语保持一致,例如服务是Deployment,实例是Pod等等。但CRD让我们可以根据产品创建自己的概念(或者资源),让Kube现有的资源为我们的概念服务,这让产品更专注于它解决的场景,而不是考虑如何将场景应用到Kubernetes上。

标签:Kubernetes,SVC,理解,CRD,Deployment,MicroService,K8S,资源
From: https://blog.51cto.com/jowin/8862799

相关文章

  • k8s集群安装
    在三台机器上都执行如下命令操作:1、关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld2、关闭selinuxsed-i's/enforceing/disabled/'/etc/selinux/config#永久关闭setenforce0#临时关闭3、关闭swapswapoff-a#临时关闭vim/etc/fst......
  • 语文阅读理解总结
    需要注意的事项:1.答题思路要保持清晰,如果题目让分析词语的作用,首先应该写出这个词语的意思,再根据其释义分析作用例如:问:第六段加点词“越来越多”体现了说明文的准确性,请具体说明原始答案:越来越多说明人们更加地重视保护叫卖声,不希望叫卖声就此消失参考答案:越来越多表示数量逐......
  • K8s - 容器编排引擎Kubernetes
     什么是Kubernetes?背景Kubernetes是开源的容器集群管理项目,诞生于2014年,由Google公司发起前身Borg系统在Google内部应用了十几年,积累了大量来自生产环境的实践经验试图为基于容器的应用部署和管理打造一套强大并且易用的管理平台该项目基于Go语言实现介绍一个基于容......
  • k8s labels过滤实现
    k8sv1.19.0staging\src\k8s.io\apiserver\pkg\registry\generic\registry\store.goList方法staging\src\k8s.io\apiserver\pkg\storage\etcd3\store.goList方法staging\src\k8s.io\apiserver\pkg\storage\etcd3\store.goappendListItem函数......
  • 理解 Paimon changelog producer
    介绍目的Chaneglogproducer的主要目的是为了在Paimon表上产生流读的changelog,所以如果只是批读的表是可以不用设置Chaneglogproducer的.一般对于数据库如MySQL来说,当执行的语句涉及数据的修改例如插入、更新、删除时,MySQL会将这些数据变动记录在binlog中。相......
  • 我对过拟合的理解
    1、什么是过拟合就是训练出来的模型在训练集上表现很好,但是在测试集上表现较差的一种现象,如下图:2、发生过拟合的主要原因(1)数据有噪声(2)训练数据不足,有限的训练数据(3)训练模型过度导致模型非常复杂3、如何防止(1)获取和使用更多的数据(数据集增强)(2)采用合适的模(3)降低特征的数(4)Dropout是在......
  • k8s报错合集
    底层网络沙箱容器pause无法下载报错#如出现报错,是因为底层沙箱容器pause无法下载导致出现的问题Events:TypeReasonAgeFromMessage---------------------......
  • k8s多维度自动弹性伸缩
    转自:http://www.manongjc.com/detail/63-uwchnflbwfuvynp.html时间:2022-10-22本文章向大家介绍k8s多维度自动弹性伸缩,主要内容包括一、背景、1.2k8s自动弹性伸缩功能包括、1.3HPA、1.4VPA、1.5CA、1.6三者使用场景、二、HPA、2.2原生指标、2.4自定义指标、2.5原......
  • Argo Rollouts AnalysisTemplate CRD
    AnalysisTemplateCRDapiVersion:argoproj.io/v1alpha1kind:AnalysisTemplatemetadata:name:success-ratespec:args:#模板参数,模板内部引用的格式为“{{args.NAME}}”;可在调用该模板时对其赋值;-name:<string>value:<string>valu......
  • K8S 入门实战 (1)
    Docker安装#1.查看机器信息,内核版本要求3.8以上$uname-aLinuxcentos85.11.12-300.el8.aarch64#1SMPFriJul3012:03:15CST2021aarch64aarch64aarch64GNU/Linux#2.关闭selinux$setenforceEnforcing$getenforceEnforcing#3.关闭防火......