原味地址

https://haiyux.cc/2023/02/26/k8s-client-go/

client-go是什么?

client-go是Kubernetes官方提供的Go语言客户端库,用于与Kubernetes API服务器交互。使用client-go,您可以编写Go语言程序来创建、修改和删除Kubernetes对象,如Pod、Deployment、Service等。

作用

client-go的主要功能包括:

  1. 连接Kubernetes API服务器:client-go提供了一个API客户端,用于连接Kubernetes API服务器。
  2. 对象管理:client-go提供了一组API,用于创建、读取、更新和删除Kubernetes对象,如Pod、Deployment、Service等。
  3. Watch API:client-go提供了一个Watch API,可以用于监视Kubernetes对象的变化。
  4. 命名空间支持:client-go支持多个命名空间,并提供了一组API,用于管理命名空间。
  5. 认证和授权:client-go提供了一组API,用于执行身份验证和授权,以确保只有授权的用户才能对Kubernetes对象进行操作。

client-go是使用Kubernetes API的标准方式,是Kubernetes生态系统中的重要组成部分。

api client

client-go 中包含四种client,RestClient, ClientSetDynamicClientDiscoveryClient

ClientSetDynamicClientDiscoveryClient都是RestClient上的封装

RestClient

RestClient是最基础的客户端,它基于HTTP请求进行了封装,实现了RESTful API。使用RESTClient提供的RESTful方法,如Get()、Put()、Post()和Delete(),可以直接与API进行交互。同时,它支持JSON和Protocol Buffers,并支持所有原生资源和自定义资源定义(CRDs)。然而,为了更加优雅地处理API交互,一般需要进一步封装,通过Clientset对RESTClient进行封装,然后再对外提供接口和服务。

package main

import (
"context"
"fmt"
"path/filepath" corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
) func main() {
// 使用kubeconfig生成配置
config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config"))
if err != nil {
panic(err)
}
config.APIPath = "api"
config.GroupVersion = &corev1.SchemeGroupVersion
config.NegotiatedSerializer = scheme.Codecs // 生成restClient
restClient, err := rest.RESTClientFor(config)
if err != nil {
panic(err)
} rest := &corev1.PodList{}
if err = restClient.Get().Namespace("default").Resource("pods").VersionedParams(&metav1.ListOptions{},
scheme.ParameterCodec).Do(context.TODO()).Into(rest); err != nil {
panic(err)
}
for _, v := range rest.Items {
fmt.Printf("NameSpace: %v Name: %v Status: %v \n", v.Namespace, v.Name, v.Status.Phase)
}
} /*
结果
NameSpace: default Name: nginx-76d6c9b8c-8ljkt Status: Running
NameSpace: default Name: nginx-76d6c9b8c-jqv9h Status: Running
NameSpace: default Name: nginx-76d6c9b8c-kr9d2 Status: Running
NameSpace: default Name: nginx-76d6c9b8c-m4g5l Status: Running
NameSpace: default Name: nginx-76d6c9b8c-n8st9 Status: Running
*/

ClientSet

ClientSet是在RestClient的基础上封装了对资源和版本的管理方法。资源可以理解为一个客户端,而ClientSet是多个客户端的集合。在操作资源对象时,需要指定Group和Version,然后根据资源获取。然而,ClientSet不支持自定义资源定义(CRDs),但使用kubebuilder生成代码时,会生成相应的ClientSet。

package main

