Client-go是golang用来操作kubernetes的客户端
集群内外运行差异
out-of-cluster
此示例演示了在集群外如何使用client-go操作集群,默认读取$HOME/.kube/config
main.go
package main |
此示例每十秒请求所有default命名空间pod的数量,并且每10秒检测集群内是否有httpd-2的pod
in-cluster
此示例向您展示如何使用 client-go 配置客户端,以从 Kubernetes 集群内运行的应用程序向 Kubernetes API 进行身份验证。
当使用 rest.InClusterConfig() 时,client-go 使用安装在 Pod 内 /var/run/secrets/kubernetes.io/serviceaccount 路径的serviceaccount。
main.go
package main |
Dockerfile
FROM debian |
首先编译适用于 Linux 的应用程序:
GOOS=linux go build -o ./app . |
如果您正在运行 Minikube 集群,则可以直接在 Minikube 节点的 Docker 引擎上构建此映像,而无需将其推送到docker hub。要在 Minikube 上构建镜像:
eval $(minikube docker-env) |
如果您在集群上启用了 RBAC,请使用以下代码片段创建角色绑定,该绑定将授予默认服务帐户查看权限。不然Pod没有list get pod权限
kubectl create clusterrolebinding default-view --clusterrole=view --serviceaccount=default:default |
然后,使用在 Pod 中运行该映像:
kubectl run -i --rm demo --image=in-cluster:v1 --image-pull-policy=IfNotPresent |
要停止此示例并清理 pod,使用Ctrl + C ,然后运行:
kubectl delete deployment demo |
k8s-Deployment-CURD
main.go
package main |
编译运行
go build -o ./app |
使用Dynamic包的CURD
dynamic 包使用简单类型 unstructured.Unstructured 来表示来自 API 服务器的所有对象值。类型 Unstructured 使用嵌套 map[string]interface{} 值的集合来创建与服务器中的 REST 负载非常相似的内部结构。
main.go
package main |
运行输出如下
Creating deployment... |
workerqueue
main.go
package main |
Client种类
RestClient
RESTClient是所有客户端的父类,底层调用了Go语言net\http库,访问API Server的RESTful接口。查询pod为例
package main |
Clientset
clientset是一个经过restclient封装的client,但是只能调用集群标准资源,不能调用CRD
package main |
Dynamic
package main |
结尾
clientset 和 dynamic 是 Kubernetes 客户端库中两个不同的 API。clientset 使用预定义的资源类型和 API 版本来访问 Kubernetes API 服务器。dynamic 使用动态 API 来访问 Kubernetes API 服务器。
RESTClient 是 Kubernetes 客户端库中的基础 API。它提供了一个通用的 API 来访问任何 RESTful API 服务器。RESTClient 可以用来构建 clientset 和 dynamic 等更高级的 API。
RESTClient 的优点包括:
- 通用性:RESTClient 可以用来访问任何 RESTful API 服务器,这提供了最大的灵活性。
- 性能:RESTClient 使用 HTTP 协议来访问 API 服务器,这通常具有良好的性能。
RESTClient 的缺点包括:
- 复杂性:RESTClient 比 clientset 和 dynamic 更复杂,需要更多的代码来使用。
- 支持:RESTClient 可能不支持所有 Kubernetes API 版本。
clientset
clientset 是 Kubernetes 客户端库中的一个 API,它使用预定义的资源类型和 API 版本来访问 Kubernetes API 服务器。clientset 提供了一个简单的 API 来访问 Kubernetes 资源,包括创建、获取、更新和删除资源。
clientset 的优点包括:
- 易于使用:clientset 提供了一个简单的 API 来访问 Kubernetes 资源。
- 性能:clientset 使用预定义的资源类型和 API 版本来访问 Kubernetes API 服务器,这可以提高性能。
clientset 的缺点包括:
- 灵活性:clientset 使用预定义的资源类型和 API 版本,这可能会限制灵活性。
- 支持:clientset 可能不支持所有 Kubernetes API 版本。
dynamic
dynamic 是 Kubernetes 客户端库中的一个 API,它使用动态 API 来访问 Kubernetes API 服务器。dynamic 允许用户使用任意资源类型和 API 版本来访问 Kubernetes API 服务器。
dynamic 的优点包括:
- 灵活性:dynamic 允许用户使用任意资源类型和 API 版本,这提供了最大的灵活性。
- 支持:dynamic 支持所有 Kubernetes API 版本。
dynamic 的缺点包括:
- 复杂性:dynamic 比 clientset 更复杂,需要更多的代码来使用。
- 性能:dynamic 使用动态 API 来访问 Kubernetes API 服务器,这可能降低性能。
总结
clientset 和 dynamic 是 Kubernetes 客户端库中两个不同的 API。clientset 使用预定义的资源类型和 API 版本来访问 Kubernetes API 服务器,而 dynamic 使用动态 API 来访问 Kubernetes API 服务器。
clientset 的优点是易于使用和性能。dynamic 的优点是灵活性和支持。
选择哪种 API 取决于您的需求。如果您需要一个简单易用的 API,并且性能不是关键,那么 clientset 是一个不错的选择。如果您需要一个灵活的 API,并且需要支持所有 Kubernetes API 版本,那么 dynamic 是一个更好的选择。