kubebuilder和code-generator使用

使用kubebuilder创建项目

go mod init coding.jd.com/jd-serverless

// --skip-go-version-check 跳过Go版本校验

kubebuilder init --domain coding.jd.com

// 设置后生成的api上层会自动创建Group名文件夹

kubebuilder edit --multigroup=true

kind为对象类 group为包名

kubebuilder create api --version v1 --kind ScaleRecord --group fed

添加文件apis/serving/v1/rbac.go

//+kubebuilder:rbac:groups=serving.lgy.com,resources=examples,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=serving.lgy.com,resources=examples/status,verbs=get;update;patch

package v1

生成crd manifests

make manifests

使用code-generator

hack目录下添加以下文件

[root@master hack]# tree
.
├── boilerplate.go.txt
├── tools.go
├── update-codegen.sh
└── verify-codegen.sh

tools.go

// +build tools
package tools

import _ "k8s.io/code-generator"

update-codegen.sh
注意:
MODULE和go.mod保持一致
API_PKG=apis,和apis目录保持一致
OUTPUT_PKG=generated/serving,生成Resource时指定的group一样
GROUP_VERSION=serving:v1和生成Resource时指定的group version对应

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

# corresponding to go mod init <module>
MODULE=coding.jd.com/scale-recored
# api package
APIS_PKG=apis
# generated output package
OUTPUT_PKG=client-go/scale
# group-version such as foo:v1alpha1
GROUP_VERSION=scale:v1

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)}

# kubebuilder3.4.1版本生成的api目录结构code-generator无法直接使用
rm -rf "${OUTPUT_PKG}" && mkdir -p "${OUTPUT_PKG}" # && mkdir -p "${APIS_PKG_TO}/${GROUP}/" && cp -r "${APIS_PKG}/${VERSION}" "${APIS_PKG_TO}/${GROUP}/"

# 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,lister,informer" \
  ${MODULE}/${OUTPUT_PKG} ${MODULE}/${APIS_PKG} \
  ${GROUP_VERSION} \
  --go-header-file "${SCRIPT_ROOT}"/hack/boilerplate.go.txt \
  --output-base "${SCRIPT_ROOT}"

  mv -f ${MODULE}/${OUTPUT_PKG}/* ${OUTPUT_PKG} && rm -rf coding.jd.com

verify-codegen.sh
注意:
OUTPUT_PKG=generated/serving,生成Resource时指定的group一样
MODULE是domain和go.mod的结合

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

OUTPUT_PKG=client-go/scale
MODULE=coding.jd.com/scale-recored

SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..

DIFFROOT="${SCRIPT_ROOT}/${OUTPUT_PKG}"
TMP_DIFFROOT="${SCRIPT_ROOT}/_tmp/${OUTPUT_PKG}"
_tmp="${SCRIPT_ROOT}/_tmp"

cleanup() {
  rm -rf "${_tmp}"
}
trap "cleanup" EXIT SIGINT

cleanup

mkdir -p "${TMP_DIFFROOT}"
cp -a "${DIFFROOT}"/* "${TMP_DIFFROOT}"

"${SCRIPT_ROOT}/hack/update-codegen.sh"
echo "copying generated ${SCRIPT_ROOT}/${MODULE}/${OUTPUT_PKG} to ${DIFFROOT}"
cp -r "${SCRIPT_ROOT}/${MODULE}/${OUTPUT_PKG}"/* "${DIFFROOT}"

echo "diffing ${DIFFROOT} against freshly generated codegen"
ret=0
diff -Naupr "${DIFFROOT}" "${TMP_DIFFROOT}" || ret=$?
cp -a "${TMP_DIFFROOT}"/* "${DIFFROOT}"
if [[ $ret -eq 0 ]]
then
  echo "${DIFFROOT} up to date."
else
  echo "${DIFFROOT} is out of date. Please run hack/update-codegen.sh"
  exit 1
fi


修改文件权限:

[root@master hack]# chmod 755 update-codegen.sh 
[root@master hack]# chmod 755 verify-codegen.sh 

添加注释
修改example_types.go文件,添加上tag // +genclient,这个注释内容要加在Example结构体上面,

//+genclient
//+kubebuilder:object:root=true
//+kubebuilder:subresource:status

// Example is the Schema for the examples API
type Example struct {
        metav1.TypeMeta   `json:",inline"`

新建apis/serving/v1/doc.go
// +groupName更换成自己的

// +groupName=serving.lgy.com
package v1

新建apis/serving/v1/register.go,code generator生成的代码需要用到它

package v1
import (
    "k8s.io/apimachinery/pkg/runtime/schema"
)
 
// SchemeGroupVersion is group version used to register these objects.
var SchemeGroupVersion = GroupVersion
 
func Resource(resource string) schema.GroupResource {
    return SchemeGroupVersion.WithResource(resource).GroupResource()
}

更新依赖

新增 k8s.io/code-generator,需和 k8s.io/client-go版本一致

module example

go 1.15

require (
        k8s.io/apimachinery v0.19.2
        k8s.io/client-go v0.19.2
        k8s.io/code-generator v0.19.2
        sigs.k8s.io/controller-runtime v0.7.2
)

然后给generate-groups.sh添加可执行权限:

[root@master example]# chmod 755 vendor/k8s.io/code-generator/generate-groups.sh

执行 hack/update-codegen.sh:

参考:https://www.jianshu.com/p/78652aac89f4

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛小布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值