特别提醒:
下文实验需要的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强实战项目汇总
Docker+k8s+DevOps+Istio+Rancher+CKA+k8s故障排查训练营:
https://edu.51cto.com/topic/4735.html?qd=xglj
点亮,服务器10年不宕机
点击阅读原文 | 了解更多