k8s CRD开发
- 开发前置环境需求
- kubebuilder
- kustomize
- k8s
- kubectl
- golang
- docker
创建crd
kubebuilder init --domain qipajun.com --license apache2 --owner "alex"
kubebuilder create api --group infra --version v1 --kind VirtulMachine
# k8s创建资源
make install
# 查看资源
➜ kubectl get crd
NAME CREATED AT
virtulmachines.infra.qipajun.com 2020-04-07T12:58:51Z
# 运行项目
make run
# 创建k8s crd资源
kubectl apply -f config/samples/
# 构建镜像
make docker-build docker-push IMG=liuhaogui/crd-demo-infra-controller:v0.0.1
# 部署到集群
make deploy IMG=liuhaogui/crd-demo-infra-controller:v0.0.1
# 查看deploy
➜ kubectl get po -A |grep crd-demo
crd-demo-system crd-demo-controller-manager-6bfc589b88-hbzxj 2/2 Running 3 100s
➜ kubectl get deploy -n crd-demo-system
NAME READY UP-TO-DATE AVAILABLE AGE
crd-demo-controller-manager 1/1 1 1 4m36s
开发需求
配置参数读取
- 结构体参数定义
api/v1/virtulmachine_types.go
type VirtulMachineSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
// Foo is an example field of VirtulMachine. Edit VirtulMachine_types.go to remove/update
Foo string `json:"foo,omitempty"`
Cpu string `json:"cpu,omitempty"`
Memory string `json:"memory,omitempty"`
// 定义所需参数
}
- 配置文件yaml设置参数
config/samples
apiVersion: infra.qipajun.com/v1
kind: VirtulMachine
metadata:
name: virtulmachine-sample
spec:
# Add fields here
foo: bar
cpu: "1"
memory: "1G"
- 实现相关事件处理 :
Reconcile
接口负责实现controller事件监听处理
func (r *VirtulMachineReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
ctx := context.Background()
log := r.Log.WithValues("virtulmachine", req.NamespacedName)
vm := &infrav1.VirtulMachine{}
if err := r.Get(ctx, req.NamespacedName, vm); err != nil {
log.Error(err, "unable to fetch vm info ")
} else {
log.Info("[vm info] ", vm.Spec.Cpu, vm.Spec.Memory)
}
return ctrl.Result{}, nil
}
kubectl apply -f config/samples/
make && make install && make run
# 启动后打印配置参数信息
...
2020-04-07T21:58:02.333+0800 INFO controllers.VirtulMachine [vm info] {"virtulmachine": "default/virtulmachine-sample", "1": "1G"}
...
状态更新
type VirtulMachineStatus struct {
Status string `json:"status"`
}
// +kubebuilder:subresource:status # 加build参数
// +kubebuilder:object:root=true
// VirtulMachine is the Schema for the virtulmachines API
type VirtulMachine struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec VirtulMachineSpec `json:"spec,omitempty"`
Status VirtulMachineStatus `json:"status,omitempty"`
}
vm.Status.Status = "Running"
if err := r.Status().Update(ctx, vm); err != nil {
log.Error(err, "unable to update vm status")
} else {
log.Info("update status success ,vm status :", vm.Status.Status)
}
time.Sleep(time.Second * 10)
if err := r.Delete(ctx, vm); err != nil {
log.Error(err, "unable to delete vm ", "vm", vm)
} else {
log.Info("delete vm success ,vm status :", vm.Status.Status)
}
# 构建运行
make && make install && make run
# apply config
kubectl apply -f config/samples/
INFO[0000] [vm info] cpu: 1 , memory : 1G source="virtulmachine_controller.go:50"
INFO[0000] update status success ,vm status :Running source="virtulmachine_controller.go:57"
INFO[0010] delete vm success ,vm status :Running source="virtulmachine_controller.go:64"
2020-04-07T22:17:26.056+0800 DEBUG controller-runtime.controller Successfully Reconciled {"controller": "virtulmachine", "request": "default/virtulmachine-sample"}
ERRO[0010] VirtulMachine.infra.qipajun.com "virtulmachine-sample" not foundunable to fetch vm info source="virtulmachine_controller.go:48"
ERRO[0010] resource name may not be emptyunable to update vm status source="virtulmachine_controller.go:55"
ERRO[0020] resource name may not be emptyunable to delete vm vm&{{ } { 0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[] map[] [] [] []} { } {Running}} source="virtulmachine_controller.go:62"
2020-04-07T22:17:36.062+0800 DEBUG controller-runtime.controller Successfully Reconciled {"controller": "virtulmachine", "request": "default/virtulmachine-sample"}