系列文章目录


文章目录
  • 系列文章目录
  • 前言
  • 一、CRD操作命令
  • 1.1 定义一种资源并查看
  • 1.2 使用刚刚定义的资源
  • 二、CRD效果演示
  • 2.1 实践:定义一种资源并查看
  • 2.2 实践:使用刚刚定义的资源
  • 总结



前言

CRD就是自定义资源,就是自定义 apiVersion+Kind

一、CRD操作命令

1.1 定义一种资源并查看

当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所指定的每个版本生成一个新的 RESTful 资源路径。 基于 CRD 对象所创建的自定义资源可以是名字空间作用域的,也可以是集群作用域的, 取决于 CRD 对象 spec.scope 字段的设置。

cat > resourcedefinition.yaml << EOF
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
  name: crontabs.stable.example.com
spec:
  # 组名称,用于 REST API: /apis/<组>/<版本>
  group: stable.example.com
  # 列举此 CustomResourceDefinition 所支持的版本
  versions:
    - name: v1
      # 每个版本都可以通过 served 标志来独立启用或禁止
      served: true
      # 其中一个且只有一个版本必需被标记为存储版本
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                image:
                  type: string
                replicas:
                  type: integer
  # 可以是 Namespaced 或 Cluster
  scope: Namespaced
  names:
    # 名称的复数形式,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
    plural: crontabs
    # 名称的单数形式,作为命令行使用时和显示时的别名
    singular: crontab
    # kind 通常是单数形式的驼峰命名(CamelCased)形式。你的资源清单会使用这一形式。
    kind: CronTab
    # shortNames 允许你在命令行使用较短的字符串来匹配资源
    shortNames:
    - ct
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.

执行创建

kubectl apply -f resourcedefinition.yaml
  • 1.

这样一个新的受名字空间约束的 RESTful API 端点会被创建在:

/apis/stable.example.com/v1/namespaces/
  • 1.

对象的 kind 将是来自你上面创建时 所用的 spec 中指定的 CronTab。

Kubernetes(k8s)API 的 操作可以参考我之前的文章:Kubernetes(k8s)API Server详解

kubectl get --raw /apis/stable.example.com/v1/
kubectl get --raw /apis/stable.example.com/v1/|python -m json.tool
  • 1.
  • 2.

Kubernetes_CRD自定义资源_容器

1.2 使用刚刚定义的资源

在创建了 CustomResourceDefinition 对象之后,你可以创建定制对象(Custom Objects)。定制对象可以包含定制字段。这些字段可以包含任意的 JSON 数据。 在下面的例子中,在类别为 CronTab 的定制对象中,设置了cronSpec 和 image 定制字段。类别 CronTab 来自你在上面所创建的 CRD 的规约。

cat >my-crontab.yaml<<EOF
apiVersion: "stable.example.com/v1"
kind: CronTab
metadata:
  name: my-new-cron-object
spec:
  cronSpec: "* * * * */5"
  image: my-awesome-cron-image
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

并执行创建命令:

kubectl apply -f my-crontab.yaml
  • 1.

你就可以使用 kubectl 来管理你的 CronTab 对象了。例如:

kubectl get crontab
kubectl get ct -o yaml
  • 1.
  • 2.

3)删除 CustomResourceDefinition
当你删除某 CustomResourceDefinition 时,服务器会卸载其 RESTful API 端点,并删除服务器上存储的所有定制对象。

kubectl delete -f resourcedefinition.yaml
kubectl get crontabs
  • 1.
  • 2.

二、CRD效果演示

2.1 实践:定义一种资源并查看

步骤1:定义资源

步骤2:应用资源

步骤3:查看资源

Kubernetes_CRD自定义资源_API_02


在外网访问,要么打开匿名权限,要么手动添加一个secret,操作方式见博客: https://192.168.100.152:6443/apis/stable.example.com/v1/

Kubernetes_CRD自定义资源_java_03

Kubernetes_CRD自定义资源_API_04

2.2 实践:使用刚刚定义的资源

Kubernetes_CRD自定义资源_字段_05

restful接口:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/
kubectl命令:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#patch
swagger:https://raw.githubusercontent.com/kubernetes/kubernetes/master/api/openapi-spec/swagger.json

Kubernetes_CRD自定义资源_java_06

 https://192.168.100.152:6443/apis/apps/v1/namespaces/default/deployments

Kubernetes_CRD自定义资源_字段_07

 https://192.168.100.152:6443/apis/stable.example.com/v1/namespaces/default/crontabs

Kubernetes_CRD自定义资源_java_08

 https://192.168.100.152:6443/apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object

Kubernetes_CRD自定义资源_字段_09

总结

很简单,照着操作就好了,理解就好了,一种资源就是 apiVersion + name + metadata+ spec,创建完成之后,在postman/外网能访问到,就算成功了。

唯一注意的是 kind: CustomResourceDefinition 这个好像要在比较高的版本里面才能用,我用 k8s 1.14 不行,用 k8s 1.21 才完成的。

天天打码,天天进步!!