import (
"context"
"fmt"
"path/filepath" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
) func main() {
ctx := context.Background()
// 使用kubeconfig生成配置 ~/.kube/config
config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config"))
if err != nil {
panic(err)
}
// 生成clientSet
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
nodeList, err := clientSet.CoreV1().Nodes().List(ctx, metav1.ListOptions{})
if err != nil {
panic(err)
}
for _, node := range nodeList.Items {
fmt.Printf("nodeName: %v, status: %v \n", node.GetName(), node.GetCreationTimestamp())
}
// pod 是有namespace资源所以指定namespace 而node没有
pods, err := clientSet.CoreV1().Pods("default").List(ctx, metav1.ListOptions{})
if err != nil {
panic(err)
}
for _, v := range pods.Items {
fmt.Printf("namespace: %v podName: %v status: %v \n", v.Namespace, v.Name, v.Status.Phase)
}
} /*
结果:
nodeName: minikube, status: 2023-01-27 18:45:35 +0800 CST
nodeName: minikube-m02, status: 2023-02-26 21:19:30 +0800 CST
nodeName: minikube-m03, status: 2023-02-26 21:19:38 +0800 CST
namespace: default podName: nginx-76d6c9b8c-8ljkt status: Running
namespace: default podName: nginx-76d6c9b8c-jqv9h status: Running
namespace: default podName: nginx-76d6c9b8c-kr9d2 status: Running
namespace: default podName: nginx-76d6c9b8c-m4g5l status: Running
namespace: default podName: nginx-76d6c9b8c-n8st9 status: Running
*/

DynamicClient

DynamicClient是一种动态客户端,它可以对任何资源进行RESTful操作,包括自定义资源定义(CRD)。与ClientSet不同,DynamicClient返回的对象是一个map[string]interface{}。如果一个控制器需要控制所有的API,可以使用DynamicClient。目前,DynamicClient在垃圾回收器和命名空间控制器中被广泛使用。

DynamicClient的处理过程将Resource(例如PodList)转换为unstructured类型。Kubernetes的所有资源都可以转换为这个结构类型。处理完毕后,再将其转换回PodList。整个转换过程类似于接口转换,即通过interface{}的断言实现。

DynamicClient是一种动态的客户端,它能处理Kubernetes所有的资源,但仅支持JSON

package main

import (
"context"
"fmt"
"path/filepath" apiv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
) func main() {
ctx := context.Background()
// 使用kubeconfig生成配置 ~/.kube/config
config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config"))
if err != nil {
panic(err)
}
// dynamicClient
dynamicClient, err := dynamic.NewForConfig(config)
if err != nil {
panic(err)
}
// 定义组版本资源
gvr := schema.GroupVersionResource{Version: "v1", Resource: "pods"}
unStructObj, err := dynamicClient.Resource(gvr).Namespace("default").List(ctx, metav1.ListOptions{})
if err != nil {
panic(err)
}
podList := &apiv1.PodList{} if err = runtime.DefaultUnstructuredConverter.FromUnstructured(unStructObj.UnstructuredContent(), podList); err != nil {
panic(err)
} for _, v := range podList.Items {
fmt.Printf("namespaces:%v podName:%v status:%v \n", v.Namespace, v.Name, v.Status.Phase)
}
} /*
namespaces:default podName:nginx-76d6c9b8c-8ljkt status:Running
namespaces:default podName:nginx-76d6c9b8c-jqv9h status:Running
namespaces:default podName:nginx-76d6c9b8c-kr9d2 status:Running
namespaces:default podName:nginx-76d6c9b8c-m4g5l status:Running
namespaces:default podName:nginx-76d6c9b8c-n8st9 status:Running
*/

其中,GVR(group,version,resource) 用于标识 Kubernetes API 中的资源类型,其中 Group 表示 API 群组,Version 表示 API 版本,Resource 表示资源类型。例如,Deployment 的 GVR 为 "apps/v1/deployments",其中 "apps" 是 API 群组,"v1" 是 API 版本,"deployments" 是资源类型。

DiscoveryClient

DiscoveryClient 是一个发现客户端,它的主要作用是用于发现 API Server 支持的资源组、资源版本和资源信息。在 Kubernetes 中,API Server 支持很多资源组、资源版本和资源信息,我们可以通过使用 DiscoveryClient 来查看这些信息。此外,kubectl 的 API 版本和 API 资源也是通过 DiscoveryClient 来实现的。我们还可以将这些信息缓存到本地,以减轻 API 访问的压力。缓存文件默认存储在 ./kube/cache./kube/http-cache 目录下。

