Kubernetes 的 Client Libraries 的使用
说明
kubernetes 估计会成为 linux 一样的存在,client-go 是它的 go sdk,client-go/examples/ 给出了一些用例,但是数量比较少。
api
Resource 的定义不在client-go中,而是在一个名为 api 的项目中,这个项目中的内容同步自 kubernetes 项目的目录 staging/src/k8s.io/api,可以用下面的方式获取:
go get k8s.io/api
api的目录结构如下:
▾ api/
▸ admission/
▸ admissionregistration/
▸ apps/
▸ authentication/
▸ authorization/
▸ autoscaling/
▸ batch/
▸ certificates/
▸ core/
▸ extensions/
▸ Godeps/
▸ imagepolicy/
▸ networking/
▸ policy/
▸ rbac/
▸ scheduling/
▸ settings/
▸ storage/
▸ vendor/
LICENSE
OWNERS
README.md
client-go
client-go是kubernetes官方的项目,go语言实现,使用示例源码位于: go-code-example/k8sclient。
获取 client-go:
go get k8s.io/client-go
go get k8s.io/apimachinery
go get k8s.io/api
go get k8s.io/kube-openapi
创建 Clientset
Clientset 包含 kubernetes 的所有资源的操作句柄,通过”k8s.io/client-go/kubernetes”中NewForConfig()创建。
创建 Clientset 需要提供一个 rest.Config,Config 可以用后面提到的 tools/clientcmd 生成,也可以自己填写:
config := rest.Config{
Host: "https://10.39.0.105:6443",
APIPath: "/",
Prefix: "",
BearerToken: "af8cbdf725efadf8c4",
TLSClientConfig: rest.TLSClientConfig{Insecure: true},
}
创建方法很简单:
clientset, err := kubernetes.NewForConfig(&config)
使用 Clientset
Clientset,意如其名,是client 的集合,在client-go/kubernetes/clientset.go中定义。
type Clientset struct {
*discovery.DiscoveryClient
admissionregistrationV1alpha1 *admissionregistrationv1alpha1.AdmissionregistrationV1alpha1Client
appsV1beta1 *appsv1beta1.AppsV1beta1Client
appsV1beta2 *appsv1beta2.AppsV1beta2Client
appsV1 *appsv1.AppsV1Client
authenticationV1 *authenticationv1.AuthenticationV1Client
authenticationV1beta1 *authenticationv1beta1.AuthenticationV1beta1Client
authorizationV1 *authorizationv1.AuthorizationV1Client
authorizationV1beta1 *authorizationv1beta1.AuthorizationV1beta1Client
autoscalingV1 *autoscalingv1.AutoscalingV1Client
autoscalingV2beta1 *autoscalingv2beta1.AutoscalingV2beta1Client
batchV1 *batchv1.BatchV1Client
batchV1beta1 *batchv1beta1.BatchV1beta1Client
batchV2alpha1 *batchv2alpha1.BatchV2alpha1Client
certificatesV1beta1 *certificatesv1beta1.CertificatesV1beta1Client
coreV1 *corev1.CoreV1Client
extensionsV1beta1 *extensionsv1beta1.ExtensionsV1beta1Client
networkingV1 *networkingv1.NetworkingV1Client
policyV1beta1 *policyv1beta1.PolicyV1beta1Client
rbacV1 *rbacv1.RbacV1Client
rbacV1beta1 *rbacv1beta1.RbacV1beta1Client
rbacV1alpha1 *rbacv1alpha1.RbacV1alpha1Client
schedulingV1alpha1 *schedulingv1alpha1.SchedulingV1alpha1Client
settingsV1alpha1 *settingsv1alpha1.SettingsV1alpha1Client
storageV1beta1 *storagev1beta1.StorageV1beta1Client
storageV1 *storagev1.StorageV1Client
}
用 Clientset 的方法获得不同资源的操作句柄,Clientset有以下的方法可供使用:
+Admissionregistration() : admissionregistrationv1alpha1.AdmissionregistrationV1alpha1Interface
+AdmissionregistrationV1alpha1() : admissionregistrationv1alpha1.AdmissionregistrationV1alpha1Interface
+Apps() : appsv1.AppsV1Interface
+AppsV1() : appsv1.AppsV1Interface
+AppsV1beta1() : appsv1beta1.AppsV1beta1Interface
+AppsV1beta2() : appsv1beta2.AppsV1beta2Interface
+Authentication() : authenticationv1.AuthenticationV1Interface
+AuthenticationV1() : authenticationv1.AuthenticationV1Interface
+AuthenticationV1beta1() : authenticationv1beta1.AuthenticationV1beta1Interface
+Authorization() : authorizationv1.AuthorizationV1Interface
+AuthorizationV1() : authorizationv1.AuthorizationV1Interface
+AuthorizationV1beta1() : authorizationv1beta1.AuthorizationV1beta1Interface
+Autoscaling() : autoscalingv1.AutoscalingV1Interface
+AutoscalingV1() : autoscalingv1.AutoscalingV1Interface
+AutoscalingV2beta1() : autoscalingv2beta1.AutoscalingV2beta1Interface
+Batch() : batchv1.BatchV1Interface
+BatchV1() : batchv1.BatchV1Interface
+BatchV1beta1() : batchv1beta1.BatchV1beta1Interface
+BatchV2alpha1() : batchv2alpha1.BatchV2alpha1Interface
+Certificates() : certificatesv1beta1.CertificatesV1beta1Interface
+CertificatesV1beta1() : certificatesv1beta1.CertificatesV1beta1Interface
+Core() : corev1.CoreV1Interface
+CoreV1() : corev1.CoreV1Interface
+Discovery() : discovery.DiscoveryInterface
+Extensions() : extensionsv1beta1.ExtensionsV1beta1Interface
+ExtensionsV1beta1() : extensionsv1beta1.ExtensionsV1beta1Interface
+Networking() : networkingv1.NetworkingV1Interface
+NetworkingV1() : networkingv1.NetworkingV1Interface
+Policy() : policyv1beta1.PolicyV1beta1Interface
+PolicyV1beta1() : policyv1beta1.PolicyV1beta1Interface
+Rbac() : rbacv1.RbacV1Interface
+RbacV1() : rbacv1.RbacV1Interface
+RbacV1alpha1() : rbacv1alpha1.RbacV1alpha1Interface
+RbacV1beta1() : rbacv1beta1.RbacV1beta1Interface
+Scheduling() : schedulingv1alpha1.SchedulingV1alpha1Interface
+SchedulingV1alpha1() : schedulingv1alpha1.SchedulingV1alpha1Interface
+Settings() : settingsv1alpha1.SettingsV1alpha1Interface
+SettingsV1alpha1() : settingsv1alpha1.SettingsV1alpha1Interface
+Storage() : storagev1.StorageV1Interface
+StorageV1() : storagev1.StorageV1Interface
+StorageV1beta1() : storagev1beta1.StorageV1beta1Interface
其中Core()和CoreV1()获取到的corev1.CoreV1Interface,用来操作kubernetes的最基础的Resrouce。
type CoreV1Interface interface {
RESTClient() rest.Interface
ComponentStatusesGetter
ConfigMapsGetter
EndpointsGetter
EventsGetter
LimitRangesGetter
NamespacesGetter
NodesGetter
PersistentVolumesGetter
PersistentVolumeClaimsGetter
PodsGetter
PodTemplatesGetter
ReplicationControllersGetter
ResourceQuotasGetter
SecretsGetter
ServicesGetter
ServiceAccountsGetter
}
例如查找指定 namespace 中的所有 Pod:
pods, err := clientset.CoreV1().Pods("lijiaocn").List(v1.ListOptions{})
创建 RESTClient
client-go/rest 实现了 RESTClient,RESTClient 的创建方法有两种。
第一种方式是直接通过 config 创建,这种方式需要在 config 中填入 GroupVersion 信息:
// create restClient from config
func CreateCoreRestClient(config *rest.Config) (*rest.RESTClient, error) {
config.ContentConfig.GroupVersion = &core_v1.SchemeGroupVersion
config.ContentConfig.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}
config.APIPath = "/api"
restClient, err := rest.RESTClientFor(config)
if err != nil {
return nil, err
}
if restClient == nil {
return nil, errors.New("restclient1 is nil")
}
return restClient, nil
}
第二种方式是从 Clientset 中获取,这种方式不需要手动填入 GroupVersion,调用 Clientset 对应的接口即可:
// get restClient from clientset
func GetCoreRestClient(config *rest.Config) (rest.Interface, error) {
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, err
}
if clientset == nil {
return nil, errors.New("clientset is nil")
}
restClient := clientset.CoreV1().RESTClient()
if restClient == nil {
return nil, errors.New("restclient is nil")
}
return restClient, nil
}
使用 RESTClient
RESTClient 是链式调用,使用方法如下,Do() 方法最后调用:
// /<namespace>/<resource>/<name>
// GET https://10.10.173.203/api/v1/namespaces/default/pods?limit=500
// GET https://10.10.173.203/api/v1/namespaces/kube-system/pods?limit=500
// GET https://10.10.173.203/api/v1/namespaces/kube-system/pods/kube-dns-5b54cf547c-jl4r9
result := restClient.Get().
Namespace("kube-system").
Resource("pods").
Name("kube-dns-5b54cf547c-jl4r9").
Do()
bytes, err := result.Raw()
if err != nil {
fmt.Printf("%s: %s\n", err.Error(), bytes)
} else {
fmt.Printf("%s\n", bytes)
}
client-go/tools
client-go 提供一套 tools,提供了配置文件加载、实现本地缓存等方法。
tools/clientcmd: 加载配置
tools/clientcmd 中提供了一些辅助工具,例如加载 kubeconfig 文件生成创建 client 是必须的 Config:
home, err := os.UserHomeDir()
if err != nil {
glog.Fatal(err.Error())
}
file, err := filepath.Abs(home + "/.kube/config")
if err != nil {
glog.Fatal(err.Error())
}
config, err := clientcmd.BuildConfigFromFlags("", file)
if err != nil {
glog.Fatal(err.Error())
return
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
glog.Fatal(err.Error())
return
}
tools/cache: 本地缓存
tools/cache 中提供了本地缓存的功能,特别是提供了 informer。
创建 informer 需要提供的 listwatcher 和 handler 都用 cache 中方法创建或在 cache 中定义:
labels := make(map[string]string)
selector := fields.SelectorFromSet(labels)
listwatch := cache.NewListWatchFromClient(restClient, "endpoints", "", selector)
handler 定义:
handler := cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
fmt.Printf("Add endpoint:\n")
if ep, ok := obj.(*core_v1.Endpoints); !ok {
fmt.Printf("not endpoints\n")
} else {
printEndpoint(ep)
}
},
UpdateFunc: func(oldObj, newObj interface{}) {
fmt.Printf("Update endpoint:\n")
if epOld, ok := oldObj.(*core_v1.Endpoints); !ok {
fmt.Printf("not endpoints\n")
} else {
printEndpoint(epOld)
}
if epNew, ok := newObj.(*core_v1.Endpoints); !ok {
fmt.Printf("not endpoints\n")
} else {
printEndpoint(epNew)
}
},
DeleteFunc: func(obj interface{}) {
fmt.Printf("Delete endpoint:\n")
if ep, ok := obj.(*core_v1.Endpoints); !ok {
fmt.Printf("not endpoint")
} else {
printEndpoint(ep)
}
},
}
cache.NewInformer() 返回一个 store,一个controller,前者用于查询,后者用于控制同步。
stop := make(chan struct{})
store, controller := cache.NewInformer(listwatch, &core_v1.Endpoints{}, 0*time.Second, handler)
controller.Run(stop)
Kubernetes 的 Client Libraries 的使用的更多相关文章
- 编译pure-ftpd时提示错误Your MySQL client libraries aren't properly installed
如果出现类似configure: error: Your MySQL client libraries aren’t properly installed 的错误,请将mysql目录下的 includ ...
- Tutorial 7: Schemas & client libraries
转载自:http://www.django-rest-framework.org/tutorial/7-schemas-and-client-libraries/ Tutorial 7: Schema ...
- Kubernetes Python Client 初体验之node操作
今天讲一下k8s中对于各个实物节点node的操作. 首先是获取所有nodes信息: self.config.kube_config.load_kube_config(config_file=" ...
- Kubernetes Python Client 初体验之Deployment
Kubernetes官方推荐我们使用各种Controller来管理Pod的生命周期,今天写一个最常用的Deployment的操作例子. 首先是创建Deployment: with open(path. ...
- Kubernetes Python Client 初体验之安装授权
最近想做一个基于flask的云平台管理服务器,利用python调用kubenetes提供的API来实现云平台的操作.笔者使用的是Windows,kubernetes集群安装在Ubuntu和Respbi ...
- Django REST framework 第七章 Schemas & client libraries
模式是一个机器可读文档,描述可用的API端点,URL以及它们支持的操作. 模式对于自动生成文档是一个很有用的工具,也可以用来动态调用可以于API交互的客户端库. Core API 为了提供模式支持,R ...
- Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
System.Data.OracleClient 已经过时了.微软不再支持它. 因此,我建议你为. NET 使用Oracle数据提供程序:ODP.Net. 你可以从以下位置下载: 版本:Release ...
- Kubernetes相关概念
This page explains how Kubernetes objects are represented in the Kubernetes API, and how you can exp ...
- kubernetes extension point
以下大部分来自于k8s document, 笔者只是总结归纳, 解释不足的地方请参阅相关文档 Intention Non-sustainable way to customize Kubernetes ...
随机推荐
- Scratch3架构结构说明
Scratch3.0整体项目结构比较庞大,对于不同二次开发开始的时候会出现一头雾水,需要先了解下整体框架,可以按需要在指定的源码下进行修改,大致结构如下: 1. scratch-gui: 是基于Rea ...
- (1) laravel php artisan list make
php artisan list make Laravel Framework 5.4.36 Usage: command [options] [arguments] Options: -h, --h ...
- 迷惑性很强的crontab
提到定时任务,我们通常会想起linux的crontab,可以说服务器端大部分定时任务都是由它完成的.这东西固然耗用,但是坑也不少. 这不,昨天我在部署一个备份任务的时候,就不幸踩坑了.差点酿成 ...
- 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构
目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...
- 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验三《敏捷开发与XP实践》 实验报告
实验内容与要求 1.XP基础 极限编程(Extreme Programming,XP)是一种全新而快捷的软件开发方法.XP团队使用现场客户.特殊计划方法和持续测试来提供快速的反馈和全面的交流: XP是 ...
- 设计模式的好书 -- ongoing
1 设计模式--可复用面向对象软件的基础 Erich Gamma. Richard Helm -- 已经下载了/baiduNetDisk Design Patterns --- Element ...
- Docker部署Gitlab11.10.4
1.下载镜像 官方镜像地址:https://hub.docker.com/r/gitlab/gitlab-ce ,根据自己需要下载指定版本 [root@vanje-dev01 ~]# docker p ...
- 习题一初步理解时间复杂度大O表示法案例
1.如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a.b.c可能的组合? 如上:a+b+c=1000, a平方+b平方=c平方 求出所有abc可能的组合 ...
- Python turtle(介绍一)
关于绘制图形库turtle # 画布上,默认有一个坐标原点为画布中心的坐标轴(0,0),默认"standard"模式坐标原点上有一只面朝x轴正方向小乌龟 一:海龟箭头Turtle相 ...
- python爬虫框架scrapy 豆瓣实战
Scrapy 官方介绍是 An open source and collaborative framework for extracting the data you need from websit ...