特别提醒:

下文实验需要的yaml文件和压缩包可加我微信获取

微信: luckylucky421302

1、什么是CRD?

CRD全称是CustomResourceDefinition:

在Kubernetes 中一切都可视为资源,Kubernetes 1.7 之后增加了对 CRD 自定义资源二次开发能力来扩展 Kubernetes API,通过 CRD 我们可以向 Kubernetes API 中增加新资源类型,而不需要修改 Kubernetes 源码来创建自定义的 API server,该功能大大提高了 Kubernetes 的扩展能力。当你创建一个新的CustomResourceDefinition (CRD)时,KubernetesAPI服务器将为你指定的每个版本创建一个新的RESTful资源路径,我们可以根据该api路径来创建一些我们自己定义的类型资源。CRD可以是命名空间的,也可以是集群范围的,由CRD的作用域(scpoe)字段中所指定的,与现有的内置对象一样,删除名称空间将删除该名称空间中的所有自定义对象。customresourcedefinition本身没有名称空间,所有名称空间都可以使用。

2、自定义CRD资源

 

2.1、通过crd资源创建自定义资源,即自定义一个Restful API:

cat  crontab-crd.yaml

 

apiVersion:apiextensions.k8s.io/v1

kind:CustomResourceDefinition

metadata:

  name: crontabs.stable.example.com

spec:

  group: stable.example.com

  versions:

    - name: v1

      served: true

      storage: true

      schema:

        openAPIV3Schema:

          type: object

          properties:

            spec:

              type: object

              properties:

                cronSpec:

                  type: string

                image:

                  type: string

                replicas:

                  type: integer

  scope: Namespaced

  names:

    plural: crontabs

    singular: crontab

    kind: CronTab

    shortNames:

    - ct

 

Yaml文件注解:

metadata.name 是用户自定义资源中自己自定义的一个名字。一般我们建议使用“顶级域名.xxx.APIGroup”这样的格式,名称必须与下面的spec.Group字段匹配,格式为:<plural>.<group>

 

spec 用于指定该 CRD 的 group、version。比如在创建 Pod 或者 Deployment 时,它的 group 可能为 apps/v1 或者 apps/v1beta1 之类,这里我们也同样需要去定义 CRD 的 group。

 

group:stable.example.com #组名称

  versions:

    - name: v1

      #指定组下的版本

 

served: true

#每个版本都可以通过服务标志启用/禁用

storage: true

#必须将一个且只有一个版本标记为存储版本。

 

 scope: Namespaced

#指定crd资源作用范围在命名空间或集群

 

names 指的是它的 kind 是什么,比如 Deployment 的 kind 就是 Deployment,Pod的 kind 就是 Pod,这里的 kind 被定义为了CronTab

 

plural 字段就是一个昵称,比如当一些字段或者一些资源的名字比较长时,可以用该字段自定义一些昵称来简化它的长度;

 

 singular: crontab

# 在CLI(shell界面输入的参数)上用作别名并用于显示的单数名称

 

    shortNames:

    - ct

 

# 短名称允许短字符串匹配CLI上的资源,就是能通过kubectl 在查看资源的时候使用该资源的简名称来获取。

 

 

创建自定义contab资源
$ kubectl apply  -f crontab-crd.yaml

 

查看crd

kubectl get crd

 

查看自定义crontab资源的信息
$ kubectl get crontab

 

 

2.2、创建自定义资源的对象

根据crd对象资源创建出来的RESTful API,来创建crontab类型资源对象
cat  my-crontab.yaml

apiVersion:"stable.example.com/v1"

kind: CronTab

metadata:

  name: my-new-cron-object

spec:

  cronSpec: "* * * * * *"

image: busybox

 

kubectl apply -f my-crontab.yaml

 

#查看资源

kubectl get CronTab

显示如下:

NAME                 AGE

my-new-cron-object   9s

提示:可以看到对应类型资源已经创建成功;以上示例只是单纯的crd的使用示例,没有任何实质的作用。

 

    示例:

部署mongodb-aperator

  1、项目地址

https://github.com/mongodb/mongodb-kubernetes-operator.git

 

把课件里的压缩包传上来,手动解压

unzip mongodb-kubernetes-operator-0.5.0.zip

 

2、创建名称空间mongodb,并进入到mongodb-kubernetes-operator目录应用crd资源,创建自定义资源类型

[root@xianchaomaster1 ~]kubectl create ns mongodb

 

[root@xianchaomaster1~]# cd mongodb-kubernetes-operator-0.5.0

 

[root@xianchaomaster1mongodb-kubernetes-operator-0.5.0]# kubectl apply -fdeploy/crds/mongodb.com_mongodbcommunity_crd.yaml

 

#查看mongodb是否创建成功

kubectl getcrd/mongodbcommunity.mongodb.com

 

 3、安装operator

[root@xianchaomaster1mongodb-kubernetes-operator-0.5.0]# kubectl apply -f deploy/operator/ -nmongodb

 

提示:mongodb-kubernetes-operator这个项目是将自定义控制器和自定义资源类型分开实现的;其operator只负责创建和监听对应资源类型的变化,在资源有变化时,实例化为对应资源对象,并保持对应资源对象状态吻合用户期望状态;上述四个清单中主要是创建了一个sa账户,并对对应的sa用户授权;

 

验证:查看operator是否正常运行

[root@xianchaomaster1mongodb-kubernetes-operator-0.5.0]# kubectl get pods -n mongodb

NAME                                          READY   STATUS    RESTARTS  AGE

mongodb-kubernetes-operator-7f8c55db45-tmpk5   1/1    Running   0          44s

 

 