package main

import (
"fmt"
"path/filepath" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
) func main() {
// 使用kubeconfig生成配置 ~/.kube/config
config, err := clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config"))
if err != nil {
panic(err)
}
// 生成discoverClient
discoverClient, err := discovery.NewDiscoveryClientForConfig(config)
if err != nil {
panic(err)
}
_, apiResourceList, err := discoverClient.ServerGroupsAndResources()
for _, v := range apiResourceList {
gv, err := schema.ParseGroupVersion(v.GroupVersion)
if err != nil {
panic(err)
}
for _, resource := range v.APIResources {
fmt.Printf("name:%v group:%v version:%v\n", resource.Name, gv.Group, gv.Version)
}
}
} /*
name:bindings group: version:v1
name:componentstatuses group: version:v1
name:configmaps group: version:v1
name:endpoints group: version:v1
name:events group: version:v1
name:limitranges group: version:v1
name:namespaces group: version:v1
name:namespaces/finalize group: version:v1
name:namespaces/status group: version:v1
name:nodes group: version:v1
name:nodes/proxy group: version:v1
name:nodes/status group: version:v1
name:persistentvolumeclaims group: version:v1
name:persistentvolumeclaims/status group: version:v1
name:persistentvolumes group: version:v1
name:persistentvolumes/status group: version:v1
name:pods group: version:v1
name:pods/attach group: version:v1
name:pods/binding group: version:v1
name:pods/ephemeralcontainers group: version:v1
name:pods/eviction group: version:v1
name:pods/exec group: version:v1
name:pods/log group: version:v1
name:pods/portforward group: version:v1
name:pods/proxy group: version:v1
name:pods/status group: version:v1
name:podtemplates group: version:v1
name:replicationcontrollers group: version:v1
name:replicationcontrollers/scale group: version:v1
name:replicationcontrollers/status group: version:v1
name:resourcequotas group: version:v1
name:resourcequotas/status group: version:v1
name:secrets group: version:v1
name:serviceaccounts group: version:v1
name:serviceaccounts/token group: version:v1
name:services group: version:v1
name:services/proxy group: version:v1
name:services/status group: version:v1
name:apiservices group:apiregistration.k8s.io version:v1
name:apiservices/status group:apiregistration.k8s.io version:v1
name:controllerrevisions group:apps version:v1
name:daemonsets group:apps version:v1
name:daemonsets/status group:apps version:v1
name:deployments group:apps version:v1
name:deployments/scale group:apps version:v1
name:deployments/status group:apps version:v1
name:replicasets group:apps version:v1
name:replicasets/scale group:apps version:v1
name:replicasets/status group:apps version:v1
name:statefulsets group:apps version:v1
name:statefulsets/scale group:apps version:v1
name:statefulsets/status group:apps version:v1
name:events group:events.k8s.io version:v1
name:tokenreviews group:authentication.k8s.io version:v1
name:localsubjectaccessreviews group:authorization.k8s.io version:v1
name:selfsubjectaccessreviews group:authorization.k8s.io version:v1
name:selfsubjectrulesreviews group:authorization.k8s.io version:v1
name:subjectaccessreviews group:authorization.k8s.io version:v1
name:horizontalpodautoscalers group:autoscaling version:v2
name:horizontalpodautoscalers/status group:autoscaling version:v2
name:horizontalpodautoscalers group:autoscaling version:v1
name:horizontalpodautoscalers/status group:autoscaling version:v1
name:horizontalpodautoscalers group:autoscaling version:v2beta2
name:horizontalpodautoscalers/status group:autoscaling version:v2beta2
name:cronjobs group:batch version:v1
name:cronjobs/status group:batch version:v1
name:jobs group:batch version:v1
name:jobs/status group:batch version:v1
name:certificatesigningrequests group:certificates.k8s.io version:v1
name:certificatesigningrequests/approval group:certificates.k8s.io version:v1
name:certificatesigningrequests/status group:certificates.k8s.io version:v1
name:ingressclasses group:networking.k8s.io version:v1
name:ingresses group:networking.k8s.io version:v1
name:ingresses/status group:networking.k8s.io version:v1
name:networkpolicies group:networking.k8s.io version:v1
name:networkpolicies/status group:networking.k8s.io version:v1
name:poddisruptionbudgets group:policy version:v1
name:poddisruptionbudgets/status group:policy version:v1
name:clusterrolebindings group:rbac.authorization.k8s.io version:v1
name:clusterroles group:rbac.authorization.k8s.io version:v1
name:rolebindings group:rbac.authorization.k8s.io version:v1
name:roles group:rbac.authorization.k8s.io version:v1
name:csidrivers group:storage.k8s.io version:v1
name:csinodes group:storage.k8s.io version:v1
name:csistoragecapacities group:storage.k8s.io version:v1
name:storageclasses group:storage.k8s.io version:v1
name:volumeattachments group:storage.k8s.io version:v1
name:volumeattachments/status group:storage.k8s.io version:v1
name:csistoragecapacities group:storage.k8s.io version:v1beta1
name:mutatingwebhookconfigurations group:admissionregistration.k8s.io version:v1
name:validatingwebhookconfigurations group:admissionregistration.k8s.io version:v1
name:customresourcedefinitions group:apiextensions.k8s.io version:v1
name:customresourcedefinitions/status group:apiextensions.k8s.io version:v1
name:priorityclasses group:scheduling.k8s.io version:v1
name:leases group:coordination.k8s.io version:v1
name:runtimeclasses group:node.k8s.io version:v1
name:endpointslices group:discovery.k8s.io version:v1
name:flowschemas group:flowcontrol.apiserver.k8s.io version:v1beta2
name:flowschemas/status group:flowcontrol.apiserver.k8s.io version:v1beta2
name:prioritylevelconfigurations group:flowcontrol.apiserver.k8s.io version:v1beta2
name:prioritylevelconfigurations/status group:flowcontrol.apiserver.k8s.io version:v1beta2
name:flowschemas group:flowcontrol.apiserver.k8s.io version:v1beta1
name:flowschemas/status group:flowcontrol.apiserver.k8s.io version:v1beta1
name:prioritylevelconfigurations group:flowcontrol.apiserver.k8s.io version:v1beta1
name:prioritylevelconfigurations/status group:flowcontrol.apiserver.k8s.io version:v1beta1
name:nodes group:metrics.k8s.io version:v1beta1
name:pods group:metrics.k8s.io version:v1beta1
*/

