CRD(Custom Resource Definition) 是 kubernetes 強大擴展能力的一處體現,聯系到編程場景,CRD 相當於是類(class),custom resource 相當於是對象或者實例,通過 CRD 可以創建自己定義的資源類型,api server 會直接支持,可以通過 kubectl 命令創建對應的資源並對資源進行刪/查/改的操作,資源對象會被保存在 etcd 中,可以像操作 pod 那樣操作自己創建的 resouce。
這篇隨筆以發布博文場景為例體驗一下 kubernetes 的 CRD,對應的 custom resource 就是 BlogPost。
首先,編寫 BlogPost 的 CRD 清單文件 blogpost-crd.yaml,給 BlogPost 定義了3個屬性:title, pushishdate, body,從編程角度就是創建了一個 BlogPost 類
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: blogposts.kube.cnblogs.com
spec:
group: kube.cnblogs.com
scope: Namespaced
names:
kind: BlogPost
singular: blogpost
plural: blogposts
listKind: BlogPostList
versions:
- name: v1
# Each version can be enabled/disabled by Served flag.
served: true
# One and only one version must be marked as the storage version.
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
title:
type: string
url:
type: string
publishdate:
type: string
body:
type: string
編寫清單注意事項:
metadata.name是spec.names.plural+ "." +spec. group的組合,如果寫blogposts.kube.cnblogs.com,會包下面的錯誤metadata.name: Invalid value: "blogpost.kube.cnblogs.com": must be spec.names.plural+"."+spec.group- scope 有2種,一種是
Cluster,一種是Namespaced,比如 node 資源的 scope 是 Cluster,pod 資源的 scope 是 Namespaced,Cluster 資源的 url 路徑是/clusters/{cluster}/{plural},Namespaced 資源的 url 路徑是/clusters/{cluster}/namespaces/{namespace}/{plural} - 屬性不支持日期類型,只支持 "array", "boolean", "integer", "number", "object", "string" 五種類型。
然后,基於清單文件創建 CRD
$ kubectl create -f blogpost-crd.yaml
customresourcedefinition.apiextensions.k8s.io/blogposts.kube.cnblogs.com created
查看已創建的 CRD
kubectl get crd | grep blogposts
blogposts.kube.cnblogs.com 2021-03-08T08:28:17Z
接下來基於創建好的 CRD 創建 BlogPost 資源,從編程角度就是 new 一個 BlogPost 對象,從需求角度就是發布一篇博文。
編寫清單文件 blogpost-1.yaml
apiVersion: kube.cnblogs.com/v1
kind: BlogPost
metadata:
name: blogpost-1
spec:
title: "助園一臂之力:發布博客園贊助者計划"
url: "https://www.cnblogs.com/cmt/p/14469606.html"
publishdate: "2021-03-02 16:28"
body: "大家好,今年園子正在加快建設的步伐,我們將全面提升產品的用戶體驗,我們將做一些有趣的產品功能,我們將以雲為中心探索商業化道路。。。我們將挖掘出技術社區發展的康庄大道。"
創建資源
$ kubectl create -f blogpost-1.yaml
blogpost.kube.cnblogs.com/blogpost-1 created
創建成功之后就可以用 kubectl 命令操作 blogposts 資源
列出資源
$ kubectl get blogposts
NAME AGE
blogpost-1 94s
查看資源
kubectl describe blogposts blogpost-1
輸出如下
kubectl describe blogposts blogpost-1
Name: blogpost-1
Namespace: production
Labels: <none>
Annotations: <none>
API Version: kube.cnblogs.com/v1
Kind: BlogPost
Metadata:
Creation Timestamp: 2021-03-08T09:09:51Z
Generation: 2
Managed Fields:
API Version: kube.cnblogs.com/v1
Fields Type: FieldsV1
fieldsV1:
f:spec:
.:
f:body:
f:publishdate:
f:title:
Manager: kubectl-create
Operation: Update
Time: 2021-03-08T09:09:51Z
API Version: kube.cnblogs.com/v1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io/last-applied-configuration:
f:spec:
f:url:
Manager: kubectl-client-side-apply
Operation: Update
Time: 2021-03-08T09:16:31Z
Resource Version: 151288200
UID: 75930e48-0c1a-4450-b9ef-e010201b154a
Spec:
Body: 大家好,今年園子正在加快建設的步伐,我們將全面提升產品的用戶體驗,我們將做一些有趣的產品功能,我們將以雲為中心探索商業化道路。。。我們將挖掘出技術社區發展的康庄大道。
Publishdate: 2021-03-02 16:28
Title: 助園一臂之力:發布博客園贊助者計划
URL: https://www.cnblogs.com/cmt/p/14469606.html
Events: <none>
體驗完畢。
