discovery
:提供
DiscoveryClient
发现客户端
dynamic
:提供
DynamicClient
动态客户端
informers
:每种 kubernetes 资源的 Informer 实现
kubernetes
:提供
ClientSet
客户端
listers
:为每一个 Kubernetes 资源提供 Lister 功能,该功能对 Get 和 List 请求提供只读的缓存数据
plugin
:提供 OpenStack、GCP 和 Azure 等云服务商授权插件
rest
:提供
RESTClient
客户端,对 Kubernetes API Server 执行 RESTful 操作
scale
:提供
ScaleClient
客户端,用于扩容或缩容 Deployment、ReplicaSet、Relication Controller 等资源对象
tools
:提供常用工具,例如 SharedInformer、Reflector、DealtFIFO 及 Indexers。提供 Client 查询和缓存机制,以减少向 kube-apiserver 发起的请求数等
transport
:提供安全的 TCP 连接,支持 Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如 exec、attach 等操作。该功能由内部的 spdy 包提供支持
util
:提供常用方法,例如 WorkQueue 功能队列、Certificate 证书管理等
Client 客户端对象
client-go 支持四种客户端对象:
ClientSet DynamicClient DiscoveryClient
| | |
▼ ▼ ▼
-------------------------------------------------
| RESTClient |
-------------------------------------------------
-------------------------------------------------
| kubeconfig |
-------------------------------------------------
RESTClient 客户端
RESTClient 是最基础的客户端,是对 HTTP Request 进行了封装:
func main() {
config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
config.APIPath = "api"
config.GroupVersion = &corev1.SchemeGroupVersion
config.NegotiatedSerializer = scheme.Codecs
restClient, err := rest.RESTClientFor(config)
result := &corev1.PodList{}
err = restClient.Get().
Namespace("default").
Resource("pods").
VersionedParams(&metav1.ListOptions{Limit:500}, scheme.ParameterCodec).
Do().
Into(result)
ClientSet 客户端
ClientSet 在 RESTClient 的基础上封装了对 Resource 和 Version 的管理方法:
ClientSet 仅能访问 Kubernetes 自身内置的资源(即客户端集合内的资源),不能直接访问 CRD 自定义资源。
func main() {
config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
clientset, err := kubernetes.NewForConfig(config)
podClient := clientset.CoreV1().Pods(apiv1.NamespaceDefault)
list, err := podClient.List(metav1.ListOptions{Limit:500})
DynamicClient 客户端
DynamicClient 是一种动态客户端,它可对任意 Kubernetes 资源进行 RESTful 操作,包括 CRD 自定义资源。
package main
import (
"fmt"
apiv1 "k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/runtime"
func main() {
config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/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(apiv1.NamespaceDefault).
List(metav1.ListOptions{Limit: 500})
if err != nil {
panic(err)
podList := corev1.PodList{}
err = runtime.DefaultUnstructuredConverter.FromUnstructured(
unstructObj.UnstructuredContent(), podList)
if err != nil {
panic(err)
for _, d := range podList.Items {
fmt.Printf("NAMESPACE: %v \t NAME:%v \t STATU: %+v\n",
d.Namespace, d.Name, d.Status.Phase)
DiscoveryClient 客户端
DiscoveryClient 主要用于发现 Kubernetes API Server 所支持的资源组、资源版本、资源信息。
package main
import (
"fmt"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
"k8s.io/client-go/tools/clientcmd"
func main() {
config, err := clientcmd.BuildConfigFromFlags("", "~/.kube/config")
if err != nil {
panic(err)
discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)
if err != nil {
panic(err)
_, APIResourceList, err := discoveryClient.ServerGroupsAndResources()
if err != nil {
panic(err)
for _, list := range APIResourceList {
gv, err := schema.ParseGroupVersion(list.GroupVersion)
if err != nil {
panic(err)
for _, resource := range list.APIResources {
fmt.Printf("name: %v, group: %v, version: %v\n",
resource.Name, gv.Group, gv.Version)