自定義資源CRD使用介紹
介紹
Custom Resource Define簡稱 CRD,是 Kubernetes(v1.7+)為提高可擴(kuò)展性,讓開發(fā)者去自定義資源的一種方式。
CRD 資源可以動態(tài)注冊到集群中,注冊完畢后,用戶可以通過 kubectl 來創(chuàng)建訪問這個自定義的資源對象,類似于操作 Pod 一樣。
不過需要注意的是 CRD 僅僅是資源的定義而已,需要一個對應(yīng)的控制器去監(jiān)聽 CRD 的各種事件來添加自定義的業(yè)務(wù)邏輯。
定義
如果說只是對 CRD 資源本身進(jìn)行 CRUD 操作的話,不需要 Controller 也是可以實現(xiàn)的,相當(dāng)于就是只有數(shù)據(jù)存入了 etcd 中,而沒有對這個數(shù)據(jù)的相關(guān)操作而已。
比如我們可以定義一個如下所示的 CRD 資源清單文件:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
# name 必須匹配下面的spec字段:<plural>.<group>
name: foos.crd.example.com
# for more information on the below annotation, please see
# https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/2337-k8s.io-group-protection/README.md
annotations:
"api-approved.kubernetes.io": "unapproved, experimental-only; please get an approval from Kubernetes API reviewers if you're trying to develop a CRD in the *.k8s.io or *.kubernetes.io groups"
spec:
# group 名用于 REST API 中的定義: /apis/<group>/<version>
group: crd.example.com
# 列出自定義資源的所有 API 版本
versions:
- name: v1 # 版本名稱,比如v1,v1beta1
served: true # 是否開啟通過 REST APIs訪問 `/apis/<group>/<version>/...`
storage: true # 必須將一個且只有一個版本標(biāo)記為存儲版本
schema: # 定義自定義對象的聲明規(guī)范
# schema used for validation
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
deploymentName:
type: string
replicas:
type: integer
minimum: 1
maximum: 10
status:
type: object
properties:
availableReplicas:
type: integer
names:
# kind 是 sigular 的一個駝峰形式的定義,在資源清單中會使用
kind: Foo
# plural 名字用于 REST API 中的定義:/apis/<group>/<version>/<plural>
plural: foos
# singular 名稱用于 CLI 操作或顯示的一個別名
singular: foo
# shortNames 相當(dāng)于縮寫形式
shortNames:
- fo
scope: Namespaced
這個地方的定義和我們定義普通的資源對象比較類似,我們可以隨意定義一個自定義的資源對象,但是在創(chuàng)建資源的時候,肯定不是任由我們隨意去編寫 YAML 文件的,當(dāng)我們把上面的 CRD 文件提交給 Kubernetes 之后,Kubernetes 會對我們提交的聲明文件進(jìn)行校驗,從定義可以看出 CRD 是基于OpenAPI v3 schem進(jìn)行規(guī)范的。
當(dāng)然這種校驗只是對于字段的類型進(jìn)行校驗,比較初級,如果想要更加復(fù)雜的校驗,這個時候就需要通過 Kubernetes 的 admission webhook 來實現(xiàn)了。關(guān)于校驗的更多用法,可以前往官方文檔查看。
現(xiàn)在我們可以直接使用kubectl來創(chuàng)建這個CRD資源清單:
$ kubectl apply -f crd.example.com_foos.yaml customresourcedefinition.apiextensions.k8s.io/foos.crd.example.com created
這個時候我們可以查看到集群中已經(jīng)有我們定義的這個CRD資源對象了:
$ kubectl get crd | grep example foos.crd.example.com 2022-05-11T05:28:51Z
這個時候一個新的 namespace 級別的 RESTful API 就會被創(chuàng)建:
/apis/crd/example.com/v1/namespaces/*/foos/...
接著我們就可以使用這個 API 端點(diǎn)來創(chuàng)建和管理自定義的對象,這些對象的類型就是上面創(chuàng)建的 CRD 對象規(guī)范中的foo。
現(xiàn)在在 Kubernetes 集群中我們就多了一種新的資源叫做foos.crd.example.com,我們就可以使用它來定義一個Foo資源對象了,這個自定義資源對象里面可以包含的字段我們在定義的時候通過schema進(jìn)行了規(guī)范,比如現(xiàn)在我們來創(chuàng)建一個如下所示的資源清單:
apiVersion: crd.example.com/v1 kind: Foo metadata: name: example-foo spec: deploymentName: example-foo replicas: 1
創(chuàng)建完成后我們就可以用kubectl來管理我們這里創(chuàng)建的Foo對象了,比如:
kubectl get foo NAME AGE example-foo 20m
在使用 kubectl 的時候,資源名稱是不區(qū)分大小寫的,我們可以使用 CRD 中定義的單數(shù)或者復(fù)數(shù)形式以及任何簡寫。
kubectl get foo example-foo -o yaml
apiVersion: crd.example.com/v1
kind: Foo
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"crd.example.com/v1","kind":"Foo","metadata":{"annotations":{},"name":"example-foo","namespace":"default"},"spec":{"deploymentName":"example-foo","replicas":1}}
creationTimestamp: "2022-05-11T05:40:38Z"
generation: 1
name: example-foo
namespace: default
resourceVersion: "37605212"
uid: 56d5b1d3-f6f9-4106-90c4-a0e3c7d130c0
spec:
deploymentName: example-foo
replicas: 1
就如上面我們說的,現(xiàn)在我們自定義的資源創(chuàng)建完成了,但是也只是單純的把資源清單數(shù)據(jù)存入到了 etcd 中而已,并沒有什么其他用處,因為我們沒有定義一個對應(yīng)的控制器來處理相關(guān)的業(yè)務(wù)邏輯。
以上就是自定義資源CRD使用介紹的詳細(xì)內(nèi)容,更多關(guān)于自定義資源CRD的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php redis擴(kuò)展支持scan命令實現(xiàn)方法
這篇文章主要介紹了php redis擴(kuò)展支持scan命令實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-10-10
Kubernetes教程之Windows?HostProcess?運(yùn)行容器化負(fù)載
這篇文章主要介紹了Kubernetes?Windows?HostProcess?運(yùn)行容器化負(fù)載,本篇內(nèi)容還是比較多的,總共包含了?Windows?HostProcess的創(chuàng)建、為?Windows?Pod?和容器配置?GMSA?和?Windows?的?Pod?和容器配置?RunAsUserName三大功能模塊,需要的朋友可以參考下2022-07-07
2022最新青龍面板對接機(jī)器人的詳細(xì)過程(傻妞對接onebot(oicq)協(xié)議實現(xiàn)機(jī)器人功能)
這篇文章主要介紹了2022最新青龍面板對接機(jī)器人的詳細(xì)過程(傻妞對接onebot(oicq)協(xié)議實現(xiàn)機(jī)器人功能),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05
Rainbond云原生快捷部署生產(chǎn)可用的Gitlab步驟詳解
這篇文章主要為大家介紹了Rainbond云原生快捷部署生產(chǎn)可用的Gitlab步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

