1. client-go简介
直观上看,用户可以使用kubectl、客户端库或者REST请求来访问K8S API。
而实际上,无论是kubectl还是客户端库,都是封装了REST请求的工具。
client-go作为一个客户端库,能够调用K8S API,实现对K8S集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作。
源码地址:kubernetes/client-go
接口文档:kubernetes - GoDoc
2. 通过REST访问K8S
《K8S入门篇》一文中使用kubectl对minikube进行管理,本节中直接使用REST请求来对minikube进行管理。参考Access Clusters Using the Kubernetes API,来测试一下。
kubectl处理API服务器的定位和身份验证。如果要使用curl或wget等http客户端或浏览器直接访问REST API,可以通过多种方式查找和验证API服务器:
(1)在代理模式下运行kubectl(推荐)。建议使用此方法,因为它使用存储的apiserver位置并使用自签名证书验证API服务器的标识。使用此方法无法进行中间人(MITM)攻击。
(2)直接向http客户端提供位置和凭据。这适用于被代理混淆的客户端代码。为了防止中间人攻击,需要将根证书导入浏览器。
使用Go或Python客户端库可以在代理模式下访问kubectl。
启动minikube,查看集群配置
1 | minikube start |
查看kubectl访问了什么url,获得了什么信息。
1 | kubectl get nodes -v=8 |
2.1. kubectl代理模式
充当反向代理模式下运行kubectl,它处理定位API服务器和进行身份验证。
1 | kubectl proxy --port=8080 & |
此时使用浏览器进行访问,同样可以拿到数据。
2.2. grep/cut方法
1 | # Check all possible clusters, as you .KUBECONFIG may have multiple contexts: |
2.3. jsonpath方法
1 | APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}') |
3. client-go操作K8S
client-go实际上是封装了REST请求的客户端库,能够简化我们的工作。
参考k8s-client-go项目,对k8s进行一些基本操作,包括连接k8s,创建更新deployment,查看deployment状态,查看pod状态等。
在使用该项目之前,需要获取k8s集群的配置信息:kubectl config view
把配置信息拷贝一下,粘贴到项目中的admin.conf文件中即可。
此外,k8s-client-go项目依赖client-go,因此需要参考《Golang包管理工具》安装好依赖。
4. client-go客户端类型概述
client-go 提供了几种不同类型的客户端,分别适用于不同的需求:
- REST Client:它是所有其他客户端的基础,提供底层的 HTTP/RESTful 交互能力。当我们需要自定义请求或处理非标准的 API 路径时,可以使用 REST Client。
- Typed Clients:它们是针对 Kubernetes API 中定义的具体资源类型的客户端,如 Pods、Services 等。这些客户端通常是类型安全的,可以享受静态类型语言的一些好处。
- ClientSet:这是为 Kubernetes API 的每一个版本生成的一组客户端,合并了所有核心组的 Typed Clients。ClientSet 是多个 Typed Client 的集合。如果需要处理标准资源,如 Deployments、Pods 等,可以使用 ClientSet。
- Dynamic Client:使用动态客户端,可以以非类型化的方式处理资源,这对于编写通用代码或处理自定义资源(CRDs)时非常有用。
- Discovery Client:用于发现 API 服务器支持的 API 资源集合,可以检索 API 组、版本和资源信息。
- Informers and Listers:Informers 是一种高级抽象,用于监听资源事件,并保持资源的本地缓存。Listers 作为其配套使用,从 Informers 维护的本地缓存中获取资源数据。
- Controller-Runtime Client:尽管不是 client-go 的直接一部分,controller-runtime 客户端通常与 client-go 一起使用,特别是在构建 Kubernetes Controllers 和 Operators 时。它简化了客户端的交互,并对各种 API 操作提供了更高层次的抽象。
客户端初始化方法参考代码:k8sclient.go
5. 后记
本文中学习了client-go的安装方法,然后借助k8s-client-go项目学习了client-go的基本用法。接下来,使用client-go实现在K8S集群中发布项目,go!go!go!