文章目录
  1. 1. k8s 创建自定义crd(一)
  2. 2. 1、K8S CRD简明及简用
    1. 2.1. 2、 k8s api
      1. 2.1.1. 标准 API 术语
      2. 2.1.2. k8s api如何调用
    2. 2.2. 创建crd
    3. 2.3. 创建crd对象

k8s 创建自定义crd(一)

我是先了解operator sdk才回过头来看k8s 的crd的,所以今天我就先通过k8s原生的crd创建与k8s api创建operator

1、K8S CRD简明及简用

CustomResourceDefinition简介:
在 Kubernetes 中一切都可视为资源,Kubernetes 1.7 之后增加了对 CRD 自定义资源二次开发能力来扩展 Kubernetes API,通过 CRD 我们可以向 Kubernetes API 中增加新资源类型,而不需要修改 Kubernetes 源码来创建自定义的 API server,该功能大大提高了 Kubernetes 的扩展能力。
当你创建一个新的CustomResourceDefinition (CRD)时,Kubernetes API服务器将为你指定的每个版本创建一个新的RESTful资源路径,我们可以根据该api路径来创建一些我们自己定义的类型资源。CRD可以是命名空间的,也可以是集群范围的,由CRD的作用域(scpoe)字段中所指定的,与现有的内置对象一样,删除名称空间将删除该名称空间中的所有自定义对象。customresourcedefinition本身没有名称空间,所有名称空间都可以使用。

Kuberneters 官方文档

k8s官方api概览

2、 k8s api

Kubernetes API 是基于资源的(RESTful)、通过 HTTP 提供的编程接口。 API 支持通过标准的 HTTP 动词(POST、PUT、PATCH、DELETE 和 GET) 检视、创建、更新和删除主要资源,为很多允许细粒度权限控制的对象提供子资源 (如将 Pod 绑定到节点上),并且出于便利性或效率考虑,支持并提供这些资源的 不同表示形式。 Kubernetes API 还通过 “watch” 和一致性的列表支持高效的资源变更通知, 从而允许其他组件对资源的状态进行高效的缓存和同步。

标准 API 术语

大多数 Kubernetes API 资源类型都是 对象: 它们代表的是集群中某一概念的具体实例,例如一个 Pod 或名字空间。 为数不多的几个 API 资源类型是“虚拟的” - 它们通常代表的是操作而非对象本身, 例如访问权限检查(使用 POST 请求发送一个 JSON 编码的 SubjectAccessReview 负载到 subjectaccessreviews 资源)。 所有对象都有一个唯一的名字,以便支持幂等的创建和检视操作,不过如果虚拟资源类型 不可检视或者不要求幂等,可以不具有唯一的名字。

Kubernetes 一般会利用标准的 RESTful 术语来描述 API 概念:

  • 资源类型(Resource Type) 是在 URL 中使用的名称(podsnamespacesservices
  • 所有资源类型都有具有一个 JSON 形式(其对象的模式定义)的具体表示,称作类别(Kind)
  • 某资源类型的实例的列表称作 集合(Collection)
  • 资源类型的单个实例被称作 资源(Resource)

k8s api如何调用

所有资源类型要么是集群作用域的(/apis/GROUP/VERSION/*),要么是名字空间 作用域的(/apis/GROUP/VERSION/namespaces/NAMESPACE/*)。

名字空间作用域的资源类型会在其名字空间被删除时也被删除,并且对该资源类型的 访问是由定义在名字空间域中的授权检查来控制的。

描述 restful api url 请求类型 作用域
返回、创建、更新、删除指定资源类型的资源的集合 /apis/${GROUP}/${VERSION}/${RESOURCETYPE} GET/POST/PUT/DELETE 集群
返回、创建、更新、删除指定资源类型下名称为 NAME 的资源 /apis/${GROUP}/${VERSION}/${RESOURCETYPE}/NAME GET/POST/PUT/DELETE 集群
返回、创建、更新、删除所有名字空间中指定资源类型的全部实例的集合 /apis/${GROUP}/${VERSION}/${RESOURCETYPE} GET/POST/PUT/DELETE 名字空间
返回、创建、更新、删除名字空间NAMESPACE 内给定资源类型的全部实例的集合 /apis/${GROUP}/${VERSION}/namespaces/${NAMESPACE}/${RESOURCETYPE} GET/POST/PUT/DELETE 名字空间
返回、创建、更新、删除名字空间 NAMESPACE 中给定资源类型的名称为 NAME 的实例 /apis/${GROUP}/${VERSION}/namespaces/${NAMESPACE}/${RESOURCETYPE}/${NAME} GET/POST/PUT/DELETE 名字空间

以上api接口post/put 方法都需要传一个 JSON 编码格式的内容。

创建crd

  • 创建一个自定义crd,生成k8s自定义api
  • 创建自定义crd的对象
  • 查看自定义对象是否创建成功

环境:

* k8s client v1.17.3
* k8s server v1.18.3
* docker 19.03.12
  • linux-unbutun 18

crd_xiaohei.yaml:

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  # 名称必须与下面的spec字段匹配,格式为: <plural>.<group>
  name: xiaoheis.example.com
spec:
  # 用于REST API的组名称: /apis/<group>/<version>
  group: example.com
  # 此CustomResourceDefinition支持的版本列表
  versions:
    - name: v1
      # 每个版本都可以通过服务标志启用/禁用。
      served: true
      # 必须将一个且只有一个版本标记为存储版本。
      storage: true
  # 指定crd资源作用范围在命名空间或集群
  scope: Namespaced
  names:
    # URL中使用的复数名称: /apis/<group>/<version>/<plural>
    plural: xiaoheis
    # 在CLI(shell界面输入的参数)上用作别名并用于显示的单数名称
    singular: xiaohei
    # kind字段使用驼峰命名规则. 资源清单使用如此
    kind: XiaoHei
    # 短名称允许短字符串匹配CLI上的资源,意识就是能通过kubectl 在查看资源的时候使用该资源的简名称来获取。
    shortNames:
    - hxh
  • 创建crd到etcdctl

​ kubectl apply -f crd_xiaohei.yaml -n hgq

如果本地额外安装了etcdctl ,则可以通过如下命令查看:

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key get /registry/apiextensions.k8s.io/customresourcedefinitions/ --prefix

如果没有额外安装,可以通过k8s的命令行验证:

​ kubectl get crd

image-20200930150553978

发现已经安装好了。

创建crd对象

object-xiaohei.yaml:

apiVersion: example.com/v1
kind: XiaoHei
metadata:
  name: object-xiaohei
spec:
  name: "张小黑"
  school: "小黑中学"

创建crd对象:

​ kubectl apply -f object-xiaohei.yaml -n hgq

查看是否资源对象创建成功:

​ kubectl get hxh -n hgq

image-20200930151825924

发现已经创建成功。

下一节,看如何通过自定义的crd资源对象去自定义controller,来控制业务逻辑。

文章目录
  1. 1. k8s 创建自定义crd(一)
  2. 2. 1、K8S CRD简明及简用
    1. 2.1. 2、 k8s api
      1. 2.1.1. 标准 API 术语
      2. 2.1.2. k8s api如何调用
    2. 2.2. 创建crd
    3. 2.3. 创建crd对象