informer indexer lister机制

上图展示了自定义控制器的工作方式。在虚线上方,是client-go包的informer和indexer工作方式。informer负责监听Kubernetes API资源对象的变化,如创建、更新、删除等操作,并将这些变化通知给indexer进行索引和缓存。而indexer则是将API对象进行索引,以便在需要时快速地访问它们。lister则是对indexer的封装,提供了一种简单的方式来获取已经索引的对象列表,以供代码中的其他部分使用。这种分层结构的设计使得client-go可以高效地处理Kubernetes资源对象的变化,并在应用程序中方便地使用这些资源对象。

informer

Informer是Kubernetes API客户端中一种重要的机制,它可以实现对资源对象的监视和事件通知。当Kubernetes集群中的资源对象发生变化时,Informer可以及时地获取到这些变化,并将这些变化以事件的形式通知给相关的监听器。Informer通过调用API Server提供的REST接口,以及Kubernetes中定义的watch机制,实现了对集群资源对象的全面监视。

下面是一个简单的pod informer示例,用于监控所有pod的变化并将其放入队列中,worker从队列中取出pod并打印相关信息。

package main

import (
"fmt"
"os"
"os/signal"
"syscall"
"time" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/workqueue"
) func main() {
// 获取 kubeconfig 文件路径
kubeconfigPath := os.Getenv("KUBECONFIG")
if kubeconfigPath == "" {
kubeconfigPath = os.Getenv("HOME") + "/.kube/config"
} // 使用 kubeconfig 文件创建 kubernetes 客户端
config, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
if err != nil {
panic(err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
} // 创建 informer 工厂
informerFactory := informers.NewSharedInformerFactory(clientset, time.Minute) // 创建 informer 对象
podInformer := informerFactory.Core().V1().Pods() // 创建工作队列
queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) // 定义处理新增、更新和删除事件的回调函数
podHandler := cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(obj)
if err == nil {
queue.Add(key)
}
},
UpdateFunc: func(oldObj, newObj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(newObj)
if err == nil {
queue.Add(key)
}
},
DeleteFunc: func(obj interface{}) {
key, err := cache.MetaNamespaceKeyFunc(obj)
if err == nil {
queue.Add(key)
}
},
} // 将回调函数注册到 informer 上
podInformer.Informer().AddEventHandler(podHandler) // 启动 informer
stopCh := make(chan struct{})
defer close(stopCh)
informerFactory.Start(stopCh) // 等待 informer 同步完成
if !cache.WaitForCacheSync(stopCh) {
panic("同步 informer 缓存失败")
} // 创建信号处理程序,用于捕捉 SIGTERM 和 SIGINT 信号
signalCh := make(chan os.Signal, 1)
signal.Notify(signalCh, syscall.SIGTERM, syscall.SIGINT) // 创建 worker 函数,用于处理队列中的事件
processNextItem := func() {
obj, shutdown := queue.Get()
if shutdown {
return
} // 转换对象为 Pod
key := obj.(string)
podObj, exists, err := podInformer.Informer().GetIndexer().GetByKey(key)
if err != nil {
queue.Forget(obj)
panic(fmt.Sprintf("获取 Pod 失败:%v", err))
} if !exists {
// 如果对象已经被删除,就把它从队列中移除
queue.Forget(obj)
return
} // 在这里添加处理 Pod 的逻辑
pod := podObj.(*v1.Pod)
fmt.Printf("处理 Pod: namespace:%v,podName:%v\n", pod.Namespace, pod.Name) // 处理完事件后,把它从队列中移除
queue.Forget(obj)
return
} // 启动 worker
go wait.Until(processNextItem, time.Second, stopCh) // 等待信号
<-signalCh
} /*
处理 Pod: namespace:kube-system,podName:kindnet-h25kv
处理 Pod: namespace:kube-system,podName:kube-apiserver-minikube
处理 Pod: namespace:kube-system,podName:metrics-server-c9fb666df-zk4tb
处理 Pod: namespace:kubernetes-dashboard,podName:dashboard-metrics-scraper-b74747df5-4pb7w
处理 Pod: namespace:default,podName:nginx-76d6c9b8c-jqv9h
处理 Pod: namespace:default,podName:nginx-76d6c9b8c-m4g5l
处理 Pod: namespace:kube-system,podName:coredns-7f8cbcb969-48nz6
处理 Pod: namespace:kube-system,podName:kube-proxy-t766g
处理 Pod: namespace:kube-system,podName:kube-scheduler-minikube
处理 Pod: namespace:kube-system,podName:kindnet-44zl6
处理 Pod: namespace:kube-system,podName:kube-controller-manager-minikube
处理 Pod: namespace:kube-system,podName:kube-proxy-gq68w
处理 Pod: namespace:kube-system,podName:kube-proxy-l92vg
处理 Pod: namespace:kube-system,podName:storage-provisioner
处理 Pod: namespace:kubernetes-dashboard,podName:kubernetes-dashboard-57bbdc5f89-466rh
处理 Pod: namespace:default,podName:nginx-76d6c9b8c-kr9d2
处理 Pod: namespace:default,podName:nginx-76d6c9b8c-n8st9
处理 Pod: namespace:kube-system,podName:kindnet-w9f7t
处理 Pod: namespace:default,podName:nginx-76d6c9b8c-8ljkt
处理 Pod: namespace:kube-system,podName:etcd-minikube
处理 Pod: namespace:default,podName:nginx
处理 Pod: namespace:default,podName:ubuntu
*/

