基于 视频教程:k8s二次开发operator 学习 kubebuilder 的基础操作
代码仓库地址 schwarzeni/kubebuilder-imoocpod
环境
- kubebuilder: v3.0.0
- kubernetes api: v1.19.2
项目初始化
1 | # 初始化 go mod |
此时 kubebuilder 已经生成了相关的项目骨架和代码文件
1 | . |
api/v1alpha1/imoocpod_types.go
定义了 ImoocPod 的 CRD,执行命令如下命令生成 CRD 定义的 yaml 文件,文件位置在 config/crd/bases/batch.schwarzeni.github.com_imoocpods.yaml
1 | make manifests |
之后使用 kubectl 将此 CRD 定义 apply 到 k8s 上
1 | kubectl apply -f config/crd/bases/batch.schwarzeni.github.com_imoocpods.yaml |
执行如下命令在本地运行 controller
1 | make run |
执行如下命令构建 controller 镜像,第一次执行的时候需要下载相关依赖,所以速度比较慢
1 | ALL_PROXY=http://xxx:xxx make docker-build docker-push IMG=10.211.55.2:10000/imooc-operator:v1 |
注1:这里使用了本地 registry,ip 为 10.211.55.2,由于不是 https 通信,所以需要对容器运行时做相应的设置,这里使用的是 Docker,相关 insecure-registry 的配置见官网文档:https://docs.docker.com/registry/insecure/
1 | docker run -d -p 10000:5000 --restart always --name registry registry:2.7 |
注2:在构建时需要访问某些需要梯子的网络资源,这里使用了 ALL_PROXY 代理,最好也为 Docker 镜像仓库找一个国内的镜像仓库
构建完毕后执行如下命名将 ImoocPod 的 Operator 部署至 k8s 集群
1 | ALL_PROXY=http://xxx:xxx make deploy IMG=10.211.55.2:10000/imooc-operator:v1 |
部署结束后,查看集群相关信息。首先,查看集群命名空间,会发现多出了 kubebuilder-imoocpod-system
1 | kubectl get ns |
查看相关的 deployment,会发现已经成功部署了
1 | kubectl get deployment -n kubebuilder-imoocpod-system |
1 | NAME READY UP-TO-DATE AVAILABLE AGE |
使用 CRD 与 Pod 关联
下面对 Controller 的对 CRD 的编排逻辑进行编码,效果为,每启动一个 ImoocPod,都会在相同的命名空间下启动一个 busybox 的 Pod。这里对 controllers/imoocpod_controller.go
中的 ImoocPodReconciler.Reconcile
进行编写
1 | func (r *ImoocPodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { |
同时,需要为其添加操作 Pod 相关的 RBAC 权限
1 | //+kubebuilder:rbac:groups="",resources=pods,verbs=get;list;watch;create;update;patch;delete |
再次将其部署至 k8s 集群中
1 | make docker-build docker-push IMG=10.211.55.2:10000/imooc-operator:v2 |
尝试部署一个 CRD
1 | kubectl apply -f config/samples/batch_v1alpha1_imoocpod.yaml -n kubebuilder-imoocpod-system |
查看相关的 Pod
1 | kubectl get pods -n kubebuilder-imoocpod-system |
输出如下:
1 | NAME READY STATUS RESTARTS AGE |
清空相关的部署
1 | kubectl delete -f config/samples/batch_v1alpha1_imoocpod.yaml -n kubebuilder-imoocpod-system |
使用 CRD 与多个 Pod 关联
尝试实现这样的功能:CRD 指定 busybox Pod 的个数,当 CRD 更新时,Pod 的个数也会做相应的更新。
CRD 结构设计如下: api/v1alpha1/imoocpod_types.go
1 | // ImoocPodSpec defines the desired state of ImoocPod |
ImoocPodSpec 表示预期的状态,而 ImoocPodStatus 表示系统的真实状态
执行命令更新 CRD 定义的 yaml 文件 config/crd/bases/batch.schwarzeni.github.com_imoocpods.yaml
1 | make manifests |
对 controllers/imoocpod_controller.go
中的 ImoocPodReconciler.Reconcile
进行编写
1 | func (r *ImoocPodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { |
注意,由于要创建多个 Pod,方法 newPodForCR
中 Pod 的名字改成了 GenerateName
再次将其部署至 k8s 集群中
1 | make docker-build docker-push IMG=10.211.55.2:10000/imooc-operator:v3 |
更新 crd 定义
1 | kubectl apply -f config/crd/bases/batch.schwarzeni.github.com_imoocpods.yaml |
部署一个 crd 实例
1 | # config/samples/batch_v1alpha1_imoocpod.yaml |
1 | kubectl apply -f config/samples/batch_v1alpha1_imoocpod.yaml -n kubebuilder-imoocpod-system |
查看 pod 的个数
1 | > kubectl get pods -n kubebuilder-imoocpod-system |
将 config/samples/batch_v1alpha1_imoocpod.yaml
中 replicas 改为 2,apply 一下,再查看 pod 的个数
1 | > kubectl get pods -n kubebuilder-imoocpod-system |