k8s operator开发与使用
Published on 2023-02-25 20:26 in 分类: Kubernetes , Golang with wushaoyu
分类: Kubernetes , Golang

k8s operator开发与使用

    k8s operator开发与使用

      本篇文章用于记录k8s operator的开发,此处以一个简单的demo来记录operator的开发过程及相关要点;本文中使用kubebuilder工具来生成相关代码。

           实现一个daemonset资源对象的operator,作用为在每个节点启动一个nginx pod。

    一、创建项目及初始化

    复制代码
    #新建demo-operator的目录
    [root@k8s-node4 data]# mkdir demo-operator
    [root@k8s-node4 data]# cd demo-operator/
    
    #Create a kubebuilder project, which requires an empty folder
    [root@k8s-node4 demo-operator]# go mod init demo-operator
    go: creating new go.mod: module demo-operator
    [root@k8s-node4 demo-operator]# kubebuilder init --domain github.io
    Writing kustomize manifests for you to edit...
    Writing scaffold for you to edit...
    Get controller runtime:
    $ go get sigs.k8s.io/controller-runtime@v0.14.1
    Update dependencies:
    $ go mod tidy
    Next: define a resource with:
    $ kubebuilder create api

     #已经生成了一些初始化目录何文件

     [root@k8s-node4 demo-operator]# ll                
     total 96
     drwx------ 6 root root 4096 Feb 25 20:23 config
     -rw------- 1 root root 1250 Feb 25 20:23 Dockerfile
     -rw-r--r-- 1 root root 2919 Feb 25 20:23 go.mod
     -rw-r--r-- 1 root root 60004 Feb 25 20:23 go.sum
     drwx------ 2 root root 4096 Feb 25 20:23 hack
     -rw------- 1 root root 3483 Feb 25 20:23 main.go
     -rw------- 1 root root 7184 Feb 25 20:23 Makefile
     -rw------- 1 root root 326 Feb 25 20:23 PROJECT
     -rw------- 1 root root 2732 Feb 25 20:23 README.md

    复制代码

     二、创建API

    复制代码
    [root@k8s-node4 demo-operator]# kubebuilder create api --group apps --version v1beta1 --kind MyDaemonset
    Create Resource [y/n]
    y
    Create Controller [y/n]
    y
    Writing kustomize manifests for you to edit...
    Writing scaffold for you to edit...
    api/v1beta1/mydaemonset_types.go
    controllers/mydaemonset_controller.go
    Update dependencies:
    $ go mod tidy
    Running make:
    $ make generate
    mkdir -p /data/demo-operator/bin
    test -s /data/demo-operator/bin/controller-gen && /data/demo-operator/bin/controller-gen --version | grep -q v0.11.1 || \
    GOBIN=/data/demo-operator/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1
    /data/demo-operator/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
    Next: implement your new API and generate the manifests (e.g. CRDs,CRs) with:
    $ make manifests
    复制代码

    三、自定义scheme模板

          此处我们将模板的spec中添加image字段,status中添加avaliableReplicas字段

     

    四、在controllers/mydaemonset_controller.go中添加逻辑

      controller工作时,是一个生产者消费者模型,Reconcile为消费类型的方法,而SetupWithManager为生产者模型的方法,默认监听我们创建我们创建的

    &appsv1beta1.MyDaemonset{}的动态,若有变更则会调用Reconcile的方法

    五、Generate crd

    #生成crd等资源
    [root@k8s-node4 demo-operator]# make manifests test -s /data/demo-operator/bin/controller-gen && /data/demo-operator/bin/controller-gen --version | grep -q v0.11.1 || \ GOBIN=/data/demo-operator/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1 /data/demo-operator/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases

           由输出可见,crd资源放在当前目录的config/crd/bases目录下,config/crd/bases/apps.github.io_mydaemonsets.yaml 文件中会记录生产的crd信息。

    六、make build & install

    复制代码
    #make build 打包
    [root@k8s-node4 demo-operator]# make build
    test -s /data/demo-operator/bin/controller-gen && /data/demo-operator/bin/controller-gen --version | grep -q v0.11.1 || \
    GOBIN=/data/demo-operator/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1
    /data/demo-operator/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
    /data/demo-operator/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
    go fmt ./...
    api/v1beta1/mydaemonset_types.go
    controllers/mydaemonset_controller.go
    go vet ./...
    go build -o bin/manager main.go
    
    #make install 将crd资源部署到k8s中
    [root@k8s-node4 demo-operator]# make install 
    test -s /data/demo-operator/bin/controller-gen && /data/demo-operator/bin/controller-gen --version | grep -q v0.11.1 || \
    GOBIN=/data/demo-operator/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1
    /data/demo-operator/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
    test -s /data/demo-operator/bin/kustomize || { curl -Ss "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash -s -- 3.8.7 /data/demo-operator/bin; }
    {Version:kustomize/v3.8.7 GitCommit:ad092cc7a91c07fdf63a2e4b7f13fa588a39af4f BuildDate:2020-11-11T23:14:14Z GoOs:linux GoArch:amd64}
    kustomize installed to /data/demo-operator/bin/kustomize
    /data/demo-operator/bin/kustomize build config/crd | kubectl apply -f -
    customresourcedefinition.apiextensions.k8s.io/mydaemonsets.apps.github.io created

    #此处可以发现crd已经创建成功

     [root@k8s-node4 demo-operator]# kubectl get customresourcedefinition.apiextensions.k8s.io/mydaemonsets.apps.github.io  
      NAME CREATED AT
      mydaemonsets.apps.github.io 2023-02-25T13:07:46Z

    复制代码

    七、make run

     

       根据输出可发现,程序已经启动成功;

    八、测试是否能够成功运行pod

      编辑config/samples/apps_v1beta1_mydaemonset.yaml文件,添加image字段,此字段为最开始我们定义scheme时的字段

     

           根据此文件创建pod

    [root@k8s-node4 samples]# kubectl apply -f apps_v1beta1_mydaemonset.yaml 
    mydaemonset.apps.github.io/mydaemonset-sample created

           此时我们查看pod信息,会发现在每一个node节点中,都运行了一个nginx的pod;

     

          并且我们可以在crd窗口看到,日志中添加的打印的输出信息;

     

    posted @   wushaoyu  阅读(966)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
    · Manus的开源复刻OpenManus初探
    · AI 智能体引爆开源社区「GitHub 热点速览」
    · 三行代码完成国际化适配,妙~啊~
    · .NET Core 中如何实现缓存的预热?
    点击右上角即可分享
    微信分享提示