Kubernetes operator 如何根据自定义类型生成响应的代码的?

分享这篇文章的主要目的,

是如何利用kubernetes来自定义类型,如SparkApplication,从而使用脚本,生成响应的代码的

这些代码是专门为自定义的类型SparkApplication对象服务的

0、最终效果如下:

1、测试环境说明

VMware + Centos 7

2、我们需要编写的文件,我测试需要3个(可能测试不够充分)

doc.go

register.go

types.go

3、创建Go工程,利用k8s的特性自定义类型

types.go的主要内容,如下(你需要根据自己的实际情况去自定义类型)

我这里仅仅截图了一部分:

doc.go的内容:

// +k8s:deepcopy-gen=package,register

// Package v1beta1 is the v1beta1 version of the API.
// +groupName=sparkoperator
package v1beta1

register.go的内容:

package v1beta1

import (
   metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
   "k8s.io/apimachinery/pkg/runtime"
   "k8s.io/apimachinery/pkg/runtime/schema"
   "xingej-go/xingej-k8s-spark/SparkOperatorOnK8sForApp/pkg/apis/spark"
)

var (
   SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
   AddToScheme   = SchemeBuilder.AddToScheme
)

// SchemeGroupVersion is the group version used to register these objects.
var SchemeGroupVersion = schema.GroupVersion{Group: spark.GroupName, Version: spark.Version}

func init() {
   SchemeBuilder.Register(addDefaultingFunc)
}

// Resource takes an unqualified resource and returns a Group-qualified GroupResource.
func Resource(resource string) schema.GroupResource {
   return SchemeGroupVersion.WithResource(resource).GroupResource()
}

func addKnownTypes(scheme *runtime.Scheme) error {
   scheme.AddKnownTypes(SchemeGroupVersion,
      &SparkApplication{},
      &SparkApplicationList{},
   )
   metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
   return nil
}

func addDefaultingFunc(scheme *runtime.Scheme) error {
   return RegisterDefaults(scheme)
}

说明,你在编写声明函数addKnownTypes时,会抛异常,不用担心,是因为缺少文件导致的(根本原因应该是你自定义的类型,并没有添加到schema里),

生成代码后,会自动消失的

编写好上面的文件后,就可以利用脚本来生成代码了

4、我自己根据git上参考的实例,编写了一个脚本,如下update-codegen.sh

具体说明:

四个参数:

第一个 参数:all, 是说,要生成所有的模块,如clientset,informers,listers等

第二个参数:xingej-go/xingej-k8s-spark/spark-operator-on-k8s-for-app/pkg/client 这个是你要生成代码的目录,目录的名称是client, 也有叫generated的

第三个参数:xingej-go/xingej-k8s-spark/spark-operator-on-k8s-for-app/pkg/apis  这个目录就是你自己创建的,里面至少包括types.go那个目录

第四个参数:"spark:v1beta1": 这个就是目录,spark是apis下的目录,v1beta1是spark下面的目录

脚本思路:

就是进入vendor下的code-generator目录,利用里面的generate-groups.sh脚本,生成代码。

其实跟git 上 参考实例中的脚本 思路大体一样的。

另外:

运行generate-groups.sh后,会在gopath目录的bin目录下,生成5个工具,如client-gen,deepcopy-gen等

就是利用这几个工具,来生成代码的。

5、如果要生成zz_generated.defaults.go文件的话,需要做两件事:

a、在自定义的类型上,多添加一个tag, 如// +k8s:defaulter-gen=true

b、修改generate-groups.sh脚本,添加对应的模块,如下面的形式:

其实,也是根据上面的if语句,参考写的。

当然,生成之后,zz_generated.defaults.go文件的内容,好像是不符合要求的,如下所示:

// Code generated by defaulter-gen. DO NOT EDIT.

package v1beta1

import (
   runtime "k8s.io/apimachinery/pkg/runtime"
)

// RegisterDefaults adds defaulters functions to the given scheme.
// Public to allow building arbitrary schemes.
// All generated defaulters are covering - they call all nested defaulters.
func RegisterDefaults(scheme *runtime.Scheme) error {
   return nil
}

生成的函数中,什么也没有做。