indexer

Indexer是client-go中用于本地缓存资源对象的一种方式。它支持多种索引方式,并且可以使用函数func(obj interface{}) ([]string, error)进行索引。在检索时,需要使用相同的indexName参数。借助informer,indexer就可以维护一个特定资源的本地缓存,例如pod、namespace等。这种方法省去了每次get pod都要访问api-server的过程,从而减小了api-server的压力。

// 如何使用索引器来检索Pod对象
package main import (
"fmt" v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/tools/cache"
) const (
NamespaceIndexName = "namespace" // 定义一个索引器名称,用于按照命名空间检索Pod
NodeNameIndexName = "nodeName" // 定义一个索引器名称,用于按照节点名称检索Pod
) // NamespaceIndexFunc是一个函数,用于从对象中提取命名空间作为索引键
func NamespaceIndexFunc(obj interface{}) ([]string, error) {
m, err := meta.Accessor(obj) // 获取对象的元数据
if err != nil {
return []string{""}, fmt.Errorf("object has no meta: %v", err)
}
return []string{m.GetNamespace()}, nil // 返回对象的命名空间
} // NodeNameIndexFunc是一个函数,用于从Pod对象中提取节点名称作为索引键
func NodeNameIndexFunc(obj interface{}) ([]string, error) {
pod, ok := obj.(*v1.Pod) // 判断对象是否是Pod类型
if !ok {
return []string{}, nil // 如果不是,返回空切片
}
return []string{pod.Spec.NodeName}, nil // 如果是,返回Pod的节点名称
} func main() {
index := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{
NamespaceIndexName: NamespaceIndexFunc,
NodeNameIndexName: NodeNameIndexFunc,
}) // 创建一个新的索引器,指定主键函数和辅助键函数 pod1 := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "index-pod-1",
Namespace: "default",
},
Spec: v1.PodSpec{NodeName: "node1"},
} // 创建一个Pod对象,属于default命名空间和node1节点 pod2 := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "index-pod-2",
Namespace: "default",
},
Spec: v1.PodSpec{NodeName: "node2"},
} // 创建另一个Pod对象,属于default命名空间和node2节点 pod3 := &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "index-pod-3",
Namespace: "kube-system",
},
Spec: v1.PodSpec{NodeName: "node2"},
} // 创建第三个Pod对象,属于kube-system命名空间和node2节点 index.Add(pod1) // 将pod1添加到索引器中
index.Add(pod2) // 将pod2添加到索引器中
index.Add(pod3) // 将pod3添加到索引器中 pods, err := index.ByIndex(NamespaceIndexName, "default") // 按照命名空间为default检索Pod列表
if err != nil {
panic(err)
}
for _, pod := range pods {
fmt.Println(pod.(*v1.Pod).Name)
} // 遍历并打印检索到的Pod名称 fmt.Println("*****************") pods, err = index.ByIndex(NodeNameIndexName, "node2") // 按照节点名称为node2检索Pod列表
if err != nil {
panic(err)
}
for _, pod := range pods {
fmt.Println(pod.(*v1.Pod).Name)
} // 遍历并打印
} /*
index-pod-2
index-pod-1
*****************
index-pod-2
index-pod-3
*/

