参考链接:使用client-go自定义开发Kubernetes

1.本地运行 apiserver demo

[root@wangjq demo]# apiserver-boot run local
2019/09/26 09:18:35 regenerating generated code.  To disable regeneration, run with --generate=false.
/var/wangjq/golang/bin/bin/apiregister-gen --input-dirs demo/pkg/apis/... --input-dirs demo/pkg/controller/...
/var/wangjq/golang/bin/bin/conversion-gen --input-dirs demo/pkg/apis/demo/v1 --input-dirs demo/pkg/apis/demo -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt -O zz_generated.conversion --extra-peer-dirs k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/conversion,k8s.io/apimachinery/pkg/runtime
/var/wangjq/golang/bin/bin/deepcopy-gen --input-dirs demo/pkg/apis/demo/v1 --input-dirs demo/pkg/apis/demo -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt -O zz_generated.deepcopy
/var/wangjq/golang/bin/bin/openapi-gen --input-dirs demo/pkg/apis/demo/v1 --input-dirs demo/pkg/apis/demo -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt -i k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/api/resource,k8s.io/apimachinery/pkg/version,k8s.io/apimachinery/pkg/runtime,k8s.io/apimachinery/pkg/util/intstr,k8s.io/api/admission/v1beta1,k8s.io/api/admissionregistration/v1alpha1,k8s.io/api/admissionregistration/v1beta1,k8s.io/api/apps/v1,k8s.io/api/apps/v1beta1,k8s.io/api/apps/v1beta2,k8s.io/api/authentication/v1,k8s.io/api/authentication/v1beta1,k8s.io/api/authorization/v1,k8s.io/api/authorization/v1beta1,k8s.io/api/autoscaling/v1,k8s.io/api/autoscaling/v2beta1,k8s.io/api/batch/v1,k8s.io/api/batch/v1beta1,k8s.io/api/batch/v2alpha1,k8s.io/api/certificates/v1beta1,k8s.io/api/core/v1,k8s.io/api/events/v1beta1,k8s.io/api/extensions/v1beta1,k8s.io/api/imagepolicy/v1alpha1,k8s.io/api/networking/v1,k8s.io/api/policy/v1beta1,k8s.io/api/rbac/v1,k8s.io/api/rbac/v1alpha1,k8s.io/api/rbac/v1beta1,k8s.io/api/scheduling/v1alpha1,k8s.io/api/settings/v1alpha1,k8s.io/api/storage/v1,k8s.io/api/storage/v1alpha1,k8s.io/api/storage/v1beta1,k8s.io/api/core/v1 --output-package demo/pkg/openapi
/var/wangjq/golang/bin/bin/defaulter-gen --input-dirs demo/pkg/apis/demo/v1 --input-dirs demo/pkg/apis/demo -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt -O zz_generated.defaults --extra-peer-dirs= k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/conversion,k8s.io/apimachinery/pkg/runtime
/var/wangjq/golang/bin/bin/client-gen -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt --input-base demo/pkg/apis --input demo/v1 --clientset-path demo/pkg/client/clientset_generated --clientset-name clientset
/var/wangjq/golang/bin/bin/client-gen -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt --input-base demo/pkg/apis --input demo --clientset-path demo/pkg/client/clientset_generated --clientset-name internalclientset
/var/wangjq/golang/bin/bin/lister-gen --input-dirs demo/pkg/apis/demo/v1 --input-dirs demo/pkg/apis/demo -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt --output-package demo/pkg/client/listers_generated
/var/wangjq/golang/bin/bin/informer-gen --input-dirs demo/pkg/apis/demo/v1 --input-dirs demo/pkg/apis/demo -o /var/wangjq/golang/src --go-header-file boilerplate.go.txt --output-package demo/pkg/client/informers_generated --listers-package demo/pkg/client/listers_generated --versioned-clientset-package demo/pkg/client/clientset_generated/clientset --internal-clientset-package demo/pkg/client/clientset_generated/internalclientset
2019/09/26 09:19:04 CGO_ENABLED=0
go build -o bin/apiserver cmd/apiserver/main.go
go build -o bin/controller-manager cmd/controller-manager/main.go
etcd
bin/apiserver --etcd-servers=http://localhost:2379 --secure-port=9443 --delegated-auth=false
W0926 09:19:16.495764    2406 authorization.go:34] Authorization is disabled
W0926 09:19:16.495828    2406 authentication.go:56] Authentication is disabled
I0926 09:19:16.504351    2406 logs.go:41] Defaulting fields for Bird bird-example
I0926 09:19:16.540151    2406 serve.go:89] Serving securely on [::]:9443
I0926 09:19:17.502752    2406 logs.go:41] Defaulting fields for Bird bird-example
to test the server run `kubectl --kubeconfig kubeconfig api-versions`
bin/controller-manager --kubeconfig=kubeconfig
2019-09-26 09:19:18.036499 I | Running reconcile Bird for bird-example