验证:使用自定义资源类型创建一个mongodb 副本集集群

[root@xianchaomaster1mongodb-kubernetes-operator-0.5.0]# catdeploy/crds/mongodb.com_v1_mongodbcommunity_cr.yaml

 

[root@xianchaomaster1mongodb-kubernetes-operator-0.5.0]# kubectl apply -fdeploy/crds/mongodb.com_v1_mongodbcommunity_cr.yaml -n mongodb

 

[root@xianchaomaster1mongodb-kubernetes-operator-0.5.0]# kubectl get pods -n mongodb

NAME                                          READY   STATUS    RESTARTS  AGE

example-mongodb-0                              0/2     Pending  0          66s

 

提示:这里可以看到对应pod处于pending状态;

  查看pod详细信息

 

[root@xianchaomaster1mongodb-kubernetes-operator-0.5.0]# kubectl describe pod/example-mongodb-0 -nmongodb|grep -A 10 "Events"

Events:

  Type    Reason            Age   From               Message

  ----    ------            ---- ----               -------

  Warning FailedScheduling  116s  default-scheduler  0/2 nodes are available: 2 pod has unboundimmediate PersistentVolumeClaims.

  Warning FailedScheduling  116s  default-scheduler  0/2 nodes are available: 2 pod has unboundimmediate PersistentVolumeClaims.

 

提示:这里提示没有可以用的pvc;

  删除mongodb名称空间下pvc

kubectl get pvc -nmongodb

 

kubectl delete pvc --all-n mongodb

 

 创建pv和pvc

[root@xianchaomaster1~]# cat pv-demo.yaml

apiVersion:v1

kind:PersistentVolume

metadata:

  name: nfs-pv-v1

  labels:

    app: example-mongodb-svc

spec:

  capacity:

    storage: 1Gi

  volumeMode: Filesystem

  accessModes:["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"]

  persistentVolumeReclaimPolicy: Retain

  mountOptions:

  - hard

  - nfsvers=4.1

  nfs:

    path: /data/p1

    server: 192.168.40.180

---

apiVersion:v1

kind:PersistentVolume

metadata:

  name: nfs-pv-v2

  labels:

    app: example-mongodb-svc

spec:

  capacity:

    storage: 1Gi

  volumeMode: Filesystem

  accessModes:["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"]

  persistentVolumeReclaimPolicy: Retain

  mountOptions:

  - hard

  - nfsvers=4.1

  nfs:

    path: /data/p2

    server: 192.168.40.180

---

 

apiVersion:v1

kind:PersistentVolume

metadata:

  name: nfs-pv-v3

  labels:

    app: example-mongodb-svc

spec:

  capacity:

    storage: 1Gi

  volumeMode: Filesystem

  accessModes:["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"]

  persistentVolumeReclaimPolicy: Retain

  mountOptions:

  - hard

  - nfsvers=4.1

  nfs:

    path: /data/p3

    server: 192.168.40.180

 

[root@xianchaomaster1~]# mkdir /data/p1

[root@xianchaomaster1~]# mkdir /data/p2

[root@xianchaomaster1~]# mkdir /data/p3

[root@xianchaomaster1~]# cat /etc/exports

/data/v1  *(rw,no_root_squash)

/data/p1  *(rw,no_root_squash)

/data/p2  *(rw,no_root_squash)

/data/p3  *(rw,no_root_squash)

 

[root@xianchaomaster1~]# exportfs -arv

[root@xianchaomaster1~]# kubectl apply -f pv-demo.yaml

 

创建pvc资源

[root@xianchaomaster1~]# cat pvc-demo.yaml

apiVersion:v1

kind:PersistentVolumeClaim

metadata:

  name: data-volume-example-mongodb-0

  namespace: mongodb

spec:

  accessModes:

    - ReadWriteMany

  volumeMode: Filesystem

  resources:

    requests:

      storage: 500Mi

---

apiVersion:v1

kind:PersistentVolumeClaim

metadata:

  name: data-volume-example-mongodb-1

  namespace: mongodb

spec:

  accessModes:

    - ReadWriteMany

  volumeMode: Filesystem

  resources:

    requests:

      storage: 500Mi

---

apiVersion:v1

kind:PersistentVolumeClaim

metadata:

  name: data-volume-example-mongodb-2

  namespace: mongodb

spec:

  accessModes:

    - ReadWriteMany

  volumeMode: Filesystem

  resources:

    requests:

      storage: 500M

 

[root@xianchaomaster1~]# kubectl apply -f pvc-demo.yaml

[root@master01~]# kubectl get pods -n mongodb

NAME                                                 READY   STATUS   RESTARTS   AGE

example-mongodb-0                             2/2     Running   0         8m

example-mongodb-1                             2/2     Running  0          111s

example-mongodb-2                             2/2     Running   0         48s

mongodb-kubernetes-operator-7d557bcc95-th8js  1/1     Running  0          9m19s

 

END

精彩文章推荐

从0开始轻松玩转k8s,助力企业实现智能化转型+世界500强实战项目汇总

K8s 常见问题

k8s超详细解读

K8s 超详细总结!

K8S 常见面试题总结

使用k3s部署轻量Kubernetes集群快速教程

基于Jenkins和k8s构建企业级DevOps容器云平台

k8s原生的CI/CD工具tekton

 Docker+k8s+DevOps+Istio+Rancher+CKA+k8s故障排查训练营:

https://edu.51cto.com/topic/4735.html?qd=xglj

           

                   点亮,服务器10年不宕机

 点击阅读 | 了解更多

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