client-go 源碼結構
$ tree client-go/ -L 1
client-go/
├── discovery
├── dynamic
├── informers
├── kubernetes
├── listers
├── plugin
├── rest
├── scale
├── tools
├── transport
└── util
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)
}
}
}