2.验证apiserver是否运行正常

[root@wangjq demo]# kubectl --kubeconfig kubeconfig api-versions
demo.qianxin.com/v1

3.client-go源代码(创建,删除,更新,获取)

package mainimport (birdApiv1 "demo/pkg/apis/demo/v1"clientset "demo/pkg/client/clientset_generated/clientset""encoding/json""fmt"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"schema "k8s.io/apimachinery/pkg/runtime/schema"restclient "k8s.io/client-go/rest"
)var url = "127.0.0.1:9443"
var newName string = "client-go-demo"type ResourceHandler struct {client *DemoClient
}type DemoClient struct {Client *clientset.Clientset
}func newResourceHandler() *ResourceHandler {return &ResourceHandler{client: NewDemoClient()}
}func NewDemoClient() *DemoClient {c := &DemoClient{}c.Client = clientset.NewForConfigOrDie(&restclient.Config{Host: url,TLSClientConfig: restclient.TLSClientConfig{Insecure: true,},APIPath: "/apis/demo.qianxin.com",ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Group:   "demo",Version: "v1",}}})fmt.Println(c.Client)return c
}func (c *ResourceHandler) CreateBird() {namespace := &birdApiv1.Bird{ObjectMeta: metav1.ObjectMeta{Name: newName,},Status: birdApiv1.BirdStatus{},Spec: birdApiv1.BirdSpec{Datetime:      "2018-06-14T18:00:00Z03:00",AwayTeamGoals: 9,AwayTeam:      "wangjq",HomeTeam:      "demo",HomeTeamGoals: 10,},}_, err := c.client.Client.DemoV1().Birds("default").Create(namespace)if err != nil {panic(err)}
}func (c *ResourceHandler) DeleteBird(name string) {if err := c.client.Client.DemoV1().Birds("default").Delete(name, &metav1.DeleteOptions{}); err != nil {panic(err)}
}func (c *ResourceHandler) UpdateBird(name string) {result := c.GetBird(name)result.Spec.AwayTeam = "zzzzz"result.Spec.Datetime = "2222-12-22T22:22:00Z03:22"result.Spec.HomeTeam = "zzzzz"c.client.Client.DemoV1().Birds("default").Update(result)
}func (c *ResourceHandler) ListBirds() {fmt.Println("============================ List All ============================")podList, _ := c.client.Client.DemoV1().Birds("default").List(metav1.ListOptions{})for key, value := range podList.Items {fmt.Println("第", key+1, "个pod.................")bytes, err := json.Marshal(value)if err != nil {return}fmt.Println(string(bytes))}for _, pod := range podList.Items {fmt.Printf("Name: %s, Status: %s, CreateTime: %s, Uid: %s\n",pod.ObjectMeta.Name, pod.Status, pod.ObjectMeta.CreationTimestamp, pod.GetUID())}
}func (c *ResourceHandler) GetBird(name string) *birdApiv1.Bird {result, err := c.client.Client.DemoV1().Birds("default").Get(name, metav1.GetOptions{})if err != nil {panic(err)}return result
}func main() {resourceHandler := newResourceHandler()resourceHandler.ListBirds()resourceHandler.CreateBird()resourceHandler.ListBirds()resourceHandler.UpdateBird(newName)resourceHandler.ListBirds()resourceHandler.DeleteBird(newName)resourceHandler.ListBirds()
}

4.运行测试