lister

Lister是对Indexer的封装,提供了一种方便的方式来获取已经索引的Kubernetes资源对象列表。

具体而言,Lister是一个接口,包含了获取所有已索引对象的列表以及根据名称获取单个对象的方法。这些方法可以帮助开发者在应用程序中快速访问已经缓存的资源对象,而无需直接与Indexer交互。

Lister的主要功能包括:

  1. 提供方便的接口:Lister接口的方法定义清晰简洁,使用起来非常方便,可以快速地获取已经索引的资源对象列表。
  2. 提高代码可读性:通过使用Lister接口,代码可读性得到提高。开发者可以更加专注于业务逻辑,而无需关注底层的Indexer实现细节。
  3. 提高代码复用性:由于Lister接口已经提供了通用的方法,因此可以更容易地在不同的代码模块中重用相同的逻辑,减少代码重复。

总之,Lister作为client-go包中的一个重要组件,可以帮助开发者更加高效地处理Kubernetes资源对象,提高代码的可读性和可重用性。

package main

import (
"fmt"
"os"
"time" "k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/clientcmd"
) func main() {
// 获取 kubeconfig 文件路径
kubeconfigPath := os.Getenv("KUBECONFIG")
if kubeconfigPath == "" {
kubeconfigPath = os.Getenv("HOME") + "/.kube/config"
}
// 使用 kubeconfig 文件创建 kubernetes 客户端
config, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
if err != nil {
panic(err)
} clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
} // 创建Informer
factory := informers.NewSharedInformerFactory(clientset, time.Minute)
podInformer := factory.Core().V1().Pods() // 创建Lister
lister := podInformer.Lister() // 等待Informer同步完成
stopCh := make(chan struct{})
defer close(stopCh) factory.Start(stopCh)
cache.WaitForCacheSync(stopCh, podInformer.Informer().HasSynced) // 获取namespace为"default"的Pod对象
podList, err := lister.Pods("default").List(labels.Everything())
if err != nil {
panic(err.Error())
}
// 打印Pod对象
for _, pod := range podList {
fmt.Printf("Pod name: %s, Namespace: %s\n", pod.Name, pod.Namespace)
}
} /*
Pod name: nginx-76d6c9b8c-m4g5l, Namespace: default
Pod name: nginx, Namespace: default
Pod name: ubuntu, Namespace: default
Pod name: nginx-76d6c9b8c-kr9d2, Namespace: default
Pod name: nginx-76d6c9b8c-n8st9, Namespace: default
Pod name: nginx-76d6c9b8c-8ljkt, Namespace: default
Pod name: nginx-76d6c9b8c-jqv9h, Namespace: default
*/

