Kubernetes CRDs 自定义资源

3,984 阅读4分钟

[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

更多关于API的介绍

Kubernetes 对象

Kubernetes对象是会进行持久化的,一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,可以有效地告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的 期望状态。Kubernetes 对象包含如下信息:

  • 应用运行的容器是咋样的,容器运行在哪个 Node 上
  • 可以被应用使用的资源有多少
  • 关于应用如何表现的策略:比如重启策略、升级策略,以及容错策略

对Kubernetes 对象的操作包括:创建、修改、删除、升级等,这些都需要使用Kubernetes API 进行操作。

每个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 spec 和 对象 status。spec 必须提供,它描述了对象的 期望状态 —— 希望对象所具有的特征。status 描述了对象的 实际状态,它是由 Kubernetes 系统提供和更新。在任何时刻,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

参考

使用CRD(CustomResourceDefinitions)扩展Kubernetes API

Accessing Kubernetes CRDs from the client-go package

【"欢迎关注我的微信公众号:Linux 服务端系统研发,后面会大力通过微信公众号发送优质文章"】

我的微信公众号