在 Kubernetes 中,CRD(Custom Resource Definition)和 CR(Custom Resource)是用于扩展 Kubernetes 功能的机制。它们的关系和使用可以用一个完整案例来说明。
定义
CRD(Custom Resource Definition): 自定义资源定义,描述了一种新的资源类型。通过创建 CRD,用户可以向 Kubernetes 集群中添加新资源类型,类似于 Pod、Service 等内置资源。
CR(Custom Resource): 自定义资源,是基于 CRD 创建的资源实例。CR 使用 CRD 定义的规格,可以像管理其他 Kubernetes 资源一样进行管理。
Kubernetes Custom Resource Definitions(CRD)提供了许多好处,使其成为扩展 Kubernetes 平台功能的重要工具:
1.自定义资源类型:CRD 允许你定义和创建自定义资源类型,与 Kubernetes 内置资源一起工作,满足特定业务需求。
2.无缝集成:自定义资源可以与 Kubernetes 的 RBAC、监控和日志工具集成,实现统一管理和监控。
3.原生API交互:通过定义 CRD,你可以使用 Kubernetes API 和 kubectl 命令来管理自定义资源,保持一致的操作体验。
4.可扩展性:CRD 提供了一种无需外部服务即可扩展 Kubernetes 平台的方法,使开发者可以根据需要添加新的功能和特性。
5.自动化和高效:通过自定义控制器和操作器,CRD 可以实现自动化操作流程,提高系统运维的效率和可靠性。
6.复用性和共享:CRD 可以打包成 Helm Chart 等形式,方便分享和复用,促进社区和企业内部的协作和标准化。
7.分层管理:利用 CRD,可以实现应用的分层和模块化管理,清晰定义应用中的每个部分及其配置。
8.综合来看,CRD 提供了一种灵活且强大的方式来定制和扩展 Kubernetes,适应不同场景和需求。
案例:管理自定义“应用程序”资源
假设我们要在 Kubernetes 中管理一个自定义的应用程序资源。
Step 1: 定义 CRD
首先,创建一个 CRD 文件 application-crd.yaml:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:name: applications.example.com
spec:group: example.comversions:- name: v1served: truestorage: trueschema:openAPIV3Schema:type: objectproperties:spec:type: objectproperties:name:type: stringreplicas:type: integerscope: Namespacednames:plural: applicationssingular: applicationkind: ApplicationshortNames:- app
Step 2: 应用 CRD
使用 kubectl 命令应用这个 CRD:
kubectl apply -f application-crd.yaml
这样,你就创建了一个新的资源类型 Application。
Step 3: 创建一个实例 CR
创建一个自定义资源 my-application.yaml:
apiVersion: example.com/v1
kind: Application
metadata:name: my-app
spec:name: "My Custom App"replicas: 3
Step 4: 应用实例 CR
使用 kubectl 命令创建这个自定义资源实例:
kubectl apply -f my-application.yaml
Step 5: 验证创建
你可以使用以下命令查看自定义资源实例:
kubectl get applications
或者查看详细信息:
kubectl describe application my-app
总结
CRD 定义了一个新的资源类型,它告诉 Kubernetes 如何解释和管理这种新的资源。
CR 是这种新类型的资源实例,遵循 CRD 的定义进行配置。
通过 CRD 和 CR 的结合,Kubernetes 可以支持多种不同的自定义资源,为应用的部署和管理提供了强大的扩展能力。
查看相关CRD
列出所有的 CRDs:
kubectl get crds
查看某个 CRD 类型的资源:kubectl get myresources.example.com
查看所有命名空间中的某个类型的 CR: kubectl get myresources.example.com --all-namespaces
查看详细信息:
kubectl describe myresources.example.com
kubectl get myresources.example.com -o yaml