kubernetes code-generator使用

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

Overview

Kubernetes中提供了多种自定义控制器的方式:
Controller 作为CRD的核心,这里将解释如何使用 code-generator 来创建自定义的控制器,作为文章的案例,将完成一个 Firewalld Port 规则的控制器作为描述,通过 Kubernetes 规则来生成对应节点上的 iptables规则。
Prerequisites

CRD
  1. apiVersion: apiextensions.k8s.io/v1
  2. kind: CustomResourceDefinition
  3. metadata:
  4.   name: ports.firewalld.fedoraproject.org
  5. spec:
  6.   group: firewalld.fedoraproject.org
  7.   scope: Namespaced
  8.   names:
  9.     plural: ports
  10.     singular: port
  11.     kind: PortRule
  12.     shortNames:
  13.     - fp
  14.   versions:
  15.   - name: v1
  16.     served: true
  17.     storage: true
  18.     schema:
  19.       openAPIV3Schema:
  20.         type: object
  21.         properties:
  22.           spec:
  23.             type: object
  24.             properties:
  25.               name:
  26.                 type: string
  27.               port:
  28.                 type: integer
  29.               host:
  30.                 type: string
  31.               isPermanent:
  32.                 type: boolean
复制代码
code-generator

需要预先下载 code-generator 。因为这个工具不是必需要求的。
注意,下载完成后需要将代码库的的分支更改为你目前使用的版本,版本的选择与client-go类似,如果使用master分支,会与当前的 Kubernetes 集群不兼容。
  1. git clone https://github.com/kubernetes/code-generator
  2. cd code-generator; git checkout {version}  # ex. v0.18.0
复制代码
编写代码模板

要想使用 code-generator 生成控制器,必须准备三个文件 doc.go , register.go , types.go 。

  • doc.go 中声明了这个包全局内,要使用生成器的tag
  • register.go 类似于kubernetes API,是将声明的类型注册到schema中
  • type.go 是需要具体声明对象类型
code-generator Tag说明

在使用 code-generator 时,就需要对 code-generator 的tag进行了解。code-generator 的tag是根据几个固定格式进行定义的,tag是 +k8s: + conversion 的组合,在仓库中 cmd 中的 *-gen* 文件夹就代表了 conversion 的替换位置。
注:最终准备完成的文件( doc.go , register.go , types.go)应该为:apis/example.com/v1 这种类型的
需要遵循的是,将这些文件放在  目录中,例如 v1 。这里 v1, v1alpha1, 根据自己需求定义。
开始填写文件内容

type.go
  1. package v1
  2. import (
  3.         metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  4. )
  5. // +genclient
  6. // +genclient:noStatus
  7. // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
  8. type Port struct {
  9.         metav1.TypeMeta `json:",inline"`
  10.         // Standard object metadata.
  11.         // +optional
  12.         metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
  13.         // Specification of the desired behavior of the Deployment.
  14.         // +optional
  15.         Spec PortSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
  16. }
  17. // +k8s:deepcopy-gen=false
  18. type PortSpec struct {
  19.         Name        string `json:"name"`
  20.         Host        string `json:"host"`
  21.         Port        int    `json:"port"`
  22.         IsPermanent bool   `json:"isPermanent"`
  23. }
  24. // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
  25. type PortList struct {
  26.         metav1.TypeMeta `json:",inline"`
  27.         // +optional
  28.         metav1.ListMeta `json:"metadata,omitempty"`
  29.         Items []Port `json:"items"`
  30. }
复制代码
doc.go
  1. // +k8s:deepcopy-gen=package
  2. // +k8s:protobuf-gen=package
  3. // +k8s:openapi-gen=true
  4. // +groupName=firewalld.fedoraproject.org
  5. package v1 // import "k8s.io/api/firewalld/v1"
复制代码
register.go

这里是从 k8s.io/api 里任意一个复制的,例如 k8s.io/api/core/v1/register.go
  1. package v1
  2. import (
  3.         metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  4.         "k8s.io/apimachinery/pkg/runtime"
  5.         "k8s.io/apimachinery/pkg/runtime/schema"
  6. )
  7. // GroupName is the group name use in this package
  8. const GroupName = "firewalld.fedoraproject.org"
  9. // SchemeGroupVersion is group version used to register these objects
  10. var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}
  11. // Resource takes an unqualified resource and returns a Group qualified GroupResource
  12. func Resource(resource string) schema.GroupResource {
  13.         return SchemeGroupVersion.WithResource(resource).GroupResource()
  14. }
  15. var (
  16.         // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.
  17.         // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
  18.         SchemeBuilder      = runtime.NewSchemeBuilder(addKnownTypes)
  19.         localSchemeBuilder = &SchemeBuilder
  20.         AddToScheme        = localSchemeBuilder.AddToScheme
  21. )
  22. // Adds the list of known types to the given scheme.
  23. func addKnownTypes(scheme *runtime.Scheme) error {
  24.         scheme.AddKnownTypes(SchemeGroupVersion,
  25.                 &Port{},
  26.                 &PortList{},
  27.         )
  28.         metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
  29.         return nil
  30. }
复制代码
生成所需文件

使用 code-generator 时,实际上就是使用这个库中的脚本 generate-groups.sh ,该脚本又四个参数

  • 第一个参数:使用那些生成器,就是 *.gen,用逗号分割,all表示使用全部
  • 第二个参数:client(client-go中informer, lister等)生成的文件存放到哪里
  • 第三个参数:api(api结构,k8s.io/api/) 生成的文件存放到哪里,可以和定义的文件为一个目录
  • 第四个参数:定义group:version
  • -output-base:输出包存放的根目录
  • -go-header-file:生成文件的头注释信息,这个是必要参数,除非生成失败
注:对于参数二,三,与-output-base,指定的路径,这里可以使用相对路径也可以使用go.mod中的定义的包名,对于使用相对路径而言,生成的文件中的import也将会为 "../../" 的格式
一个完整的示例
  1. ../code-generator/generate-groups.sh all \
  2.         ../code-controller/client \
  3.         ../code-controller/apis  \
  4.         firewalld:v1 \
  5.         --output-base ../code-controller/ \
  6.         --go-header-file ../code-generator/hack/boilerplate.go.txt
复制代码
Reference
CRD Programming
出处:http://lc161616.cnblogs.com/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 阿里云优惠:点击力享低价墨墨学英语:帮忙点一下
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表