custom-resource
weight: 63
title: 使用自定义资源扩展API
date: ‘2022-05-21T00:00:00+08:00’
type: book
自定义资源是对
自定义资源
扩展API
自定义资源实际上是为了扩展
- 修改
Kubernetes 的源码,显然难度比较高,也不太合适 - 创建自定义
API server 并聚合到API 中
编写自定义资源是扩展
- 你的
API 是否属于 声明式的 - 是否想使用
kubectl 命令来管理 - 是否要作为
Kubernetes 中的对象类型来管理,同时显示在Kubernetes dashboard 上 - 是否可以遵守
Kubernetes 的API 规则限制,例如URL 和API group 、namespace 限制 - 是否可以接受该
API 只能作用于集群或者namespace 范围 - 想要复用
Kubernetes API 的公共功能,比如CRUD 、watch、内置的认证和授权等
如果这些都不是你想要的,那么你可以开发一个独立的
CRD
参考下面的
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
# 名称必须符合下面的格式:<plural>.<group>
name: crontabs.stable.example.com
spec:
# REST API 使用的组名称:/apis/<group>/<version>
group: stable.example.com
# REST API 使用的版本号:/apis/<group>/<version>
version: v1
# Namespaced 或 Cluster
scope: Namespaced
names:
# URL 中使用的复数名称: /apis/<group>/<version>/<plural>
plural: crontabs
# CLI 中使用的单数名称
singular: crontab
# CamelCased 格式的单数类型。在清单文件中使用
kind: CronTab
# CLI 中使用的资源简称
shortNames:
- ct
创建该
kubectl create -f resourcedefinition.yaml
访问http://172.20.0.113:8080
将看到如下
/apis/stable.example.com/v1/namespaces/*/crontabs/...
创建自定义对象
如下所示:
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
name: my-new-cron-object
spec:
cronSpec: "* * * * /5"
image: my-awesome-cron-image
引用该自定义资源的
终止器
可以为自定义对象添加一个终止器,如下所示:
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
finalizers:
- finalizer.stable.example.com
删除自定义对象前,异步执行的钩子。对于具有终止器的一个对象,删除请求仅仅是为metadata.deletionTimestamp
字段设置一个值,而不是删除它,这将触发监控该对象的控制器执行他们所能处理的任意终止器。
详情参考:Extend the Kubernetes API with CustomResourceDefinitions
自定义控制器
单纯设置了自定义资源,并没有什么用,只有跟自定义控制器结合起来,才能将资源对象中的声明式
请参考使用 Operator 模式,该模式可以让开发者将自己的领域知识转换成特定的
API server 聚合
Aggregated(聚合的)
详情参考 Aggregated API Server。