使用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