go-client对接k8s

一、kubeconfig管理

apiVersion: v1
clusters:
#定义api的地址以及证书
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVZWFZK0prcFdjUERzVlZNZUZBbjVkM003WFRRd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFXcHBibWN4RURBT0JnTlZCQWNUQjBKbAphV3BwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEl3TURZeU5URXhNVGN3TUZvWERUSTFNRFl5TkRFeE1UY3dNRm93WlRFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFXcHBibWN4RURBT0JnTlZCQWNUQjBKbGFXcHBibWN4RERBSwpCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByZFdKbGNtNWxkR1Z6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMlh6L0dSWVVmTXE1WHh0RGY1dGgKOHNFUmtYSERGaWRURlk3QnQyMERSL1VseUtqYkw4cmNpRnNFUFdzL3ZYRkQ2MCtwTjVPM2JIK1Z4eUg5U3ByTQo0aE9HVkpZVHdyRFZkV2ZtcWU1S1VHWCtBUUhUTTZTRThjVUYrdjBTM0NSRWdxeXgvUVprZUlIMVFEZzBiM0lTCnpjMlo3dURFYmNXRCtndktQdXREbmd3Y0JrYTNTWkx6UytWWVBYQXRTaWpuaHVuR1BBT04rYnUrWFNxK3RpTFgKaWo3cFM1NmR3TnNDT2wvNzJnRjM1aFNva1kwWkdBSG9GbldNKzNKSkp4N2ZUakQ5YmcxNnhPMlpsWml0cnJMYgp2Z3N5V3VMcGNZL3ZDZlBxR3EyNDV6a0NzS3Y4ZEV0Rm1hODNSUW1sK25QVjRZUUU1MFNVQjVONTJWdnhuQ1hLClZRSURBUUFCbzJZd1pEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWQKQmdOVkhRNEVGZ1FVd0g3aTg0LzhOQlAweHJZL3ErRmxpcXNPemVRd0h3WURWUjBqQkJnd0ZvQVV3SDdpODQvOApOQlAweHJZL3ErRmxpcXNPemVRd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNYVRTOEw2R1BxN1htWE9TbVpFCklkTzNvZkxDb09yMWVvTVQrdUtaZDhNNzNFbnRJTEtuRzdzYTFjWnM1K2JuZnhMeWNlZngxcXYwdGVuRzJJN2IKUEZhaHRWWWt6WHljM2laSm4wUkRTUWsxUTdMZXNsSEg2V3BJcG1YWE9QcW05bzdIa0hRVGZFbHF0SERxOFFKMQorRkoya0YxQ3lNSTN3b1JnTC90RVBXYnBCN2F3Y2RoRWJxRzdFWDFRS2tUbUFkRmZYbTZma0owMkQ4WUdDeldaCmFFaWtHYmFlMGNQQ0J5cmZ2bnNZdlViV0dPbmFEZ0drak1PSzRzSG5rVHpOQzBXMVdncUpYR1RCVllVbkxtV0IKVDVUNHQ0QUwxb3pCeDB2TGRsdVVZWlBHMnNnZG1QY0dMelNlZEpGcURIZFMya2RYVGdkSWRZVEd1WU5MSXhvdQpPR2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    server: https://192.168.190.101:6443
  name: kubernetes
contexts:
#将用户跟集群绑定起来
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
  #当前登录的是那一个绑定的name
