Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用 Kubebuilder 定义 CRD 输出列

使用 Kubebuilder 定义 CRD 输出列

作者头像
我是阳明
发布于 2020-11-20 02:02:02
发布于 2020-11-20 02:02:02
2.4K00
代码可运行
举报
文章被收录于专栏:k8s技术圈k8s技术圈
运行总次数:0
代码可运行

前面我们介绍了使用 kubebuilder 开发 Operator 的示例,kubebuilder 是非常优秀的 Operator 开发框架,他可以帮我们自动生成很多代码,可以使用标准的 Go 对象来定义 CRD,此外我们还可以控制 kubectl 如何打印 CRD。

我们示例项目中开发的一个 MyApp 类型的 CRD 对象,通过这个 CRD 定义可以帮我们自动生成 Deployment 和 Service 对象。如下所示我们创建的 MyApp 的实例,我们可以使用 kubectl 命令列出这个对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get myapp
NAME         AGE
myapp-demo   5d18h

但是这个信息太过于简单,如果我们想要查看这个对象使用了什么镜像,部署了多少个副本,我们可能还需要通过 kubectl describe 命令去查看,这样就太过于麻烦了。这个时候我们就可以在 CRD 定义的结构体类型中使用 +kubebuilder:printcolumn 这个注释来告诉 kubebuilder 将我们所需的信息添加到 CRD 中,比如我们想要打印使用的镜像,在 +kubebuilder:object:root=true 注释下面添加一列新的注释,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// +kubebuilder:object:root=true
// +kubebuilder:printcolumn:name="Image",type="string",JSONPath=".spec.image",description="The Docker Image of MyAPP"
// +kubebuilder:subresource:status

// MyApp is the Schema for the myapps API
type MyApp struct {
 metav1.TypeMeta   `json:",inline"`
 metav1.ObjectMeta `json:"metadata,omitempty"`

 Spec   MyAppSpec   `json:"spec,omitempty"`
 Status MyAppStatus `json:"status,omitempty"`
}

printcolumn 注释有几个不同的选项,在这里我们只使用了其中一部分:

  • name:这是我们新增的列的标题,由 kubectl 打印在标题中
  • type:要打印的值的数据类型,有效类型为 integer、number、string、boolean 和 date
  • JSONPath:这是要打印数据的路径,在我们的例子中,镜像 image 属于 spec 下面的属性,所以我们使用 .spec.image。需要注意的是 JSONPath 属性引用的是生成的 JSON CRD
  • description:描述列的可读字符串,目前暂未发现该属性的作用...

新增了注释后,我们需要运行 make install 命令重新生成 CRD 并安装,然后我们再次尝试列出 CRD。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get myapp                   
NAME         IMAGE
myapp-demo   nginx

可以看到现在列出来的数据有一列 IMAGE 的数据了,不过却没有了之前列出来的 AGE 这一列了。这是因为当我们添加自定义列的时候,就不会再显示其他默认的列了(NAME 除外),所以如果我们还想出现 AGE 这一列,我们还需要在 MyApp 的结构体上面添加对应的注释信息,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// +kubebuilder:object:root=true
// +kubebuilder:printcolumn:name="Image",type="string",JSONPath=".spec.image",description="The Docker Image of MyAPP"
// +kubebuilder:printcolumn:name="Size",type="integer",JSONPath=".spec.size",description="Replicas of MyAPP"
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"
// +kubebuilder:subresource:status

// MyApp is the Schema for the myapps API
type MyApp struct {
 metav1.TypeMeta   `json:",inline"`
 metav1.ObjectMeta `json:"metadata,omitempty"`

 Spec   MyAppSpec   `json:"spec,omitempty"`
 Status MyAppStatus `json:"status,omitempty"`
}

运行 make install 命令行,再次查看 CRD 数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get myapp
NAME         IMAGE   SIZE   AGE
myapp-demo   nginx   3      5d18h

现在我们可以看到正则运行的应用副本数了,而且 AGE 信息也回来了,当然如果我们还想获取当前应用的状态,同样也可以通过 +kubebuilder:printcolumn 来添加对应的信息,只是状态的数据是通过 .status 在 JSONPath 属性中去获取了。

如果你觉得这里添加了太多的信息,如果我们想隐藏某个字段并只在需要时显示该字段怎么办?这个时候就需要使用 priority 这个属性了,如果没有配置这个属性,默认值为0,也就是默认情况下列出显示的数据是 priority=0 的列,如果将 priority 设置为大于1的数字,那么则只会当我们使用 -o wide 参数的时候才会显示,比如我们给 Image 这一列添加一个 priority=1 的属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// +kubebuilder:printcolumn:name="Image",type="string",priority=1,JSONPath=".spec.image",description="The Docker Image of MyAPP