如果你觉得不能满足要求,也可以在函数RegisterDefaults中,自己添加必要的逻辑

6、遇到的主要问题:

Error: Failed executing generator: some packages had errors:

type k8s.io/apimachinery/pkg/runtime.Object in k8s.deepcopy-gen:interfaces tag of type k8s.io/apimachinery/pkg/runtime.Object is ont an interface, but: ""

问题描述,标签 k8s.io/apimachinery/pkg/runtime.Object 类型有问题,不是一个接口;

就是下面声明的地方

解决措施:

是因为路径问题,少添加了一个vendor

具体原因,也没有搞清楚(也不需要花费太多的时间),因为这是我第三次生成代码,前两次用的环境已经删除了,

添加上venddor就可以了,如下图所示:

,但是,会造成另一个问题,就是生成的文件zz_generated.deepcopy.go 中,导入包会报异常:

希望对其他人有所帮助

原文地址:http://blog.51cto.com/xingej/2120654

时间: 2024-08-29 20:03:37

Kubernetes operator 如何根据自定义类型生成响应的代码的?的相关文章

c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别

msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转

(转)Kubernetes Operator 快速入门教程

https://www.qikqiak.com/post/k8s-operator-101/ 在 Kubernetes 的监控方案中我们经常会使用到一个Promethues Operator的项目,该项目可以让我们更加方便的去使用 Prometheus,而不需要直接去使用最原始的一些资源对象,比如 Pod.Deployment,随着 Prometheus Operator 项目的成功,CoreOS 公司开源了一个比较厉害的工具:Operator Framework,该工具可以让开发人员更加容易的

Core Data存储自定义类型数据

目录: 一.使用CoreData存储基本数据 二.使用CoreData存储自定义类型数据 简单介绍CoreData CoreData是iOS编程中使用持久化数据存储的一种方式,我们知道CoreData并不是数据库本身,而是Apple提供的对象持久化技术--Object Persistent technology.CoreData框架为我们的数据变更.管理.对象存储.读取和恢复提供了支持.下面我们来尝试创建一个简单的CoreData Project. 操作 1. 打开x-code,为你的proje

【Spring】利用spring的JdbcTemplate查询返回结果映射到自定义类型

// org.springframework.jdbc.core.JdbcTemplate 中的查询方法基本都有支持参数RowMapper<T> rowMapper的重载方法.下面只是随便举例2个,还有很多 public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException { ... }; public <T>

Binder AIDL中自定义类型传递的源码分析

binder机制实现的IPC和共享内存的方式不同,它采取的是值拷贝的方式,即进程间传递的实体遵循Parcelable协议, Bp端负责向Parcel里写东西,Bn端负责从Parcel里读取还原,顺序是双方约定的.原型如下,Bp/Bn端收到的其实 都只是彼此的clone. Aidl(Android Interface Definition Language)简化了binder的使用,做了大量封装 但Aidl默认支持的类型包括Java 原始类型(如int.long.boolean等) 和 基础封装类

java.lang.Comparable, java.util.Compartor区别以及Hadoop中关于自定义类型中的compare方法

public interface Comparable<T> { public int compareTo(T o); } 规定了对象内部比较的方法 public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } 定义外部比较器的基本方法,其中equals是用来确定两个比较器是否相等. 关于对象内部比较和外部比较这两个接口的区别和使用场景如下: 个人总结: Compara

Hibernate中的自定义类型——UserType、CompositeUserType

一.UserType Hibernate拥有自定义映射表属性的机制,主要通过实现接口UserType,具体的UserType: import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import net.sf.hibernate.HibernateException; /** * @author hy-he * */ public interface UserType

自定义类型转化

string num1 = "12"; string num2 = "13"; int num3; int num4 = 77; bool bo; num3 = int.Parse(Convert.ToString(num2)); bo = int.TryParse(Convert.ToString(num1), out num4); Console.Write(num3 +","+bo +","+num4 ); int.Tr

WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型

首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult     (需要MVC高版本才会支持,VS2012/2013不支持,请升级DLL文件或者到VS2015开发环境) HttpResponseMessage 自定义类型 此篇就