kubebuilder构建operator时配置自动生成clientset

### make go workdir
go mod init gitee.com/dmcca/kafka-operator
### init project
kubebuilder init --domain dameng.com --repo gitee.com/dmcca/kafka-operator
### create an api
kubebuilder create api --group kafka --version v1 --kind Kafka

需要在api目录下创建code-generator所需的文件,并添加相关注释。

  • 新增 api/v1/doc.go

    **注意:**修改groupName,package与api的version保持一致。

    // +k8s:deepcopy-gen=package
    
    // Package v1 is the v1alpha1 version of the API.
    // +groupName=example.my.domain
    package v1
    
  • 新增 api/v1/register.go

    **注意:**package与api的version保持一致。

    package v1
    
    import (
        "k8s.io/apimachinery/pkg/runtime/schema"
    )
    
    // SchemeGroupVersion is group version used to register these objects.
    var SchemeGroupVersion = GroupVersion
    
    // Resource takes an unqualified resource and returns a Group qualified GroupResource
    func Resource(resource string) schema.GroupResource {
        return SchemeGroupVersion.WithResource(resource).GroupResource()
    }
    
  • 修改 api/v1/{crd}_types.go 文件,添加注释 // +genclient

    // +genclient
    // +kubebuilder:object:root=true
    
    // Guestbook is the Schema for the guestbooks API
    type Guestbook struct {
    

3.3.4 准备脚本

在项目 hack 目录下准备以下文件:

  • 新建 hack/tools.go 文件

    // +build tools
    
    package tools
    
    import _ "k8s.io/code-generator"
    
  • 新建 hack/update-codegen.sh,注意根据项目修改相应变量:

    • MODULEgo.mod 保持一致

    • API_PKG=api,和 api 目录保持一致

    • OUTPUT_PKG=generated/example,与生成Resource时指定的group保持一致

    • GROUP=example, 和生成Resource时指定的group 保持一致

    • VERSION=v1, 和生成Resource时指定的version保持一致

    • #!/usr/bin/env bash
      
      set -o errexit
      set -o nounset
      set -o pipefail
      
      # 注意:
      # 1. kubebuilder2.3.2版本生成的api目录结构code-generator无法直接使用(将api由api/${VERSION}移动至api/${GROUP}/${VERSION}即可)
      
      # corresponding to go mod init 
      MODULE=gitee.com/dmcca/kafka-operator
      # api package
      APIS_PKG=api
      # generated output package
      OUTPUT_PKG=generated/kafka 
      # group-version such as foo:v1alpha1
      GROUP=kafka 
      VERSION=v1
      GROUP_VERSION=${GROUP}:${VERSION}
      
      SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
      CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)}
      
      rm -rf ${OUTPUT_PKG}/{clientset,informers,listers}
      
      # generate the code with:
      # --output-base    because this script should also be able to run inside the vendor dir of
      #                  k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir
      #                  instead of the $GOPATH directly. For normal projects this can be dropped.
      #bash "${CODEGEN_PKG}"/generate-groups.sh "client,informer,lister" \
      bash "${CODEGEN_PKG}"/generate-groups.sh all \
        ${MODULE}/${OUTPUT_PKG} ${MODULE}/${APIS_PKG} \
        ${GROUP_VERSION} \
        --go-header-file "${SCRIPT_ROOT}"/hack/boilerplate.go.txt
      #  --output-base "${SCRIPT_ROOT}"
      #  --output-base "${SCRIPT_ROOT}/../../.."
      

注意:

  1. kubebuilder2.3.2版本生成的api目录结构code-generator无法直接使用(将api由 api/${VERSION} 移动至 api/${GROUP}/${VERSION} 即可)
  • 修改 Makefile ,添加生成命令

    update-codegen:
        chmod +x ./hack/update-codegen.sh
        ./hack/update-codegen.sh
    

3.3.5 生成代码

项目根目录下执行make update-codegen即可,将生成如下代码结构:

.
├── api
│   ├── kafka
│   │   └── v1
│   │       ├── doc.go
│   │       ├── groupversion_info.go
│   │       ├── kafka_types.go
│   │       ├── register.go
│   │       └── zz_generated.deepcopy.go
├── generated
│   └── kafka
│       ├── clientset
│       ├── informers
│       └── listers

之后便可以通过clientset等包对自定义资源对象进行操作。

注意事项:

kubebuilder2.3.2版本生成的api目录结构为 api/v1,而code-generator需要的api目录结构为 api/kafka/v1,相比较增加了group这一层。

你可能感兴趣的:(Golang,Operator,k8s,k8s)