同样重新运行 make install 命令后,再次查看 CRD 数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get myapp
NAME         SIZE   AGE
myapp-demo   3      5d18h

我们可以看到已经没有打印出 IMAGE 这一列了,当我们添加 -o wide 时,该列会再次显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get myapp -o wide           
NAME         IMAGE   SIZE   AGE
myapp-demo   nginx   3      5d18h

如果你还想了解更多详细信息请查看 CRD 文档上的 AdditionalPrinterColumns 字段(https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#additional-printer-columns)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Operator3-设计一个operator
前置知识Operator-1初识Operator,Operator-2从pod开始简单operator。
对你无可奈何
2022/07/28
8120
Kubernetes Operator通过CRD分层设计实现工作流编排
本文采用了分层CRD的方式实现模块化操作,使高级别的CRD可以控制低级别的CRD。这种模式在云原生应用中非常有用,尤其是对于复杂的工作流程管理。
rxg456
2025/03/09
1180
Kubernetes Operator通过CRD分层设计实现工作流编排
kubebuilder 进阶使用教程
这里,Spec和Status均是Bucket的成员变量,Status并不像Pod.Status一样,是Pod的subResource.因此,如果我们在controller的代码中调用到Status().Update(),会触发panic,并报错:the server could not find the requested resource
我是阳明
2021/03/01
5.3K0
kubernetes CRD如此简单
扩展kubernetes两个最常用最需要掌握的东西:自定义资源CRD 和 adminsion webhook, 本文教你如何十分钟掌握CRD开发.
sealyun
2019/07/30
2.5K0
kubernetes CRD如此简单
如何构建 Kubernetes CRD Controller
前一篇文章(《如何使用 CRD 拓展 Kubernetes 集群》)通过一个 Demo 讲解 CRD 是什么,以及可以提供什么能力,本文继续基于这个 Demo(https://github.com/Coderhypo/KubeService ),来讲解一下如何构建一个 CRD Controller。
CS实验室
2021/03/22
2K0
如何构建 Kubernetes CRD Controller
kubebuilder实战之四:operator需求说明和设计
Spec是用来保存用户的期望值的,也就是小欣手里的三个参数(docker镜像、单个pod的QPS、总QPS),再加上端口号:
程序员欣宸
2022/05/06
4850
kubebuilder实战之四:operator需求说明和设计
kubebuilder实战之三:基础知识速览
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 kubebuilder实战之一:准备工作 kubebuilder实战之二:初次体验kubebuilder kubebuilder实战之三:基础知识速览 kubebuilder实战之四:operator需求说明和设计 kubebuilder实战之五:operator编码 kubebuilder实战之六:构建部署运行 kubebuilder实战之七
程序员欣宸
2022/05/06
7270
kubebuilder实战之三:基础知识速览
kubebuilder实战之五:operator编码
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 kubebuilder实战之一:准备工作 kubebuilder实战之二:初次体验kubebuilder kubebuilder实战之三:基础知识速览 kubebuilder实战之四:operator需求说明和设计 kubebuilder实战之五:operator编码 kubebuilder实战之六:构建部署运行 kubebuilder实战之七
程序员欣宸
2022/05/06
5320
kubebuilder实战之五:operator编码
【k8s开发必备技能】使用client-go包访问Kubernetes CRD
Kubernetes API服务器可通过自定义资源定义轻松扩展。但是,用client-go库访问这些资源有点麻烦,官方也没有完整的文档。如kubebuilder operator-framework都能很方便的帮助我们去创建实现一个controller,但是封装的过于好导致我们并不清楚内部是怎么调用client-go的,很多场景我们是需要自己去调用接口操作CRD的而不是在controller中去访问CRD。
sealyun
2019/09/18
6.7K0
【k8s开发必备技能】使用client-go包访问Kubernetes CRD
快速上手 K8S Operator
如果你想要对 K8S 做二次开发或者说在原有的基础上封装一些功能让开发者更加好用,那么 Operator 的用法你可必须掌握。
LinkinStar
2023/10/18
2.6K1
使用code-generator创建crd controller
在 pkg/apis/{GROUP}/{VERSION}/types.go中使用,使用 // +genclient标记对应类型生成的客户端, 如果与该类型相关联的资源不是命名空间范围的(例如PersistentVolume), 则还需要附加 // + genclient:nonNamespaced标记,
有点技术
2020/07/13
3.5K0
深入 kubernetes API 的源码实现
很多同学应该像我一样,第一次打开 Github 上面 kubernetes 项目源码的时候就被各种仓库搞晕了,kuberentes 组织下有很多个仓库,包括 kubernetes、client-go、api、apimachinery 等,该从哪儿仓库看起?kubernetes 仓库应该是 kubernetes 项目的核心仓库,它包含 kubernetes 控制平面核心组件的源码;client-go 从名字也不难看出是操作 kubernetes API 的 go 语言客户端;api 与 apimachinery 应该是与 kubernetes API 相关的仓库,但它们俩为啥要分成两个不同的仓库?这些代码仓库之间如何交互?apimachinery 仓库中还有 api、apis 两个包,里面定义了各种复杂的接口与实现,清楚这些复杂接口对于扩展 kubernetes API 大有裨益。所以,这篇文章就重点关注 api 与 apimachinery 这两个仓库。
米开朗基杨
2021/04/02
1.2K0
Kubernetes CRD&Controller入门实践(附PPT)
全称Custom Resource Definition,顾名思义就是「自定义资源定义」,也就是按照官方Scheme来定义官方没有的资源struct,即创建你自己的“Pod”,Kubernetes提供了这样的入口就是方便用户扩展Kubernetes,适应更多使用场景。由于是官方配置,所以CRD有它自己的特点或者叫约束:
nevermosby
2020/05/11
2.9K0
Kubernetes CRD 自定义控制器
上文我们学习了如何使用 code-generator 来进行代码自动生成,通过代码自动生成可以帮我们自动生成 CRD 资源对象客户端访问的 ClientSet、Informer、Lister 等工具包,接下来我们来了解下如何编写一个自定义的控制器。
我是阳明
2020/10/26
2.3K0
Kubernetes CRD 自定义控制器
如何编写Kubernetes Operator
编写 Kubernetes(K8s) operator 的意图在我心中不断增长。我开始阅读文章、探索 GitHub 存储库,并就此咨询我的同事。虽然我不能说它完全成功,但这个意图仍然存在。
云云众生s
2024/05/08
1400
自己实现一个Controller——终极型
经过前两篇的学习与实操,也大致掌握了一个k8s资源的Controller写法了,如有不熟,可回顾
冬夜先生
2021/09/22
6710
利用 CRD 实现一个 mini-k8s-proxy
实现一个可以通过配置 host 拦截到匹配的请求域名,将流量代理转发到具体的 service 中(通过配置 serviceName,namespace,port,scheme)的极简网络代理工具。其中,配置通过 CRD 创建,代理程序可以通过控制器监听配置变化,动态更新,无需重启。(PS:其实就是简单模拟了 Traefik IngressRoute 的实现)
gopher云原生
2021/10/18
6190
基于operator sdk编写k8s自定义资源管理应用
在 Kubernetes 中我们使用的 Deployment, DamenSet,StatefulSet, Service,Ingress, ConfigMap, Secret 这些都是资源,而对这些资源的创建、更新、删除的动作都会被成为为事件(Event),Kubernetes 的 Controller Manager 负责事件监听,并触发相应的动作来满足期望(Spec),这种方式也就是声明式,即用户只需要关心应用程序的最终状态。当我们在使用中发现现有的这些资源不能满足我们的需求的时候,Kubernetes 提供了自定义资源(Custom Resource)和 opertor 为应用程序提供基于 kuberntes 扩展。 CRD 则是对自定义资源的描述(Custom Resource Definition),也就是介绍这个资源有什么属性呀,这些属性的类型是什么,结构是怎样的这类。
机械视角
2020/08/31
1.3K0
图解K8s源码 - k8s核心数据结构
在上一章中阿巩和大家分享了k8s组件之一kube-apiserver,在我自己阅读代码时发现k8s整体结构复杂,而且由于参与的开发者众多代码结构不免有些混乱,我往往容易陷入到某个细节而无法从整体视角梳理流程。在查阅官网文档及相关书籍后,我决定换个思路,先理解k8s核心数据结构设计,这样能够在阅读源码时做到事半功倍。好的,日拱一卒,我们开始吧!
才浅Coding攻略
2022/12/12
1K0
图解K8s源码 - k8s核心数据结构
Operator示例:通过Operator+CRD实现部署自动化
在上一篇通过Operator自动暴露集群内部服务中,遗留了一个问题:开发人员or业务上游是需要关注k8s内建资源,例如deployment如何定义,这和K8S自动化的目标背道而驰。 本篇文章将采用CRD(CustomResourceDefinition)来屏蔽底层K8S资源,让开发人员只需要按照我们制定的规则来定义CR即可。至于创建deployment,service,ingress等操作就可以交给Operator来完成,从而实现部署自动化。 而自动化就可以对接业务系统,使其实现业务价值。例如根据授权信息,创建租户购买的产品服务,当授权到期时,自动删除对应资源。
Yuyy
2024/01/22
7700
Operator示例:通过Operator+CRD实现部署自动化
相关推荐
Operator3-设计一个operator
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验