Reference

kubernetes client-go功能介绍的更多相关文章

  1. 二进制搭建kubernetes多master集群【开篇、集群环境和功能介绍】

    本文主要说明kubernetes集群使用组建的版本和功能介绍.. 一.组件版本 Kubernetes 1.12.3 Docker 18.06.1-ce Etcd 3.3.10 Flanneld 0.1 ...

  2. (转帖)开源容器集群管理系统Kubernetes架构及组件介绍

    最近在搞Docker还有她的管理工具,选型Kuberetes后,被她的术语和概念搞得晕头转向...看了一篇文章还不错,放到这里分享出来. 地址:http://www.linuxidc.com/Linu ...

  3. fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址)

    fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址) 最新的Fedora 21终于正式发布了,Fedora Server 是一款强大可定制化的操作系统,包括了最好最 ...

  4. TortoiseGit功能介绍

    TortoiseGit功能介绍 使用方便 强大的提交对话框 每个项目设置 最小日志消息长度,以避免意外提交空日志消息 用于拼写检查的语言 与问题跟踪系统集成 有用的工具 有多种语言版本 Tortois ...

  5. 服务注册发现consul之一:consul介绍、安装、及功能介绍

    Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发.它具有很多优点.包括:基于 raft 协议,比较简洁: 支持健康检查, 同时支持 HTTP 和 ...

  6. 从Client应用场景介绍IdentityServer4(四)

    原文:从Client应用场景介绍IdentityServer4(四) 上节以对话形式,大概说了几种客户端授权模式的原理,这节重点介绍Hybrid模式在MVC下的使用.且为实现IdentityServe ...

  7. redis5.0.0功能介绍以及主从集群、哨兵搭建

    这两天突然想起redis,索性就再尝试一下搭建最新版本的redis,过程有点艰辛呀,记录一下,供自己和大家今后搭建做参考. 一.为什么用Redis? 我自己总结了一下: 1.基于内存实现的key-va ...

  8. Kubernetes集群详细介绍及部署

    kubernetes的介绍: kubernetes是谷歌在2014年6月的一个开源集群项目,使用go语言开发,因为除了ks后只有8个字母又被称为k8s. k8s的主要作用: 自动化部署 扩展容器的管理 ...

  9. dubbo-go 的开发、设计与功能介绍

    dubbo-go 的前世今生 dubbo-go 是目前 Dubbo 多语言生态最火热的项目.dubbo-go 最早的版本应该要追溯到 2016 年,由社区于雨同学编写 dubbo-go 的初版.当时很 ...

  10. redis常用指令总结以及功能介绍

    第一部分 redis的常用指令 一.针对key的操作 1.1 del key [key .. ]                 , 删除指定的一个或者多个key;1.2 dump key       ...

