0%

《Kubernetes》开发自定义controller

controller的作用就是监听资源对象的新增、删除、修改等变化

针对这些变化做出相应的响应

例如监听到deployment的replicas字段的增大,那么新增pod,其响应为创建docker容器

下图是controller的设计图

API对象的变化会通过Informer存入队列(WorkQueue),在Controller中消费队列的数据做出响应,响应相关的具体代码就是我们要做的真正业务逻辑

创建自定义资源

crd.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: students.pefish.k8s.io # 名称必须符合下面的格式:<plural>.<group>
spec:
group: pefish.k8s.io # REST API使用的组名称:/apis/<group>/<version>
version: v1alpha1 # REST API使用的版本号:/apis/<group>/<version>
names:
kind: Student # CamelCased格式的单数类型。在清单文件中使用
plural: students # URL中使用的复数名称: /apis/<group>/<version>/<plural>
singular: student # 单数名
shortNames:
- stu # 简称。类似于Service简称svc
scope: Namespaced # 范围是属于namespace的。Namespaced或Cluster

# 这是一个资源声明
1
kubectl apply -f crd.yaml

查看创建结果

1
2
3
kubectl get crd

kubectl describe crd stu

创建一个stu资源对象

stu.yaml

1
2
3
4
5
6
7
8
9
10
apiVersion: pefish.k8s.io/v1alpha1
kind: Student
metadata:
name: object-student
spec:
name: "张三"
school: "深圳中学"

# 这是一个资源对象,controller根据这个对象的参数做事情
# 类似于deployment对象,controller根据deployment对象的参数管理pod资源对象
1
kubectl apply -f stu.yaml

查看创建结果

1
kubectl get stu

至此,自定义API对象(也就是CRD)就创建成功了,此刻我们只是让k8s能识别到Student这个对象的身份

但是当我们创建Student对象的时候,还没有触发任何业务(相对于创建Pod对象的时候,会触发kubelet在node节点创建docker容器)

编写controller

下载controller模板

下面是我整理的一个模版

https://github.com/pefish/k8s-controller-template

可以先参照 README 跑起来,然后再去修改代码

修改相关代码

  • pkg/apis/pefish/v1alpha1/register.go
  • pkg/apis/pefish/v1alpha1/types.go
  • pkg/apis/pefish/register.go

从新生成代码

1
./script/gene-codes.sh

修改controller代码

  • cmd/stu-controller/controller.go
  • cmd/stu-controller/main.go

运行controller

script
1
./stu-controller -kubeconfig ~/.kube/config



微信关注我,及时接收最新技术文章