current-context: "kubernetes-admin@kubernetes"
kind: Config
preferences: {}
#用户信息 有名字跟证书信息 当然这里也可以用token的方式
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lVYnhBWVVjTFBsK08zWlAxMGtoTWJmaFUxVG5Zd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFXcHBibWN4RURBT0JnTlZCQWNUQjBKbAphV3BwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEl3TURZeU5URXhNVGN3TUZvWERUTXdNRFl5TXpFeE1UY3dNRm93YXpFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbGFVcHBibWN4RnpBVgpCZ05WQkFvVERuTjVjM1JsYlRwdFlYTjBaWEp6TVE4d0RRWURWUVFMRXdaVGVYTjBaVzB4RGpBTUJnTlZCQU1UCkJXRmtiV2x1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEreHU3dDZ4QkxDRUgKcEgydy9XcUdHK3B3bzk4U2piYXpkYkFMZ3BzaE8zZ0JNMDA4K3FWSVAwUzZpcGQzaEN6MGl5cFF1M0VlT2tWawpkaUV4U3ZwRXlUNG5sZzJjVm9sVzRjNW0xQjcxbGVmeWk2NUlKNUt4MHVKTUpVNyt6cndyTHo0dm41WXFJcldGCm9ldERhc2hQU21pUEJMbmJjVmYyN3k3bjEwOEt1dkxITzgwSHIwTDRYYnpXK3NzM1dCUzlVTTF6U3U3WGp4M1AKWHQ0Wmg4MXNQOVZyQk9JbDRWelp0TjNNS0ZGWXppNU55cVU0T2c4RE5wQUNseDlJQjNQSkZhdC9zSGNjc0lkbApDMXVsRW9qdnY0Yk1DVE8xNmwxcmxzMTUxai9EWlRCcWViSldDZzV4dS9VOHFlTzA4OUJTZkx0b0VPR2NobE9xCkgxNjgyTURtc3dJREFRQUJvMzh3ZlRBT0JnTlZIUThCQWY4RUJBTUNCYUF3SFFZRFZSMGxCQll3RkFZSUt3WUIKQlFVSEF3RUdDQ3NHQVFVRkJ3TUNNQXdHQTFVZEV3RUIvd1FDTUFBd0hRWURWUjBPQkJZRUZNc0EwWXM4TEhSQwpWOTNsc0E1aHI1RVdORUpMTUI4R0ExVWRJd1FZTUJhQUZNQis0dk9QL0RRVDlNYTJQNnZoWllxckRzM2tNQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFDS0I4SlloRUVtSUQ3eVR3ZlErelpYc3lsbXFNR3k1SkUvVFdwYWo5TjEKak5HR2VnQldRQnc5MjBnUFV0MWFuTENXRGIyT0wyNCtCa1ZyV1Y0WE9PSytsQ1c1b1M2T3Y5dlZFQ1JnT2dSbwpoa0I3eVJISmdFdytxSVlxU253YUdYYkt3MXl2dmg0SHUzVDdvWlZYbFlIVnlzaGw0dGgyRkZxRDRnQ25FNVFGCk5yTm9nc2lPM0ZaTkNCcGdYVkQ5Tm04WlJXa09SOSt3YUk1cGkxY0YwVEdTVnQ1alRxWHAzRWNNM2JJTVdXUncKRmtoSHpWbTRCZkRZVFV1U1lMNktmODdOQlVlRCtobk9FYjNueDEwVGpzYXBQS3ZvQnBuOHpqSmplNCtFT2lUQQpYdUZoMkxSZnN1Y3NaOEQxbGloQkVaM1orR2ttd2tERkJyWW01Y0ZUakU4NwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBK3h1N3Q2eEJMQ0VIcEgydy9XcUdHK3B3bzk4U2piYXpkYkFMZ3BzaE8zZ0JNMDA4CitxVklQMFM2aXBkM2hDejBpeXBRdTNFZU9rVmtkaUV4U3ZwRXlUNG5sZzJjVm9sVzRjNW0xQjcxbGVmeWk2NUkKSjVLeDB1Sk1KVTcrenJ3ckx6NHZuNVlxSXJXRm9ldERhc2hQU21pUEJMbmJjVmYyN3k3bjEwOEt1dkxITzgwSApyMEw0WGJ6VytzczNXQlM5VU0xelN1N1hqeDNQWHQ0Wmg4MXNQOVZyQk9JbDRWelp0TjNNS0ZGWXppNU55cVU0Ck9nOEROcEFDbHg5SUIzUEpGYXQvc0hjY3NJZGxDMXVsRW9qdnY0Yk1DVE8xNmwxcmxzMTUxai9EWlRCcWViSlcKQ2c1eHUvVThxZU8wODlCU2ZMdG9FT0djaGxPcUgxNjgyTURtc3dJREFRQUJBb0lCQURHVWpELzcxdkpyb3lLcgpYcUxxd1lnSmhpd1ZBNGpQcGlkNmx3czJyaDBiMk1EVVkxSHFDSlhWY0MrbE1JZjhpRnhpQW9iQUV3UFdaN3ViCldpdy90ZzAySklMUU5Tb3crK0toNmxPL3VTWGNJbHZLRVowZXJkWEJzTjg4OWJyRUZKTERhSXZPRG92RDQ1clEKNVFMVWdqTmk2Ym81S0ViODQxamVuaEE1SHhsQ0trem1mNk5YaXdteWVEWFRhOVdISEJhbndKdkxONHBDeW53dQorbnFlc0NUallCMzg0OXVGTnA1K3ZWOWVTSGprek9XdkNiYzdtaEJQaXNHVjFyM2luY1hvcU16enluTU1PeHFGCjg5NWxqL2pNWTVmV1psbnFlQ3Aybk9qQktPVGxteGV1QzlQSVg1VXBRbWFKRloxbEI0eEUvN1hQV1Y3akpUMDEKSWZRWXFFRUNnWUVBL1RkNkNXSmQrU0RUSDdJdGtTOWlOa1ZuZ3VrV201N2wrSHB5eUNUZGVXaTJBb0RVUVNNdgpQMURSMjVXRlQrZXowYnhzNVpJaWc1WFVpcGtwclVjK1RDemhMMmRoTGF6V3pGOUlTekpxZGFFZVc5VTJkb1NmCjRyNkRMTy96VEwwa0VJNG1acnIrS0Y4ckJrcTJ2RGNtenBYZnRhejhTUFZwOUo0cGt5ZmRJM2tDZ1lFQS9kNVMKNTFDaFNqdWQ4ay9uU2xnZXJCK281cnlkaDQvSlJoaXl1VUluRFBhTWI0Z21PdjNIODcxSWp6SkNnSkZpTytoUQozYzc5Zko5YThYRHVGSXRSKzZ3Z0NySEUxU2tSUVpIY2RxeHFlbmUrWHQ0L1NCaVJhbHdTd3FvSlV5bmJ3MDFCClVoeVNaV3pDSmp0L0IvWDdldHJScGF4U2pGY2ljaWVBVzNFMnhJc0NnWUJNZzJYcHpnSnRWQURYbEFSMjJXV0kKMXFIM2lhMGVLdjU4ZmF1UFZLeGpra05sTUQ1eXpFbnJqT1ZNdjdwL3NaakJhSGxUU1R3S25NeVRjTUtLTEh2agprckFjbmRWY2N0eVk5cldtbXo1Vit2QnNlVm15cUZLVHRsTjIwYTZuNG9NeVNYSExHdmZQaFNwQUJYV0FHLzRxCjhGaWYwZnlOb3pKNEN3NnUrNTJ6cVFLQmdRQ3ZndzR6NTlXcW1hN29BSC82TVJQN2tlUFdxZDRMQThoMlVzcjEKTTV3RjVVcFFMWU9vMHgxekVKRGlseS9NN1RaS0RxSWh4MklPejZrek5RMFVYUUd3Q2w4WXBiQmNZb2tRbVFRZgpjN0lsdXpWOUp3Ly9DeVUxc0RRMEt4UkpUNjRreHZ0N0JrL2NHU1hkQXRNZk1Odk5JdzFBQ2ZRRUhKV3U4RXBZCmJkd2NZd0tCZ1FEMGU5YXQxSUU5VnBkNE1IM0VtRkdvRGZLbExlR1pRSlRXdnRuS1hsU3NILzJyRS93YWptYWgKT2VodWdLNk1QTDlncytHZUtSZ1RzVFVlclE3ZSthVDVVL2JlbWRqaTBFTjJxeFYxYzdoV1c1TG9VSHdsVDNJOQpPcjNpNXRBQUt1RklEbGdseWI5TlF6RWNXWlR1MFpOTkNZSWJRUEdLd2dneGtHUkJaOHlqdWc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=

