Kubernetes CRDs 自定义资源
[TOC]
Kubernetes CRDs 自定义资源
基础简介
Kubernetes API
REST API 是 Kubernetes 的基础结构,所有的操作和组件间的通信,包括外部的用户命令,都是由 API Server 处理的 REST API 调用。因此,Kubernetes 中的所有事物都被视为一个 API 对象并且都有一个与之对应的 API 入口。
和API Server的交互可以采用REST API,也可以采用kubectl等命令行工具
Kubernetes 支持多个 API 版本,每个版本都在不同的 API 路径下,例如 /api/v1 或者 /apis/extensions/v1beta1
Kubernetes 对象
Kubernetes对象是会进行持久化的,一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,可以有效地告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 期望状态。Kubernetes 对象包含如下信息:
应用运行的容器是咋样的,容器运行在哪个 Node 上
可以被应用使用的资源有多少
关于应用如何表现的策略:比如重启策略、升级策略,以及容错策略
对Kubernetes 对象的操作包括:创建、修改、删除、升级等,这些都需要使用Kubernetes API 进行操作。
每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 spec 和 对象 status。spec 必须提供,它描述了对象的 期望状态 —— 希望对象所具有的特征。status 描述了对象的 实际状态,它是由 Kubernetes 系统提供和更新。在任何时刻,Kubernetes 控制平面一直处于活跃状态,管理着对象的实际状态以与我们所期望的状态相匹配。
Kubernetes CRD自定义资源
CRD存在于所有namespace下
CustomResourceDefinition(CRD)是v1.7+新增的无需改变代码就可以扩展Kubernetes API的机制,用来管理自定义对象。
在Kubernetes中一切都可视为资源,系统提供了很多默认资源类型,如 Pod、Deployment、Service、Volume等一系列资源,一种资源就是Kubernetes API中的一个端点,它存储着某种API 对象的集合,自定义资源是对Kubernetes API的扩展,在一个运行中的集群内,自定义资源可以通过动态注册出现和消失,集群管理员可以独立于集群本身更新自定义资源。
自定义资源本身可以进行简单地存储和索取结构化数据,但是只有和控制器结合后才能成为一种真正的declarative API(声明式API), 控制器将结构化数据解释为用户所期望状态的记录,并且不断地采取行动来实现和维持该状态。定制化控制器是用户可以在运行中的集群内部署和更新的一个控制器,它独立于集群本身的生命周期。 定制化控制器可以和任何一种资源一起工作,当和定制化资源结合使用时尤其有效。
CustomResourceDefinition (CRD)是一个内建的API, 它提供了一个简单的方式来创建自定义资源。
CRD创建流程
当创建一个新的自定义资源定义(CRD)时,Kubernetes API Server 通过创建一个新的RESTful资源路径进行应答
1,定义和创建自定义资源kind: CustomResourceDefinition
CRD
如下,首先需要先定义和创建一个自定义资源kind: CustomResourceDefinition
,指定API Group的名称如group: networking.istio.io
,
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: annotations: helm.sh/hook: crd-install creationTimestamp: 2018-10-15T10:06:40Z generation: 1 labels: app: istio-pilot name: virtualservices.networking.istio.io resourceVersion: "226955722" selfLink: /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/virtualservices.networking.istio.io uid: 02eb8d88-d062-11e8-a4b4-005056b84e17 spec: group: networking.istio.io names: kind: VirtualService listKind: VirtualServiceList plural: virtualservices singular: virtualservice scope: Namespaced version: v1alpha3 status: acceptedNames: kind: VirtualService listKind: VirtualServiceList plural: virtualservices singular: virtualservice conditions: - lastTransitionTime: 2018-10-15T10:06:40Z message: no conflicts found reason: NoConflicts status: "True" type: NamesAccepted - lastTransitionTime: 2018-10-15T10:06:40Z message: the initial names have been accepted reason: InitialNamesAccepted status: "True" type: Established
这样就创建了一个新的区分命名空间的RESTful API断点:/apis/networking.istio.io/v1alpha3/namespaces/*/virtualservices/...
,然后可以使用此端点URL来创建和管理自定义对象,这些对象的kind就是上面创建的CRD中指定的kind: VirtualService
对象。
2,创建一个CRD的自定义对象
在CRD对象创建完成之后就创建自定义对象(instances)了,这些自定义对象实例就可以类似Kubernetes的常用对象如Deployment、Service、Pod等一样进行CURD操作了。 自定义对象可以包含自定义的字段,这些字段可以包含任意的JSON,具体的字段要根据对象去定义,主要是spec域。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: wudebao-web spec: hosts: - "www.wudebao-web.com" gateways: - wudebao-web-gateway http: - match: - uri: exact: /wudebao route: - destination: port: number: 54321 host: wudebao-web
CRD的常用命令操作
查询所有CRD:
kubectl get crd |grep istio
作者:吴德宝AllenWu
链接:https://www.jianshu.com/p/43195325dcd5
共同学习,写下你的评论
评论加载中...
作者其他优质文章