kubernetes code-generator 用法: 生成 kubernetes-style 的 api 和 client 代码

Tags: kubernetes 

目录

说明

Kubernetes的api中有相当一部分代码是自动生成的,特别是api定义和调用方法,这些代码是用kubernetes/code-generator中的脚本以及命令生成的。 在实现自定义的controller的时候, 如果用到了CRD,也可以用它来生成查询、监听CRD的代码。

导入k8s.io/code-generator

创建一个空白项目:

mkdir example-1
cd example-1
dep init

Gopkg.toml中添加依赖k8s.io/code-generator:

required = [
  "k8s.io/code-generator",
]

然后用dep拉取code-generator,这个过程需要翻Q:

dep ensure -add  k8s.io/code-generator

编写API定义代码

API定义代码中会使用一些特殊的注释,code-generator根据这些注释生成相应的代码。文章Kubernetes Deep Dive: Code Generation for CustomResources对此作了详细介绍。

编写API定义代码,这里定义一个名为selfcrd资源,版本是v1:

mkdir -p internal/apis/selfcrd/v1

在internal/apis/selfcrd/v1/doc.go中设置global tag:

// Create: 2019/04/04 15:48:00 Change: 2019/04/04 15:48:22
// FileName: doc.go
// Copyright (C) 2019 lijiaocn <[email protected]>
//
// Distributed under terms of the GPL license.

// +k8s:deepcopy-gen=package

// Package v1 is the v1 version of the API.
// +groupName=crd.lijiaocn.com
package v1

“// +k8s:deepcopy-gen=package”:为这个package中的所有type生成deepcopy代码。

“// +groupName=crd.lijiaocn.com”:设置这个package对应的api group。

在internal/apis/selfcrd/v1/types.go中定义type:

// Create: 2019/04/04 15:50:00 Change: 2019/04/04 15:51:29
// FileName: types.go
// Copyright (C) 2019 lijiaocn <[email protected]>
//
// Distributed under terms of the GPL license.

package v1

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// +genclient
// +genclient:noStatus
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// SelfCRD is a top-level type. A client is created for it.
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
type SelfCRD struct {
	metav1.TypeMeta `json:",inline"`
	// +optional
	metav1.ObjectMeta `json:"metadata,omitempty"`

	// Username unique username of the consumer.
	Username string `json:"username,omitempty"`

	// CustomID existing unique ID for the consumer - useful for mapping
	// Kong with users in your existing database
	CustomID string `json:"custom_id,omitempty"`
}

// Configuration contains a plugin configuration
// +k8s:deepcopy-gen=false
type Configuration map[string]interface{}

“// +genclient”:为该type生成client代码。

“// +genclient:noStatus”:为该type生成的client代码,不包含UpdateStatus方法。

“// +genclient:nonNamespaced”:如果是集群资源,设置为不带namespace。

还支持在注释中使用以下tag:

// +genclient:noVerbs
// +genclient:onlyVerbs=create,delete
// +genclient:skipVerbs=get,list,create,update,patch,delete,deleteCollection,watch
// +genclient:method=Create,verb=create,result=k8s.io/apimachinery/pkg/apis/meta/v1.Status

生成CRD代码

生成代码之前的文件目录如下:

➜  example-1 git:(master) ✗ tree internal
internal
└── apis
    └── selfcrd
        └── v1
            ├── doc.go
            └── types.go

生成代码之前,还要准备一个代码文件模板,hack/boilerplate.go.txt,模板中的内容会在生成的代码文件中出现:

/*
Copyright 2019 The Lijiao Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
 */

运行代码生成脚本generate-groups.sh:

$ vendor/k8s.io/code-generator/generate-groups.sh all \
github.com/lijiaocn/workspace/studys/study-k8s-develop/code-generator/example-1/internal/client/selfcrd     \
github.com/lijiaocn/workspace/studys/study-k8s-develop/code-generator/example-1/internal/apis selfcrd:v1  \
--go-header-file  hack/boilerplate.go.txt

上面命令的含义是:

  1. 为第三个参数“github.com/lijiaocn/workspace/studys/study-k8s-develop/code-generator/example-1/internal/apis”中的selfcrd/v1生成client代码;

  2. 生成的client代码位于第二个参数“github.com/lijiaocn/workspace/studys/study-k8s-develop/code-generator/example-1/internal/client/selfcrd”指定的目录中;

  3. 使用模板文件hack/boilerplate.go.txt。

代码生成之后,目录结构如下:

➜  example-1 git:(master) ✗ tree internal
internal
├── apis
│   └── selfcrd
│       └── v1
│           ├── doc.go
│           ├── types.go
│           └── zz_generated.deepcopy.go
└── client
    └── selfcrd
        ├── clientset
        │   └── versioned
        │       ├── clientset.go
        │       ├── doc.go
        │       ├── fake
        │       │   ├── clientset_generated.go
        │       │   ├── doc.go
        │       │   └── register.go
        │       ├── scheme
        │       │   ├── doc.go
        │       │   └── register.go
        │       └── typed
        │           └── selfcrd
        │               └── v1
        │                   ├── doc.go
        │                   ├── fake
        │                   │   ├── doc.go
        │                   │   ├── fake_selfcrd.go
        │                   │   └── fake_selfcrd_client.go
        │                   ├── generated_expansion.go
        │                   ├── selfcrd.go
        │                   └── selfcrd_client.go
        ├── informers
        │   └── externalversions
        │       ├── factory.go
        │       ├── generic.go
        │       ├── internalinterfaces
        │       │   └── factory_interfaces.go
        │       └── selfcrd
        │           ├── interface.go
        │           └── v1
        │               ├── interface.go
        │               └── selfcrd.go
        └── listers
            └── selfcrd
                └── v1
                    ├── expansion_generated.go
                    └── selfcrd.go

