k8s 自定义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本身没有名称空间,所有名称空间都可以使用。
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 中使用的名称(
pods
、namespaces
、services
) - 所有资源类型都有具有一个 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
发现已经安装好了。
创建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
发现已经创建成功。
下一节,看如何通过自定义的crd资源对象去自定义controller,来控制业务逻辑。