二、go 对接k8s mod管理方式的坑


这里值得一提的是go mod通过go client 对接k8s的时候有个小坑
那么就是我们需要在go mod文件中指定k8s版本 不然会默认拉去最新的k8s版本的包 我们也知道不同的k8s版本的api会出现差异

go.mod

module testk8s

go 1.13


replace (
	golang.org/x/crypto/ => github.com/golang/crypto v0.0.0-20200423211502-4bdfaf469ed5
	golang.org/x/net => github.com/golang/net v0.0.0-20200421231249-e086a090c8fd
	golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
	golang.org/x/time => github.com/golang/time v0.0.0-20200416051211-89c76fbcd5d1
	k8s.io/api => k8s.io/api v0.0.0-20190918155943-95b840bb6a1f
	k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655
	k8s.io/client-go => k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90
)

require (
	github.com/golang/protobuf v1.4.0 // indirect
	github.com/googleapis/gnostic v0.4.1 // indirect

	github.com/imdario/mergo v0.3.9 // indirect
	golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5 // indirect
	k8s.io/api v0.18.5
	k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655
	k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90
//k8s.io/utils  kubernetes-1.16.0
//k8s.io/api  kubernetes-1.16.0
//k8s.io/client-go  kubernetes-1.16.0
)

三、RESTClient客户端


RestClient是最基础的客户端,RestClient基于http request进行了封装,实现了restful的api,可以处理多种类型的调用返回不同的数据格式

package main

