小日月 發表於 2021-3-8 17:22:00

初步体验 Kubernetes 的 Custom Resource Definition

<p>CRD(Custom Resource Definition) 是 kubernetes 强大扩展能力的一处体现,联系到编程场景,CRD 相当于是类(class),custom resource 相当于是对象或者实例,通过 CRD 可以创建自己定义的资源类型,api server 会直接支持,可以通过 kubectl 命令创建对应的资源并对资源进行删/查/改的操作,资源对象会被保存在 etcd 中,可以像操作 pod 那样操作自己创建的 resouce。</p>
<p>这篇随笔以发布博文场景为例体验一下 kubernetes 的 CRD,对应的 custom resource 就是 BlogPost。</p>
<p>首先,编写 BlogPost 的 CRD 清单文件 blogpost-crd.yaml,给 BlogPost 定义了3个属性:title, pushishdate, body,从编程角度就是创建了一个 BlogPost 类</p>
<pre><code class="language-yaml">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
</code></pre>
<p>编写清单注意事项:</p>
<ul>
<li><code>metadata.name</code> 是 <code>spec.names.plural</code> + "." + <code>spec. group</code> 的组合,如果写 <code>blogposts.kube.cnblogs.com</code>,会包下面的错误 <code>metadata.name: Invalid value: "blogpost.kube.cnblogs.com": must be spec.names.plural+"."+spec.group</code></li>
<li>scope 有2种,一种是 <code>Cluster</code>,一种是 <code>Namespaced</code>,比如 node 资源的 scope 是 Cluster,pod 资源的 scope 是 Namespaced,Cluster 资源的 url 路径是 <code>/clusters/{cluster}/{plural}</code>,Namespaced 资源的 url 路径是 <code>/clusters/{cluster}/namespaces/{namespace}/{plural}</code></li>
<li>属性不支持日期类型,只支持 "array", "boolean", "integer", "number", "object", "string" 五种类型。</li>
</ul>
<p>然后,基于清单文件创建 CRD</p>
<pre><code class="language-bash">$ kubectl create -f blogpost-crd.yaml
customresourcedefinition.apiextensions.k8s.io/blogposts.kube.cnblogs.com created
</code></pre>
<p>查看已创建的 CRD</p>
<pre><code class="language-bash">kubectl get crd | grep blogposts
blogposts.kube.cnblogs.com                  2021-03-08T08:28:17Z
</code></pre>
<p>接下来基于创建好的 CRD 创建 BlogPost 资源,从编程角度就是 new 一个 BlogPost 对象,从需求角度就是发布一篇博文。</p>
<p>编写清单文件 blogpost-1.yaml</p>
<pre><code class="language-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: "大家好,今年园子正在加快建设的步伐,我们将全面提升产品的用户体验,我们将做一些有趣的产品功能,我们将以云为中心探索商业化道路。。。我们将挖掘出技术社区发展的康庄大道。"
</code></pre>
<p>创建资源</p>
<pre><code class="language-bash">$ kubectl create -f blogpost-1.yaml
blogpost.kube.cnblogs.com/blogpost-1 created
</code></pre>
<p>创建成功之后就可以用 kubectl 命令操作 blogposts 资源</p>
<p>列出资源</p>
<pre><code class="language-bash">$ kubectl get blogposts
NAME         AGE
blogpost-1   94s
</code></pre>
<p>查看资源</p>
<pre><code class="language-bash">kubectl describe blogpostsblogpost-1
</code></pre>
<p>输出如下</p>
<pre><code>kubectl describe blogposts blogpost-1
Name:         blogpost-1
Namespace:    production
Labels:       &lt;none&gt;
Annotations:&lt;none&gt;
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:         &lt;none&gt;
</code></pre>
<p>体验完毕。</p>
<h5 id="参考资料">参考资料</h5>
<ul>
<li>Kubernetes Custom Resource Definition (CRD)</li>
<li>How To Use Kubernetes Custom Resources To Sell More Burgers</li>
<li>Extend your Kubernetes APIs with CRDs</li>
</ul><br><br>
来源:https://www.cnblogs.com/dudu/p/14494823.html
頁: [1]
查看完整版本: 初步体验 Kubernetes 的 Custom Resource Definition