[root@wangjq demo]# go run client-demo.go
&{0xc00026ccc0 0xc0002124b0}
============================ List All ============================
第 1 个pod.................
{"metadata":{"name":"bird-example","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/bird-example","uid":"dc47307a-df78-11e9-a2d6-52540058aad0","resourceVersion":"196","generation":1,"creationTimestamp":"2019-09-25T09:42:59Z"},"spec":{"datetime":"","homeTeam":"","homeTeamGoals":0,"awayTeam":"","awayTeamGoals":0},"status":{}}
Name: bird-example, Status: {}, CreateTime: 2019-09-25 09:42:59 +0000 UTC, Uid: dc47307a-df78-11e9-a2d6-52540058aad0
============================ List All ============================
第 1 个pod.................
{"metadata":{"name":"bird-example","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/bird-example","uid":"dc47307a-df78-11e9-a2d6-52540058aad0","resourceVersion":"196","generation":1,"creationTimestamp":"2019-09-25T09:42:59Z"},"spec":{"datetime":"","homeTeam":"","homeTeamGoals":0,"awayTeam":"","awayTeamGoals":0},"status":{}}
第 2 个pod.................
{"metadata":{"name":"client-go-demo","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/client-go-demo","uid":"32718293-e03f-11e9-aab3-52540058aad0","resourceVersion":"522","generation":1,"creationTimestamp":"2019-09-26T09:22:44Z"},"spec":{"datetime":"2018-06-14T18:00:00Z03:00","homeTeam":"demo","homeTeamGoals":10,"awayTeam":"wangjq","awayTeamGoals":9},"status":{}}
Name: bird-example, Status: {}, CreateTime: 2019-09-25 09:42:59 +0000 UTC, Uid: dc47307a-df78-11e9-a2d6-52540058aad0
Name: client-go-demo, Status: {}, CreateTime: 2019-09-26 09:22:44 +0000 UTC, Uid: 32718293-e03f-11e9-aab3-52540058aad0
============================ List All ============================
第 1 个pod.................
{"metadata":{"name":"bird-example","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/bird-example","uid":"dc47307a-df78-11e9-a2d6-52540058aad0","resourceVersion":"196","generation":1,"creationTimestamp":"2019-09-25T09:42:59Z"},"spec":{"datetime":"","homeTeam":"","homeTeamGoals":0,"awayTeam":"","awayTeamGoals":0},"status":{}}
第 2 个pod.................
{"metadata":{"name":"client-go-demo","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/client-go-demo","uid":"32718293-e03f-11e9-aab3-52540058aad0","resourceVersion":"523","generation":2,"creationTimestamp":"2019-09-26T09:22:44Z"},"spec":{"datetime":"2222-12-22T22:22:00Z03:22","homeTeam":"zzzzz","homeTeamGoals":10,"awayTeam":"zzzzz","awayTeamGoals":9},"status":{}}
Name: bird-example, Status: {}, CreateTime: 2019-09-25 09:42:59 +0000 UTC, Uid: dc47307a-df78-11e9-a2d6-52540058aad0
Name: client-go-demo, Status: {}, CreateTime: 2019-09-26 09:22:44 +0000 UTC, Uid: 32718293-e03f-11e9-aab3-52540058aad0
============================ List All ============================
第 1 个pod.................
{"metadata":{"name":"bird-example","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/bird-example","uid":"dc47307a-df78-11e9-a2d6-52540058aad0","resourceVersion":"196","generation":1,"creationTimestamp":"2019-09-25T09:42:59Z"},"spec":{"datetime":"","homeTeam":"","homeTeamGoals":0,"awayTeam":"","awayTeamGoals":0},"status":{}}
Name: bird-example, Status: {}, CreateTime: 2019-09-25 09:42:59 +0000 UTC, Uid: dc47307a-df78-11e9-a2d6-52540058aad0

转载于:https://www.cnblogs.com/wangjq19920210/p/11593173.html

