Kubernetes CRDs 自定义资源

[TOC]html

Kubernetes CRDs 自定义资源

基础简介

Kubernetes API

REST API 是 Kubernetes 的基础结构,全部的操做和组件间的通讯,包括外部的用户命令,都是由 API Server 处理的 REST API 调用。所以,Kubernetes 中的全部事物都被视为一个 API 对象而且都有一个与之对应的 API 入口。git

和API Server的交互能够采用REST API,也能够采用kubectl等命令行工具github

Kubernetes 支持多个 API 版本,每一个版本都在不一样的 API 路径下,例如 /api/v1 或者 /apis/extensions/v1beta1web

更多关于API的介绍api

Kubernetes 对象

Kubernetes对象是会进行持久化的,一旦建立对象,Kubernetes 系统将持续工做以确保对象存在。经过建立对象,能够有效地告知 Kubernetes 系统,所须要的集群工做负载看起来是什么样子的,这就是 Kubernetes 集群的 指望状态。Kubernetes 对象包含以下信息:bash

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

对Kubernetes 对象的操做包括:建立、修改、删除、升级等,这些都须要使用Kubernetes API 进行操做。微信

每一个 Kubernetes 对象包含两个嵌套的对象字段,它们负责管理对象的配置:对象 spec 和 对象 status。spec 必须提供,它描述了对象的 指望状态 —— 但愿对象所具备的特征。status 描述了对象的 实际状态,它是由 Kubernetes 系统提供和更新。在任什么时候刻,Kubernetes 控制平面一直处于活跃状态,管理着对象的实际状态以与咱们所指望的状态相匹配。app

更多关于Kubernetes 对象的介绍工具

Kubernetes CRD自定义资源

CRD存在于全部namespace下ui

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 服务端系统研发,后面会大力经过微信公众号发送优质文章"】

个人微信公众号
相关文章
相关标签/搜索