参考

  1. kubernetes/code-generator
  2. Kubernetes Deep Dive: Code Generation for CustomResources

kubernetes

  1. Prometheus 采集 Kubernetes 中的 pod 的 metrics 的方法
  2. kubernetes configmap 热加载,inotifywatch 监测文件触发热更新
  3. kubernetes 百变定制: 支持的扩展点和扩展方法(api/crd/plugin...)
  4. kubernetes 调度组件 kube-scheduler 1.16.3 源代码阅读指引
  5. kubernetes 代码中的 k8s.io 是怎么回事?
  6. 旌旗招展,向网格而行!
  7. 《不一样的 双11 技术,阿里巴巴经济体云原生实践》阅读笔记
  8. kubernetes ingress-nginx 启用 upstream 长连接,需要注意,否则容易 502
  9. ingress-nginx 的限速功能在 nginx.conf 中的对应配置
  10. kubernetes 中的容器设置透明代理,自动在 HTTP 请求头中注入 Pod 信息
  11. kubernetes ingress-nginx 的测试代码(单元测试+e2e测试)
  12. kubernetes ingress-nginx http 请求复制功能与 nginx mirror 的行为差异
  13. kubernetes 基于 openresty 的 ingress-nginx 的状态和配置查询
  14. Kubernetes ingress-nginx 0.25 源代码走读笔记
  15. kubernetes ingress-nginx 的金丝雀(canary)/灰度发布功能的使用方法
  16. kubernetes code-generator 用法: 生成 kubernetes-style 的 api 和 client 代码
  17. kubernetes 操作命令 kubectl 在 shell 中的自动补全配置
  18. flannel ip 地址段扩容方法
  19. kubernetes 组件 kube-proxy 的 IPVS 功能的使用
  20. lxcfs 是什么? 怎样通过 lxcfs 在容器内显示容器的 CPU、内存状态
  21. kubernetes initializer 功能的使用方法: 在 Pod 等 Resource 落地前进行修改
  22. kubernetes 版本特性: 新特性支持版本和组件兼容版本
  23. kubernetes API 与 Operator: 不为人知的开发者战争(完整篇)
  24. kubernetes 1.12 从零开始(七): kubernetes开发资源
  25. kubernetes 1.12 从零开始(六): 从代码编译到自动部署
  26. kubernetes 网络方案 Flannel 的学习笔记
  27. kubernetes 1.12 从零开始(五): 自己动手部署 kubernetes
  28. kubernetes 1.12 从零开始(四): 必须先讲一下基本概念
  29. kubernetes 1.12 从零开始(三): 用 kubeadm 部署多节点集群
  30. kubernetes 1.12 从零开始(二): 用 minikube 部署开发测试环境
  31. kubernetes 1.12 从零开始(一): 部署环境准备
  32. kubernetes 1.12 从零开始(零): 遇到的问题与解决方法
  33. kubernetes 1.12 从零开始(初): 课程介绍与官方文档汇总
  34. 通过Prometheus查询计算Kubernetes集群中的容器CPU、内存使用率等指标
  35. 使用 grafana 和 prometheus 监控 kubernetes 集群状态
  36. 一些比较有意思的Kubernetes周边产品
  37. Borg论文阅读笔记
  38. kubelet下载pod镜像时,docker口令文件的查找顺序
  39. kubernetes 的 Client Libraries 的使用
  40. kubernetes的网络隔离networkpolicy
  41. kube-router的源码走读
  42. 使用calico的ipip模式解决k8s的跨网段通信
  43. kubernetes的调试方法
  44. kubernetes 与 calico 的衔接过程
  45. 怎样理解 kubernetes 以及微服务?
  46. kubernetes中部署有状态的复杂分布式系统
  47. kubernetes的apiserver的启动过程
  48. kubernetes的api定义与装载
  49. kubernetes的federation部署,跨区Service
  50. kubernetes的编译、打包、发布
  51. kubernetes的第三方包的使用
  52. kubernetes的Storage的实现
  53. kubernetes 的 Apiserver 的 storage 使用
  54. kubernetes的Controller-manager的工作过程
  55. kubernetes的Client端Cache
  56. kubernetes 的 Apiserver 的工作过程
  57. kubernetes的CNI插件初始化与Pod网络设置
  58. kubernetes的Pod变更过程
  59. kubernetes的kubelet的工作过程
  60. kuberntes 的 Cmdline 实现
  61. kubernetes的Pod内挂载的Service Account的使用方法
  62. kubernetes的社区资源与项目参与方式
  63. kubernetes的Kube-proxy的转发规则分析
  64. kubernetes的基本操作
  65. kubernetes在CentOS上的集群部署
  66. kubernetes在CentOS上的All In One部署
  67. 怎样选择集群管理系统?

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  李佶澳的博客  小鸟笔记  软件手册  编程手册  运营手册  网络课程  收藏文章  发现知识星球  百度搜索 谷歌搜索