client-go源码初探

2023-10-30 18:29:12 浏览数 (2)

Kubernetes 官方的 Go 客户端,client-go 是 Kubernetes 非常重要的一部分。它实现了 Kubernetes API 的基本操作,如创建、查询、更新和删除资源等,同时还提供了各种高级功能,如 watch、liveness/readiness probe、metrics 等。下面是对 client-go 源码的简要分析。

那么调用k8s的方式有几种:

1、使用curl命令行工具发送http请求:

代码语言:javascript复制
curl https://<api-server>/api/v1/namespaces/<namespace>/pods -H "Authorization: Bearer <token>"

2、使用k8s客户端,比如python-go

代码语言:javascript复制
from kubernetes import client, config


config.load_kube_config() # 加载kubeconfig文件或者集群信息


v1 = client.CoreV1Api()
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    print("%st%st%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))

3、使用k8s的api代理,比如kubectl proxy

代码语言:javascript复制
kubectl proxy --port=8080

然后,可以通过

代码语言:javascript复制
http://localhost:8080/api/v1/namespaces//pods访问Kubernetes API。

基本组件

client-go 的基本组件包括:

RESTClient:REST API的 HTTP 客户端,用于与 Kubernetes API Server 交互。

DynamicClient:使用RESTClient 实现的动态客户端,支持动态地查询、创建、更新和删除资源。

DiscoveryClient:使用RESTClient 实现的发现客户端,用于查询 Kubernetes API Server 中可用的 API 资源。

Informer:使用 watch 机制实现的资源事件监听器,可以监视 Kubernetes API Server 中的资源变化并及时通知订阅者。

Cache:用于存储Kubernetes 资源的缓存,支持基于内存、本地文件和远程存储等多种实现方式。

资源操作

client-go 支持对Kubernetes API 中的各种资源进行操作,如 Pod、Service、Deployment 等。对于每种资源,client-go 通常提供以下几个操作:

Create:创建指定的资源对象。

Update:更新指定的资源对象。

Delete:删除指定的资源对象。

Get:获取指定的资源对象。

List:列出符合指定条件的资源对象列表。

这些操作通常需要传入一个对应的结构体作为参数,同时还需要指定资源的名称、命名空间等信息。

watch 机制

watch 机制是Kubernetes API Server 中非常重要的一部分,它可以实时监视 Kubernetes 资源的变化并及时通知订阅者。client-go 中的 Informer 就是基于 watch 机制实现的资源事件监听器,它可以监听指定的 Kubernetes 资源并在资源发生变化时通知订阅者。通常使用如下代码来创建一个 Informer:

代码语言:javascript复制
informer := cache.NewSharedIndexInformer(
&cache.ListWatch{
ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
return clientset.CoreV1().Pods("").List(context.Background(),
options)
},
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
return clientset.CoreV1().Pods("").Watch(context.Background(),
options)
},
},
&corev1.Pod{},
resyncPeriod,
cache.Indexers{},
)

其中,ListWatch 用于指定要监听的资源,Pod{} 表示要监听的资源类型为 Pod,resyncPeriod 表示 Informer 重新同步资源的时间间隔,Indexers 用于指定 Informer 的索引策略。

缓存机制

为了提高资源访问效率,client-go 中使用了缓存机制。它可以将 Kubernetes 资源缓存到本地内存、本地文件或远程存储中,以便快速查询和更新资源。缓存机制通常包括以下几个组件:

Store:用于存储Kubernetes 资源的缓存,支持基于内存、本地文件和远程存储等多种实现方式。

Indexer:用于为缓存中的资源建立索引,以便更快地查询和更新资源。

Reflector:使用 watch 机制实现的资源同步器,可以将 Kubernetes API Server 中的资源同步到缓存中。

缓存机制的使用通常需要以下几个步骤:

创建一个 Store 对象,用于存储Kubernetes 资源。

创建一个 Indexer 对象,用于为Store 建立索引。

创建一个 Reflector 对象,用于将 Kubernetes API Server 中的资源同步到 Store 中。

创建一个 Informer 对象,用于监听 Store 中的资源变化并及时通知订阅者

这client-go是官方出品,但如果你想自己做(不建议)一个类似的客户端怎么弄,这里举一个简单的例子:

以HTTP协议为例,可以使用Go语言的net/http包进行开发。下面是一个简单的HTTP客户端,可以向指定的URL发送GET请求,并将响应内容打印出来:

代码语言:javascript复制
package main

import (
    "fmt"
    "net/http"
)

func main() {
    url := "http://example.com"
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println("HTTP request failed:", err)
        return
    }
    defer resp.Body.Close()


    fmt.Println("HTTP response status:", resp.Status)
    fmt.Println("HTTP response headers:", resp.Header)
    fmt.Println("HTTP response body:")
    if _, err := io.Copy(os.Stdout, resp.Body); err != nil {
        fmt.Println("Failed to read HTTP response body:", err)
        return
    }
}

0 人点赞