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 这种类型的

需要遵循的是,将这些文件放在 <version> 目录中,例如 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

kubernetes code-generator使用的更多相关文章

  1. ABP配套代码生成器(ABP Code Generator)帮助文档,实现快速开发

    ABP代码生成器介绍 针对abp这个框架做了一个代码生成器,功能强大.分为两大功能点,一个是数据层,一个是视图层. 数据服务层:通过它,可以实现表设计.领域层初始化.多语言.automapper自动注 ...

  2. OData Client Code Generator

    转发. [Tutorial & Sample] How to use OData Client Code Generator to generate client-side proxy cla ...

  3. Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator

    Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...

  4. JAVA 调用Axis2 code generator 生成的webservice

    以下代码为调用 JAVA 调用Axis2 code generator 生成的webservice的代码. package test; import java.rmi.RemoteException; ...

  5. DNN - Modules - QR Code Generator

    Dotnetnuke 平台上的二维码模块.支持DNN 7.x平台的安装 QR码(快速响应码)是二维条形码.随着移动设备市场正以快速的步伐,QR码正在成为非常重要的营销工具.与移动电话或平板电脑的扫描, ...

  6. there was an error running the selected code generator unable to retrieve metadata for

    there was an error running the selected code generator unable to retrieve metadata for PROBLEM: I ha ...

  7. Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率

    前言 大家好,给大家带来Android开发的插件Code Generator与LayoutCreator的安装与使用,提升你的开发效率的概述,希望你们喜欢 学习目标 掌握两个插件的安装和使用,能够实现 ...

  8. 安卓自动生成代码插件-Android code Generator(转)

    编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 介绍 A ...

  9. 【2017年9月10日更新】ABP配套代码生成器(ABP Code Generator)帮助文档,实现快速开发

    ABP代码生成器介绍 ABP Code Generator 针对abp这个框架做了一个代码生成器,功能强大.分为两大功能点,一个是数据层,一个是视图层. 数据服务层:通过它,可以实现表设计.领域层初始 ...

  10. FSM Code Generator

    FSM Code Generator is a script code generator for Finite State Machine, it has a viaual designer bas ...

随机推荐

  1. Linux操作系统与项目部署

    Linux操作系统与项目部署 注意:本版块会涉及到操作系统相关知识. 现在,几乎所有智能设备都有一个自己的操作系统,比如我们的家用个人电脑,基本都是预装Windows操作系统,我们的手机也有Andro ...

  2. 我们如何上传docker到habor上呢

    Docker 打包上传habor认证 首先在 Maven 的配置文件 setting.xml 中增加相关 server 配置,主要配置 Docker registry(远程仓库)用户认证信息. < ...

  3. C++五子棋(三)——判断鼠标有效点击

    分析 在鼠标左键点击时,我们不能让新棋子在已有棋子的位置落下,同时我们还要让棋子在规定位置落下--棋盘线的交点处. 功能实现 创建数据类型 创建头文件chessData.h和源文件chessData. ...

  4. 【面试普通人VS高手系列】innoDB如何解决幻读

    前天有个去快手面试的小伙伴私信我,他遇到了这样一个问题: "InnoDB如何解决幻读"? 这个问题确实不是很好回答,在实际应用中,很多同学几乎都不关注数据库的事务隔离性. 所有问题 ...

  5. JDBC中常用的类和接口

    <零基础学Java> JDBC中常用的类和接口 利用JDBC的这些类和接口可以更方便地访问并处理存储在数据库中的数据. DriverManager类 DriverManager类 是JDB ...

  6. Net程序崩溃了怎么去查找定位问题

    工具 这里用到两个工具分别为Procdump+Windbg Procdump:ProcDump是一个命令行实用工具,主要目的是监视应用程序,以便在管理员或开发人员可用于确定峰值的原因期间监视 CPU ...

  7. JS的URIencode方式

    BEGIN; 对需要传递的URL参数进行URLencode编码 刚开始浪费了很多时间都没搞出来,不知道怎么用.后面google到了不少解决方案,最终解决.转载下面内容: js对文字进行编码涉及3个函数 ...

  8. Fastjson tomcat-dhcp链

    Fastjson tomcat-dbcp链 这条链可直接回显,可以解决fastjson在内网的情况,因为很多实战的时候,fastjson的应用部署在内网,只映射一个端口出来,导致前面学习的jdbcRo ...

  9. 彻底解决Failed to execute goal on project xxxxx

    1.错误内容:Could not resolve dependencies for project 今天在使用mvn clean package命令对一个子项目打包的时候出现如下错误(但是使用mave ...

  10. Selenium3自动化测试【29】文件上传

    日常在访问页面时,文件上传与下载操作也常常用到,因此在Web自动化测试中也会遇到文件上传的情况.针对上传功能,WebDriver并没有提供对应的方法.针对上传文件的场景主要有两种解决思路: 同步视频知 ...