目录
概览
Kubernetes 提供了几种自定义控制器的方法:
控制器是 CRD 的核心。在这里,我们将解释如何使用代码生成器来创建自定义控制器。作为本文的示例,我们将完成一个 Firewalld Port 规则控制器作为描述,并通过 Kubernetes 规则生成相应的节点。 iptables 规则。
先决条件CRD
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: ports.firewalld.fedoraproject.org
spec:
group: firewalld.fedoraproject.org
scope: Namespaced
names:
plural: ports
singular: port
kind: PortRule
shortNames:
- fp
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
name:
type: string
port:
type: integer
host:
type: string
isPermanent:
type: boolean
代码生成器
需要预下载代码生成器。因为这个工具不是必需的。
注意,下载完成后,需要将代码库的分支更改为当前使用的版本。版本选择类似于client-go。如果使用 master 分支,将与当前 Kubernetes 集群不兼容。
git clone https://github.com/kubernetes/code-generator
cd code-generator; git checkout {version} # ex. v0.18.0
编写代码模板
使用code-generator生成控制器,需要准备三个文件 doc.go , register.go , types.go 。
代码生成器标签说明
使用code-generator时,需要了解code-generator的标签。代码生成器的标签是根据几种固定格式定义的。标签是+k8s:+转换的组合。仓库中cmd中的*-gen*文件夹代表转换的替换位置。
注意:最终准备好的文件(doc.go、register.go、types.go)应该是:apis/example.com/v1这个类型
需要遵循的是将这些文件放在 v1 等目录中。这里v1,v1alpha1,根据自己的需要定义。
开始填写文件内容type.go
package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +genclient
// +genclient:noStatus
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type Port struct {
metav1.TypeMeta `json:",inline"`
// Standard object metadata.
// +optional
metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
// Specification of the desired behavior of the Deployment.
// +optional
Spec PortSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
}
// +k8s:deepcopy-gen=false
type PortSpec struct {
Name string `json:"name"`
Host string `json:"host"`
Port int `json:"port"`
IsPermanent bool `json:"isPermanent"`
}
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type PortList struct {
metav1.TypeMeta `json:",inline"`
// +optional
metav1.ListMeta `json:"metadata,omitempty"`
Items []Port `json:"items"`
}
doc.go
// +k8s:deepcopy-gen=package
// +k8s:protobuf-gen=package
// +k8s:openapi-gen=true
// +groupName=firewalld.fedoraproject.org
package v1 // import "k8s.io/api/firewalld/v1"
注册.go
这是从任何 k8s.io/api 复制的,例如
package v1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
)
// GroupName is the group name use in this package
const GroupName = "firewalld.fedoraproject.org"
// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}
// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
return SchemeGroupVersion.WithResource(resource).GroupResource()
}
var (
// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.
// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
localSchemeBuilder = &SchemeBuilder
AddToScheme = localSchemeBuilder.AddToScheme
)
// Adds the list of known types to the given scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(SchemeGroupVersion,
&Port{},
&PortList{},
)
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil
}
生成所需文件
在使用code-generator的时候,其实是在这个库中使用脚本generate-groups.sh,有四个参数
注意:对于参数2和3以及-output-base指定的路径,可以使用go.mod中定义的相对路径或包名。对于相对路径,生成的文件中导入的也会是“../../”格式
一个完整的例子
../code-generator/generate-groups.sh all
../code-controller/client
../code-controller/apis
firewalld:v1
--output-base ../code-controller/
--go-header-file ../code-generator/hack/boilerplate.go.txt
参考
CRD编程
暂无评论内容