随机推荐

  1. Springboot优雅进行字段检验

    Springboot优雅进行字段检验 1.Controller VS Service 推荐与业务无关的放在controller层中进行校验,而与业务相关的放在service层中校验. 2.常用校验工具 ...

  2. MySQL空间暴涨150G导致锁定,发生了什么

    背景 12月1号中午突然收到大量报警,某客户环境操作数据库大量失败,报错信息如下图所示: 这个报错我是第一次见,一时间有点无所适从,但是从字面意思来看是MySQL目前处于LOCK_WRITE_GROW ...

  3. TCP\UDP协议 socket模块

    目录 传输层主要协议 TCP协议 三次握手 TCP协议反馈机制 四次挥手 洪水攻击 UDP协议 socket模块 socket代码简介 socket.socket() server.bind() se ...

  4. Jmeter 之提取的值为null时,if控制器中的判断表达式

    场景:当level的值为null时则执行 {"code":0, "msg":null, "data": [ { "level&qu ...

  5. Linux基础第五章 进程控制

    5.2 fork fork函数实现进程复制,类似于动物界的单性繁殖,fork函数直接创建一个子进程.这是Linux创建进程最常用的方法.在这一小节中,子进程概念指fork产生的进程,父进程指主动调用f ...

  6. java中json字符串与实体类对象相互转换

    1.问题描述 有一个需求是这样的,把实体类转为Json字符串存入redis中,然后再把redis中存放的实体类Json字符串插入数据库中.因此需要涉及到json字符串与实体类对象的相互转换. 2.产生 ...

  7. [python] 基于NetworkX实现网络图的绘制

    NETWORK CHART(网络图) 代码下载地址 网络图 (或图表或图形)显示了一组实体之间的互连.每个实体由一个或多个节点表示.节点之间的连接通过链接(或边)表示.网络的理论与实现是一个广阔的研究 ...

  8. GC耗时高,原因竟是服务流量小?

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 最近,我们系统配置了GC耗时的监控,但配置上之后,系统会偶尔出现GC耗时大于1s的报警,排查花了一些力气,故在这里 ...

  9. python进阶之路11 闭包函数 装饰器

    函数名的多种用法 函数名其实绑定的也是一块内存地址 只不过该地址里面存放的不是数据值而是一段代码 函数名加括号就会找到该代码并执行 1.可以当作变量名赋值 def index():pass res = ...

  10. group by 语句怎么优化?

    一.一个简单使用示例 我这里创建一张订单表 CREATE TABLE `order_info` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `or ...