如何在K8S中创建一个自定义Controller?

本文详细介绍了如何在Kubernetes中创建自定义Controller,包括CRD资源定义、代码生成和Controller编写。通过理解Controller的工作原理和使用code-generator工具,可以实现对特定资源的管理和操作。同时,文章还讨论了Operator与Controller的区别,并提供了一些参考资料。
摘要由CSDN通过智能技术生成
  • 目的

  • 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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值