Kubernetes 使用 CRD+Controller 来扩展集群功能,官方提供了 CRD 代码的自动生成器 code-generator
其中 informer-gen 和 lister-gen 是构建 controller 的基础
| Code-gen | Desc |
|---|---|
| deepcopy-gen | 生成func (t *T) DeepCopy() *T 和func (t *T) DeepCopyInto(*T)方法 |
| client-gen | 创建类型化客户端集合(typed client sets) |
| informer-gen | 为CR创建一个informer , 当CR有变化的时候, 这个informer可以基于事件接口获取到信息变更 |
| lister-gen | 为CR创建一个listers , 就是为GET and LIST请求提供read-only caching layer |
Tag 语法
// +tag-name
或
// +tag-name=value
Tag 类型
+genclient 的意思是:请为下面这个 API 资源类型生成对应的 Client 代码。
+genclient:noStatus 的意思是:这个 API 资源类型定义里,没有 Status 字段。否则,生成的 Client 就会自动带上 UpdateStatus 方法。
+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object 的意思是:在生成 DeepCopy 的时候,实现 Kubernetes 提供的 runtime.Object 接口。否则,在某些版本的 Kubernetes 里,你的这个类型定义会出现编译错误。这是一个固定的操作
➜ tree $GOPATH/src/github.com/lqshow/k8s-custom-controllers/foobar-code-generator
.
├── artifacts
│ └── examples
│ ├── foobar-crd.yaml
│ └── foobar-example.yaml
├── go.mod
├── go.sum
└── pkg
└── apis
└── foobar
├── register.go
└── v1alpha1
├── doc.go
├── register.go
└── types.go
mkdir `PWD`/foobar-code-generator && cd `PWD`/foobar-code-generator
go mod init github.com/lqshow/k8s-custom-controllers/foobar-code-generator
mkdir -p pkg/apis/foobar/v1alpha1
package foobar
const (
GroupName = "samplecrd.basebit.me"
Version = "v1alpha1"
)
cd pkg/apis/foobar/v1alpha1
doc.go
// +k8s:deepcopy-gen=package
// +groupName=samplecrd.basebit.me
package v1alpha1
types.go
register.go
# 代码生成的工作目录,也就是我们的项目路径
ROOT_PACKAGE="github.com/lqshow/k8s-custom-controllers/foobar-code-generator"
# API Group
CUSTOM_RESOURCE_NAME="foobar"
# API Version
CUSTOM_RESOURCE_VERSION="v1alpha1"
# 执行代码自动生成,其中 pkg/generated 是生成目标目录,pkg/apis 是类型定义目录
$GOPATH/src/k8s.io/code-generator/generate-groups.sh all "$ROOT_PACKAGE/pkg/generated" "$ROOT_PACKAGE/pkg/apis" "$CUSTOM_RESOURCE_NAME:$CUSTOM_RESOURCE_VERSION"
➜ ./hack/codegen.sh
Generating deepcopy funcs
Generating clientset for foobar:v1alpha1 at github.com/lqshow/k8s-custom-controllers/foobar-code-generator/pkg/generated/clientset
Generating listers for foobar:v1alpha1 at github.com/lqshow/k8s-custom-controllers/foobar-code-generator/pkg/generated/listers
Generating informers for foobar:v1alpha1 at github.com/lqshow/k8s-custom-controllers/foobar-code-generator/pkg/generated/informers
自动生成的代码
kubectl apply -f `PWD`/artifacts/examples/foobar-crd.yaml
kubectl apply -f `PWD`/artifacts/examples/foobar-example.yaml
➜ $GOPATH/src/k8s.io/code-generator/generate-groups.sh all "$ROOT_PACKAGE/pkg/generated" "$ROOT_PACKAGE/pkg/apis" "$CUSTOM_RESOURCE_NAME:$CUSTOM_RESOURCE_VERSION"
Generating deepcopy funcs
F1008 19:54:25.625104 96258 deepcopy.go:885] Hit an unsupported type invalid type for invalid type, from github.com/lqshow/k8s-custom-controllers/foobar-code-generator/pkg/apis/foobar/v1alpha1.FooBar
Content type
Image
Digest
Size
16.1 MB
Last updated
about 7 years ago
docker pull lqshow/foobar-code-generator