目录
一、简介
二、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
文件,定义ServiceAccount
、Role
和RoleBinding
:
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