使用client-go自定义开发Kubernetes相关推荐

  1. TFS自定义开发中的反射应用

    <?xml version="1.0" encoding="UTF-8"?> 最近CM(Configuration Management) 的同事在 ...

  2. Ueditor自定义开发地图功能

    Ueditor自定义开发地图功能 由于最近需要对地图功能进行修改,所以基于Uedior做了二次开发,根据百度地图官方提供的api和例子,完成了以下功能: 即:显示圆形区域内的定点范围的周边设施! 地图 ...

  3. ecology关于流程表单设计器自定义开发及常见场景方案分享

    一.表单设计器模板如何自定义开发 表单设计器可设置自定义属性以及插入代码块,二者相辅结合.灵活运用,可实现多样化客户需求 自定义属性分为:行自定义属性(绑定在table布局tr行标签上).单元格自定义 ...

  4. 自定义开发popup点击非popup区域关闭popup

    自定义开发popup弹窗组件点击非popup区域关闭popup 如果是vue项目在vue的生命周期onMounted方法里面添加如下代码: onMounted(async ()=>{await ...

  5. 使用 C# 开发 Kubernetes 组件,获取集群资源信息

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  6. ServiceMix部署自定义开发程序(ActiveMQ和Kafka实现)

    上一篇整理了ServiceMix环境的搭建过程,接下来介绍在ServiceMix平台下如何开发程序并部署到Karaf容器内,同时介绍下karaf容器内置的ActiveMQ消息组件的发送和接收,以及目前 ...

  7. 从一个实际的例子出发,谈谈SAP Commerce Cloud电商云的UI自定义开发

    昨天 Jerry 读到了 SAP天天事 公众号上发布的一篇文章:多家知名企业选择 SAP Commerce Cloud 为客户提供卓越购物体验. SAP 日前宣布,锦江国际旗下的全球酒店供应链平台锦江 ...

  8. arduino joy_如何用Joy开发Kubernetes应用

    arduino joy Let's face it: Developing distributed applications is painful. 让我们面对现实:开发分布式应用程序很痛苦. Mic ...

  9. 自定义菜单url不能带_微服务架构【SpringBoot+SpringCloud+VUE】五 || 实战项目微信公众号自定义开发...

    本章主要讲解微信公众号自定义菜单.微信网页开发.模板消息推送等功能的实现: 发福利了,下方关注公众号,就能免费获取项目源码 1.自定义菜单 开发前需要了解以下几点: 1.微信公众号的自定义菜单最多包括 ...

最新文章

  1. 【Qt】AVFrame转QImage
  2. 独家 | NLP详细教程:手把手教你用ELMo模型提取文本特征(附代码论文)
  3. 基于MFC的socket编程(异步非阻塞通信)
  4. Leetcode--91. 解码方法
  5. 从头开始开发gis_DevRel工程师一:从头开始建立开发人员关系团队
  6. 实践 Redux,第 1 部分: Redux-ORM 基础
  7. 【转载】美国煤层气发展史
  8. 【图像隐写】基于matlab DCT数字水印添加+提取+干扰【含Matlab源码 803期】
  9. 【JY】YJK前处理参数详解及常见问题分析(六):地震信息
  10. 1208_MISRA_C规范学习笔记_Rule 10.3 Rule 10.5
  11. 什么是一条好链?——一定要有自主创新的硬核技术
  12. ZKTeco live20R指纹采集识别适配谷歌浏览器
  13. VMware14虚拟机破解版安装详细教程
  14. BZOJ3787 gty的文艺妹子序列 【树状数组】【分块】
  15. 720yun全景图+vue
  16. 90%的 CTO 都做不好绩效管理
  17. Vue项目引入icon图标的两种方法
  18. 网易考拉API开发系列:item_get-根据ID取商品详情 API 返回值说明
  19. 二极管ss14测量_开关二极管怎么测量好坏
  20. 谷歌seo外链预算方案,影响谷歌反向链接成本的因素

热门文章

  1. 无意义”的标签div和span的区别
  2. Linux sqlplus权限不足,sqlplus登录用户提示权限不足
  3. usg6620 查看端口流量_WhatRoute for Mac(互联网流量诊断查询工具)
  4. vue 计算屏幕的高度_学习Vue可以参考的10个开源项目——OpenSource
  5. mysql5.6兼容包_freebsd9.1源码安装apache、mysql、php环境(亲侧通过)
  6. logback 的 filter
  7. 89600 matlab,是德KEYSIGHT N9000B CXA 信号分析仪,多点触控,9 kHz 至 26.5 GHz
  8. linux 文件重命名_Linux编程 5 (目录重命名与移动 删除,目录创建删除,查看file)...
  9. python中exception类的_什么是Python异常?Python异常的种类
  10. python保存数据_Python 保存数据的方法(4种方法)