import (
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	//"k8s.io/client-go/kubernetes"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	config ,err := clientcmd.BuildConfigFromFlags("","./config")
	if err!= nil {
		panic(err)
	}
	config.APIPath = "api"
	config.GroupVersion = &corev1.SchemeGroupVersion
	config.NegotiatedSerializer = scheme.Codecs

	restClient  ,err  := rest.RESTClientFor(config)
	if err != nil {
		panic(err)
	}

	result := &corev1.PodList{}
	err = restClient.
		Get().
		Namespace("kube-system").
		Resource("pods").
		VersionedParams(&metav1.ListOptions{Limit: 500},scheme.ParameterCodec).
		Do().
		Into(result)
	if err != nil {
		panic(err)
	}
	for _,v := range  result.Items {
		fmt.Printf("namespaces:%v  name:%v status:%v \n",v.Namespace,v.Name,v.Status.Phase)
	}
}

在这里插入图片描述
在这里插入图片描述

四、ClientSet客户端

ClientSet在RestClient的基础上封装了对Resouorce和Version的管理方法一个Resource可以理解为一个客户端,而ClientSet是多个客户端的集合

package main

import (
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	"k8s.io/client-go/kubernetes"

	"k8s.io/client-go/tools/clientcmd"
)

func main() {

	config, err := clientcmd.BuildConfigFromFlags("", "./config")
	if err != nil {
		panic(err)
	}
	client, _ := kubernetes.NewForConfig(config)
	pods ,err := client.CoreV1().Pods("kube-system").List(metav1.ListOptions{})
	if err != nil {
		fmt.Println(err)
		return
	}
	for _,v := range  pods.Items {
		fmt.Println(v.Namespace,v.Name)
	}

}

在这里插入图片描述在这里插入图片描述

五、DynamicClient客户端

DynamicClient是一种动态客户端它可以对任何资源进行restful操作包括crd自定义资源,也是通过封装restclient,也提供了create,update,delete,get,list,watch,patch等方法
DynamicClient与ClientSet最大的不同是clientset只能访问自带的资源,如果是自己的crdclientset将无法访问,DynamicClient不是z类型安全的,因此在访问crd自定义资源的时候需要特别注意,出现问题会导致程序崩溃
DynamicClient的处理过程将Resource例如podlist转换为unstructured类型,k8s的所有resource都可以转换为这个结构类型,处理完之后在转换为podlist,整个转换过程类似于接口转换就是通过interface{}的断言

package main

import (
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"k8s.io/client-go/dynamic"

	apiv1 "k8s.io/api/core/v1"
	"k8s.io/client-go/tools/clientcmd"
)

func main() {
	config ,err := clientcmd.BuildConfigFromFlags("","./config")
	if err!= nil {
		panic(err)
	}

	dynamicclient,err := dynamic.NewForConfig(config)
	if err != nil {
		panic(err)
	}
	gvr := schema.GroupVersionResource{Version: "v1",Resource: "pods"}
	unstructObj ,err := dynamicclient.Resource(gvr).Namespace("kube-system").List(metav1.ListOptions{Limit: 500})
	if err != nil {
		panic(err)
	}
	podlist := &apiv1.PodList{}
	err = runtime.DefaultUnstructuredConverter.FromUnstructured(unstructObj.UnstructuredContent(),podlist)
	if err != nil {
		panic(err)
	}
	for _,v := range  podlist.Items {
		fmt.Printf("namespaces:%v  name:%v status:%v \n",v.Namespace,v.Name,v.Status.Phase)
	}
}

在这里插入图片描述z

六、DiscoveryClient客户端

DiscoveryClient是发现客户端,主要用于发现api server支持的资源组 资源版本 资源信息,k8s api server 支持很多资源组 资源版本,资源信息,此时可以通过DiscoveryClient来查看

kubectl的api-version和api-resource也是通过DiscoveryClient来实现的,还可以将信息缓存在本地cache,以减轻api的访问压力,默认在./kube/cache和./kube/http-cache下

package main

import (
	"fmt"
	"k8s.io/client-go/discovery"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/apimachinery/pkg/runtime/schema"
)

func main() {
	config, err := clientcmd.BuildConfigFromFlags("", "./config")
	if err != nil {
		panic(err)
	}
	discoveryclient ,err := discovery.NewDiscoveryClientForConfig(config)
	if err != nil {
		panic(err)
	}
	_,apiresourcelist ,err := discoveryclient.ServerGroupsAndResources()
	for _, v := range apiresourcelist {
		gv ,err :=  schema.ParseGroupVersion(v.GroupVersion)
		if err != nil {
			panic(err)
		}
		for _,resource := range  v.APIResources{
			fmt.Println("name:",resource.Name,"    ","group:",gv.Group,"    ","version:",gv.Version)
		}
	}
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/107349333