我们在使用 Kubernetes 编写资源清单文件的时候,往往会使用类似于 Helm 或者 Kustomize 这样的工具来进行模板化处理,一来是提高了资源清单的灵活性,另一方面也确实降低了我们安装复杂的 Kubernetes 应用的门槛。本文我们尝试自己使用 Golang 来实现一个 YAML 资源清单文件模板化的方工具。
Kubernetes 官方的 Go 客户端,client-go 是 Kubernetes 非常重要的一部分。它实现了 Kubernetes API 的基本操作,如创建、查询、更新和删除资源等,同时还提供了各种高级功能,如 watch、liveness/readiness probe、metrics 等。下面是对 client-go 源码的简要分析。
在实际开发过程中,若想要获取 kubernetes 中某个资源(比如 pod)的所有对象,可以使用 kubectl、k8s REST API、client-go(ClientSet、Dynamic Client、RESTClient 三种方式) 等多种方式访问 k8s 集群获取资源。在笔者的开发过程中,最初都是直接调用 k8s 的 REST API 来获取的,使用 kubectl get pod -v=9 可以直接看到调用 k8s 的接口,然后在程序中直接访问还是比较方便的。但是随着集群规模的增长或者从国内获取海外 k8s 集群的数据,直接调用 k8s 接口获取所有 pod 还是比较耗时,这个问题有多种解决方法,最初是直接使用 k8s 原生的 watch 接口来获取的,下面是一个伪代码:
RBAC 之所以一直没有写这个,一方面是因为它确实并不复杂,二来平常确实接触不多,今天就来顺路讲讲它
以前创建和管理CRD的client库位于:https://github.com/kubernetes/apiextensions-apiserver,但是现在client-go已经支持CRD
注意:这里 Kubernetes 集群搭建使用 Minikube 来完成,Minikube 启动的单节点 k8s Node 实例是需要运行在本机的 VM 虚拟机里面,所以需要提前安装好 VM,这里我选择 Oracle VirtualBox。k8s 运行底层使用 Docker 容器,所以本机需要安装好 Docker 环境,这里忽略 Docker、VirtualBox、Minikube、Kubectl 的安装过程,可以参考之前文章 Minikube & kubectl 升级并配置, 这里着重介绍下 client-go 安装以及如何自定义操作 k8s 各资源类型。
client-go 是一种能够与 Kubernetes 集群通信的客户端,通过它可以对 Kubernetes 集群中各资源类型进行 CRUD 操作,它有三大 client 类,分别为:Clientset、DynamicClient、RESTClient。通过它,我们可以很方便的对 Kubernetes 集群 API 进行自定义开发,来满足个性化需求。
通常,在某些情况下,我们需要通用的方法去使用 Kubernetes 资源对象,而不是编写代码来处理特定类型。 比如,如下一些简单的用例参考场景:
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一:准备工作 client-go实战之二:RESTClient client-go实战之三:Clientset client-go实战之四:dynamicClient client-go实战之五:DiscoveryClient client-go实战之六:时隔两年,刷新版本继续实战 client-go实战之七:准备一个工
链接地址:https://kubernetes.io/docs/reference/using-api/client-libraries/
最近在看client-go源码最基础的部分,client-go的四类客户端,RestClient、ClientSet、DynamicClient、DiscoveryClient。其中RestClient是最基础的客户端,它对Http进行了封装,支持JSON和protobuf格式数据。其它三类客户端都是通过在REStClient基础上再次封装而得来。不过我对ClientSet和DynamicClient傻傻分不清,虽然很多资料上说它两最大区别是,ClientSet能够使用预先生成的Api和ApiServer进行通信;而DynamicClient更加强大,不仅仅能够调用预先生成的Api,还能够对一些CRD资源通过结构化嵌套类型跟ApiServer进行通信。意思大致明白前者能够调用Kubernetes本地资源类型,后者还可以调用一些自定资源,那么他们究竟是如何跟ApiServer进行交互、Pod的增删改查呢?
Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。本文将指导你如何使用Go语言通过Kubernetes API实现自动化运维。计划是先实现一个简单的,后续感兴趣可以在基础上再进行提升
本节主要讲解 Kubernetes 核心的资源类型 Scheme 的定义以及如何使用 Clientset 来获取集群资源对象。
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一:准备工作 client-go实战之二:RESTClient client-go实战之三:Clientset client-go实战之四:dynamicClient client-go实战之五:DiscoveryClient 本篇概览 本文是《client-go实战》系列的第二篇,前文咱们提到过client-go一共有
Kubernetes API服务器可通过自定义资源定义轻松扩展。但是,用client-go库访问这些资源有点麻烦,官方也没有完整的文档。如kubebuilder operator-framework都能很方便的帮助我们去创建实现一个controller,但是封装的过于好导致我们并不清楚内部是怎么调用client-go的,很多场景我们是需要自己去调用接口操作CRD的而不是在controller中去访问CRD。
Kubernetes官方从2016年8月份开始,将Kubernetes资源操作相关的核心源码抽取出来,独立出来一个项目Client-go,作为官方提供的Go client。Kubernetes的部分代码也是基于这个client实现的,所以对这个client的质量、性能等方面还是非常有信心的。
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一:准备工作 client-go实战之二:RESTClient client-go实战之三:Clientset client-go实战之四:dynamicClient client-go实战之五:DiscoveryClient 关于Clientset 本篇是《client-go实战》系列的第三篇,前文学习了最基础的客户
kubernetes 增强特性(kep)是为了解决社区中的疑难问题而创建的一个项目,每一个增强特性都对 kubernetes 的部分功能有较大的影响,需要 kubernetes 项目下的多个组(SIG)协作开发,对应的特性通常要经过 alpha、beta以及 GA 三个版本,所以每个方案的开发周期比较长,大多需要经过 9~10 个月才能完成,某些特性甚至已经讨论多年至今仍未开发完成,像 crd、dry-run、kubectl diff、pid limit 等已经开发完成的功能都是在 kep 中提出来的。本文会介绍几个比较重要的已经在 kep 中孵化的特性。
下面是kubebuilder 的架构图。可以看到最外层是通过名为Manager的组件驱动的,Manager中包含了多个组件,其中Cache中保存了gvk和informer的映射关系,用于通过informer的方式缓存kubernetes 的对象。Controller使用workqueue的方式缓存informer传递过来的对象,后续提取workqueue中的对象,传递给Reconciler进行处理。
以下是一个简单示例的Go程序,演示了如何使用Kubernetes客户端库来批量更新Pod资源对象的Label:
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一:准备工作 client-go实战之二:RESTClient client-go实战之三:Clientset client-go实战之四:dynamicClient client-go实战之五:DiscoveryClient 本篇概览 本文是《client-go实战》系列的第四篇,前文咱们学习了Clientset客户端
使用oc(同kubectl)命令访问apiserver资源的时候,会使用到/root/.kube/config文件中使用的配置。
在Kubernetes中,Pod是最小的调度单元,它由各种各样的Controller管理,比如ReplicaSet Controller,Deployment Controller等。
前面我们在使用 Clientset 的时候了解到我们可以使用 Clientset 来获取所有的原生资源对象,那么如果我们想要去一直获取集群的资源对象数据呢?岂不是需要用一个轮询去不断执行 List() 操作?这显然是不合理的,实际上除了常用的 CRUD 操作之外,我们还可以进行 Watch 操作,可以监听资源对象的增、删、改、查操作,这样我们就可以根据自己的业务逻辑去处理这些数据了。
有幸参与云原生社区举办的Kubernetes源码剖析活动,活动主要以书籍《Kubernetes源码剖析》为主要思路进行展开,提出在看书过程中遇到的问题,和社区成员一起讨论,最后会将结果总结到云原生社区的知识星球或Github。
Client-go是kubernetes官方发布的调用K8S API的golang语言包,可以用来开发K8S的管理服务、监控服务,配合前端展示,就可以开发出一款定制化的、可视化的管理或监控工具。目前最新版本为7.0,对应K8S的版本为1.10,访问链接:https://github.com/kubernetes/client-go 其中client-go与K8S版本对应关系为:
可参考:https://kubernetes.io/zh-cn/docs/reference/using-api/client-libraries/
Indexer保存了来自apiServer的资源。使用listWatch方式来维护资源的增量变化。通过这种方式可以减小对apiServer的访问,减轻apiServer端的压力
本文是《k8s自定义controller三部曲》的终篇,前面的章节中,我们创建了CRD,再通过自动生成代码的工具将controller所需的informer、client等依赖全部准备好,到了本章,就该编写controller的代码了,也就是说,现在已经能监听到Student对象的增删改等事件,接下来就是根据这些事件来做不同的事情,满足个性化的业务需求;
在进入代码之前,理解k8s的go client项目是对我们又帮助的。它是k8s client中最古老的一个,因此具有很多特性。 Client-go 没有使用Swagger生成器,就像前面我们介绍的openAPI一样。它使用的是源于k8s项目中的源代码生成工具,这个工具的目的是要生成k8s风格的对象和序列化程序。 该项目是一组包的集合,该包能够满足从REST风格的原语到复杂client的不同的编程需求。
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 kubebuilder实战之一:准备工作 kubebuilder实战之二:初次体验kubebuilder kubebuilder实战之三:基础知识速览 kubebuilder实战之四:operator需求说明和设计 kubebuilder实战之五:operator编码 kubebuilder实战之六:构建部署运行 kubebuilder实战之七
在云原生的海洋中,Kubernetes如同一艘航母,它的控制器系统则是维持应用稳定运行的“自动驾驶仪”。今天,让我们一起研究下控制器,深入理解它如何精确地管理我们的容器应用。
上节分析了Prometheus服务发现核心流程(如下图),Discoverer基于不同协议发现采集点,通过channel通知到updater协程,然后更新到discoveryManager结构体trargets字段中,最终由sender协程将discoveryManager的targets字段数据发送给scrape采集模块。
Cobra 是一个用 Go 语言编写的命令行界面 (CLI) 应用程序开发框架。它被广泛用于创建具有复杂命令结构的应用程序,例如支持嵌套命令、全局和局部标志、以及自动生成帮助和文档的应用程序。由Go团队成员spf13为hugo创建的,并被很多流行的Go项目广泛采用。比如k8s、helm、docker等等。具体清单可以查看https://github.com/spf13/cobra/blob/main/site/content/projects_using_cobra.md
前面我们说了 Informer 通过对 APIServer 的资源对象执行 List 和 Watch 操作,把获取到的数据存储在本地的缓存中,其中实现这个的核心功能就是 Reflector,我们可以称其为反射器,从名字我们可以看出来它的主要功能就是反射,就是将 Etcd 里面的数据反射到本地存储(DeltaFIFO)中。Reflector 首先通过 List 操作获取所有的资源对象数据,保存到本地存储,然后通过 Watch 操作监控资源的变化,触发相应的事件处理,比如前面示例中的 Add 事件、Update 事件、Delete 事件。
关于DiscoveryClient 本文是《client-go实战》系列的第五篇,主角是最后一种客户端:DiscoveryClient,咱们之前学习的Clientset和dynamicClient都是面向资源对象的(例如创建deployment实例、查看pod实例),而DiscoveryClient则不同,它聚焦的是资源,例如查看当前kubernetes有哪些Group、Version、Resource,下面是DiscoveryClient数据结构的字段和关联方法,再次看到了熟悉的restClient字段,
截止昨天,我们可以使用gin框架创建一个简单的web项目,实现通过访问根路径实现页面展示hello world消息。那么像昨天创建的简单项目肯定不能满足我们的调用k8s集群信息功能页面的设计需求,所以今天再接着来开发。
《client-go实战》系列是欣宸推出的实战主题原创,旨在与大家一起动手体验client-go的相关技术,从简单的实践开始,逐步深入了解client-go的强大功能,为后续的operator学习打下扎实的基础;
这部分还是以 client-go 为基础的代码测试,今天这里分享的一个是我测试过的 client-go 代码例子,
client-go连接kubernetes集群-connect and list。都是查看获取list列表的。现在想用client-go创建应用该如何操作呢?
前面我们讲到 DeltaFIFO 中的元素通过 Pop 函数弹出后,在指定的回调函数中将元素添加到了 Indexer 中。Indexer 是什么?字面意思是索引器,它就是 Informer 中的 LocalStore 部分,我们可以和数据库进行类比,数据库是建立在存储之上的,索引也是构建在存储之上,只是和数据做了一个映射,使得按照某些条件查询速度会非常快,所以说 Indexer 本身也是一个存储,只是它在存储的基础上扩展了索引功能。从 Indexer 接口的定义可以证明这一点:
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一:准备工作 client-go实战之二:RESTClient client-go实战之三:Clientset client-go实战之四:dynamicClient client-go实战之五:DiscoveryClient client-go实战之六:时隔两年,刷新版本继续实战 本篇概览 本文是《client-go
今日开发进度暂无,不过还是接着看service模块,使用go客户端,调用K8s集群接口,获取service相关信息。
在kubernetes master节点中最重要的三个组件是:kube-apiserver、kube-controller-manager、kube-scheduler 分别负责k8s集群的资源访问入口、集群状态管理、集群调度。我们在之前的文章介绍了集群资源访问入口kube-apiserver “图解K8s源码 - kube-apiserver篇”,本篇尝试梳理清楚 kube-controller-manager 是如何“Manage Controller”的。
领取专属 10元无门槛券
手把手带您无忧上云