Kubernetes从零到精通(16-扩展-CRD、Custom Controller)

目录

一、简介

二、CRD

1.CRD介绍

2.CRD工作流程

三、Custom Controller

1.Custom Controller介绍

2.Custom Controller工作流程

四、示例

1.创建CR

2.配置权限RBAC

3.创建Custom Controller

3.1 Go项目初始化

3.2 main.go编写

3.3 构建镜像

3.4 部署Controller

4.测试CR和控制器

五、Kubebuilder示例

1.初始化项目

2.创建API和控制器        

3. 定义MyApp资源

4.生成CRD和代码 

5.实现控制器逻辑

6.部署控制器到集群

7.创建并测试MyApp资源


一、简介

        在Kubernetes中,有很多资源类型(例如Pod、Servie),这些资源是通过各种控制器来实现特定的功能(例如DeploymentController、ServiceController)。默认的功能可能不完全满足实际的需求(例如数据库集群的创建、扩缩容、备份、恢复等操作),所以,Kubernetes提供了让用户自定义资源和控制器的功能,借助这些功能,我们可以扩展Kubernetes的能力,实现类似原生资源的管理。

二、CRD

1.CRD介绍

        Custom Resource Definition(CRD)是Kubernetes中的一种API扩展机制。通过CRD,用户可以定义Kubernetes之前不存在的资源类型,并将其注册到Kubernetes API Server中,从而使其像Pod、Service这样的原生资源一样被管理和操作,当然也可以用kubectl进行管理。

        Custom Resource(CR)是由CRD定义出来的实际资源对象。CRD定义了CR的结构和行为,CR则是具体的数据实例。

2.CRD工作流程

        创建一个CustomResourceDefinition对象。

        Kubernetes API Server自动注册并开始处理这个新的API类型。

        用户可以使用这个新类型进行CRUD(创建、读取、更新、删除)操作,和内建的Kubernetes资源一样。

三、Custom Controller

1.Custom Controller介绍

        Kubernetes中的控制器是用来监控资源状态并确保集群最终状态符合声明的期望状态。对于自定义资源,Kubernetes不会自动为其提供内建的控制器,因此我们需要编写Custom Controller来管理这些自定义资源的状态。

2.Custom Controller工作流程

        监控一个或多个资源的事件(例如创建、更新、删除等)。

        根据事件更新资源的状态,或者执行一些操作以将资源状态调节到期望状态。

        控制器持续监控资源,确保状态始终如期望一致。

四、示例

        现在假设我们要创建一个自定义资源MyApp,并通过自定义控制器来管理它的副本数。

1.创建CR

        编写一个myapp-crd.yaml文件,用于定义自定义资源MyApp:

apiVersion: apiextensions.k8s.io/v1  #api
kind: CustomResourceDefinition   #CRD定义
metadata:
  name: myapps.example.com
spec:
  group: example.com       #自定义的api
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                replicas:
                  type: integer
            status:
              type: object
              properties:
                availableReplicas:
                  type: integer
  scope: Namespaced       #定制资源作用范围
  names:
    plural: myapps       #复数形式,操作定制资源时使用这个名称
    singular: myapp      #单数形式,操作定制资源时也可以使用这个名称
    kind: MyApp          #创建定制资源时使用这个名称
    shortNames:          
      - ma               #缩写形式,操作定制资源时也可以使用这个名称

        将此文件应用到 Kubernetes 集群中:

kubectl apply -f myapp-crd.yaml 

#检查是否存在该crd

kubectl get crd myapps.example.com

        到这里我们创建了一个MyApp类型的新API资源,可以用这个资源类型创建、更新和删除自定义的MyApp对象。 

2.配置权限RBAC

        控制器需要有权限访问Kubernetes资源(如自定义资源MyApp和原生的Deployment),因此需要为它设置适当的角色和权限。

        创建一个rbac.yaml文件,定义ServiceAccountRoleRoleBinding

apiVersion: v1
kind: ServiceAccount
metadata:
  name: myapp-controller
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: myapp-controller-role
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["example.com"]
  resources: ["myapps"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: myapp-controller-rolebinding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: myapp-controller-role
subjects:
- kind: ServiceAccount
  name: myapp-controller
  namespace: default

        应用这些RBAC资源:

kubectl apply -f rb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炸裂狸花猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值