目的
CRD资源定义
代码生成
Controller编写
目的
Custom Resource
是扩展Kubernetes的一种方式(另外一种就是通过聚合层API apiserver-aggregation
),而controller对指定的resource进行监听和执行对应的动作(watch,diff,action)。
Operator与Controller区别
所有的Operator都是用了Controller模式,但并不是所有Controller都是Operator。只有当它满足: controller模式 + API扩展 + 专注于某个App/中间件时,才是一个Operator。
Operator就是使用CRD实现的定制化的Controller. 它与内置K8S Controller遵循同样的运行模式(比如 watch, diff, action)
Operator是特定领域的Controller实现
讨论两者区别:https://github.com/kubeflow/tf-operator/issues/300
所以先学习如何构建出一些自定义的Controller肯定是之后实现Operator的基础。
实现一个自定义的Controller由两部分组成:CRD和Controller逻辑代码
这里以sample-controller的代码为例,同时我们自己写的Controller也可以参考这个代码结构。
CRD资源定义
以sample-controler中的为例,我们需要创建的一个 Foo
如下example-foo.yaml:
创建该 Foo
自定义资源后,期望创建出一个名称为 example-foo
,副本数为 1
的deployment。
apiVersion: samplecontroller.k8s.io/v1alpha1
kind: Foo
metadata:
name: example-foo
spec:
deploymentName: example-foo
replicas: 1
它的CRD定义如下:
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: foos.samplecontroller.k8s.io
spec:
group: samplecontroller.k8s.io
version: v1alpha1 #版本
names:
kind: Foo # kind类型
plural: foos # API中使用的名称:/apis/<group>/<version>/<plural>
scope: Namespaced # Namespaced/Cluster,表示该CRD是命令空间属性还是集群属性
validation: # 对参数进行验证,应用openAPIV3Schema规则
openAPIV3Schema:
properties:
spec:
properties:
# 定义了一个 replicas 字段,类型为integer ,并且在1-10的范围内
replicas:
type: integer
minimum: 1
maximum: 10
更多关于crd定义规则可以参考官方文档:
https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
当把这个crd资源apply到集群中后,我们可以通过 kubectl get apiservice v1alpha1.samplecontroller.k8s.io -o yaml
命令看到注册这个 apiservice
代码编写
只需要将我们 Foo
resource相关的struct,其余的类似自定义资源的 informers
, listers
, clientset
以及 deepcopy
的代码都可以通过工具code-generator自动生成。
以及编写我们自定义Controller的业务逻辑代码就好了
struct资源定义
type.go