一个计算机技术爱好者与学习者

0%

好好学K8S:使用client-go操作K8S

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
2
minikube start
kubectl config view

查看kubectl访问了什么url,获得了什么信息。

1
2
kubectl get nodes -v=8
kubectl get nodes -v=9

2.1. kubectl代理模式

充当反向代理模式下运行kubectl,它处理定位API服务器和进行身份验证。

1
2
kubectl proxy --port=8080 &
curl http://localhost:8080/api/


此时使用浏览器进行访问,同样可以拿到数据。

2.2. grep/cut方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Check all possible clusters, as you .KUBECONFIG may have multiple contexts:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

# Select name of cluster you want to interact with from above output:
# export CLUSTER_NAME="some_server_name"
export CLUSTER_NAME="minikube"

# Point to the API server refering the cluster name
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")

# Gets the token value
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 -d)

# Explore the API with TOKEN
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

2.3. jsonpath方法

1
2
3
APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
TOKEN=$(kubectl get secret $(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode )
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

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!

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-k8s-client-go/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~