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

1.本地运行 apiserver demo

[root@wangjq demo]# apiserver-boot run local
// :: 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
// :: CGO_ENABLED=
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 ::16.495764 authorization.go:] Authorization is disabled
W0926 ::16.495828 authentication.go:] Authentication is disabled
I0926 ::16.504351 logs.go:] Defaulting fields for Bird bird-example
I0926 ::16.540151 serve.go:] Serving securely on [::]:
I0926 ::17.502752 logs.go:] Defaulting fields for Bird bird-example
to test the server run `kubectl --kubeconfig kubeconfig api-versions`
bin/controller-manager --kubeconfig=kubeconfig
-- ::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 main

import (
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,
UID: "aead7663-a7b6-471a-a222-a94c41a99999",
},
Status: birdApiv1.BirdStatus{},
Spec: birdApiv1.BirdSpec{
Datetime: "2018-06-14T18:00:00Z03:00",
AwayTeamGoals: ,
AwayTeam: "wangjq",
HomeTeam: "demo",
HomeTeamGoals: ,
},
}
_, 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{})
fmt.Println("podList: ", len(podList.Items))
for key, value := range podList.Items {
fmt.Println("第", key+, "个pod.................")
bytes, err := json.Marshal(value)
if err != nil {
return
}
fmt.Println(string(bytes)) fmt.Println("##################################################")
fmt.Printf("AwayTeam: %s\n", value.Spec.AwayTeam)
fmt.Printf("AwayTeamGoals: %s\n", value.Spec.AwayTeamGoals)
fmt.Printf("Datetime: %s\n", value.Spec.Datetime)
fmt.Printf("HomeTeam: %s\n", value.Spec.HomeTeam)
fmt.Printf("HomeTeamGoals: %s\n", value.Spec.HomeTeamGoals)
fmt.Println("##################################################")
}
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
&{0xc000292d40 0xc0002a3970}
============================ List All ============================
podList:
============================ List All ============================
podList:
第 个pod.................
{"metadata":{"name":"client-go-demo","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/client-go-demo","uid":"4264dd63-eb30-11e9-86cf-5098b81a3139","resourceVersion":"","generation":,"creationTimestamp":"2019-10-10T07:33:31Z"},"spec":{"datetime":"2018-06-14T18:00:00Z03:00","homeTeam":"demo","homeTeamGoals":,"awayTeam":"wangjq","awayTeamGoals":},"status":{}}
##################################################
AwayTeam: wangjq
AwayTeamGoals: %!s(int=)
Datetime: --14T18::00Z03:
HomeTeam: demo
HomeTeamGoals: %!s(int=)
##################################################
Name: client-go-demo, Status: {}, CreateTime: -- :: + HKT, Uid: 4264dd63-eb30-11e9-86cf-5098b81a3139
============================ List All ============================
podList:
第 个pod.................
{"metadata":{"name":"client-go-demo","namespace":"default","selfLink":"/apis/demo.qianxin.com/v1/namespaces/default/birds/client-go-demo","uid":"4264dd63-eb30-11e9-86cf-5098b81a3139","resourceVersion":"","generation":,"creationTimestamp":"2019-10-10T07:33:31Z"},"spec":{"datetime":"2222-12-22T22:22:00Z03:22","homeTeam":"zzzzz","homeTeamGoals":,"awayTeam":"zzzzz","awayTeamGoals":},"status":{}}
##################################################
AwayTeam: zzzzz
AwayTeamGoals: %!s(int=)
Datetime: --22T22::00Z03:
HomeTeam: zzzzz
HomeTeamGoals: %!s(int=)
##################################################
Name: client-go-demo, Status: {}, CreateTime: -- :: + HKT, Uid: 4264dd63-eb30-11e9-86cf-5098b81a3139
============================ List All ============================
podList:

使用client-go自定义开发Kubernetes的更多相关文章

  1. client-go客户端自定义开发Kubernetes及源码分析

    介绍 client-go 是一种能够与 Kubernetes 集群通信的客户端,通过它可以对 Kubernetes 集群中各资源类型进行 CRUD 操作,它有三大 client 类,分别为:Clien ...

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

    最近CM(Configuration Management) 的同事在自定义开发TFS的过程中遇到一个问题. 领导要求快速开发一个工具, 可以自动连接TFS,然后自动Check out一些word文件 ...

  3. odoo通过actions.client进行自定义页面

    一.使用原因 由于odoo自带页面在项目开发过程中无法满足使用,需要使用到动作ir.actions.client进行自定义视图的开发,实现自定义的xml视图开发. 二.实现目标 三.开发过程 1.项目 ...

  4. VS自定义开发向导中的vsdir文件的简单说明

    作者:朱金灿 来源:http://blog.csdn.net/clever101 VS自定义开发向导中有一个vsdir文件.这个文件指定了在VS中项目的标题.默认工程名等内容.下面对vsdir文件做一 ...

  5. 封装:简要介绍自定义开发基于WPF的MVC框架

    原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...

  6. Office 365 Connectors 的使用与自定义开发

    前言 我相信很多人都看过<三国演义>,里面有很多引人入胜的故事和栩栩如生的人物,对我而言,曹操手下的一员猛将典韦实在让我印象深刻.例如,书中有一段描写典韦的作战经历: 时西面又急,韦进当之 ...

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

    写什么呢 前段时间使用 C# 写了个项目,使用 Kubernetes API Server,获取信息以及监控 Kubernetes 资源,然后结合 Neting 做 API 网关. 体验地址 http ...

  8. BizTalk动手实验(十一)自定义开发管道组件

    1 课程简介 通过本课程熟悉自定义开始管道组件的流程.各组件接口的功能作用以及自定义管道. 本场景为开发一个消息ZIP压缩的发送管道组件. 2 准备工作 1. 熟悉管道组件各阶段组成 2. 下载Ion ...

  9. openERP笔记,自定义开发模块

    ##目标 OpenERP模块基本结构 使用模块添加额外的字段(Date Required和Rush Order) 扩展视图, 让OpenERP能够显示新的字段 修改用于OpenERP工作流的可用状态 ...

随机推荐

  1. 【论文笔记】Self-Supervised GAN :辅助性旋转损失的自监督生成式对抗网络

    这是CVPR2019上UCLA和google brain的一个工作.模型非常简单,利用辅助损失解决GAN不稳定问题:用旋转分类将辅助分类器对label的需求去掉,使图片可以直接对自己标注类别. Sel ...

  2. 【Laravel】 常用的artisian命令

    全局篇 查看artisian命令 php artisan php artisan list 查看某个帮助命令 php artisan help make:model 查看laravel版本 php a ...

  3. PHP date_timezone_set() 函数

    ------------恢复内容开始------------ 实例 设置 DateTime 对象的时区: <?php$date=date_create("2013-05-25" ...

  4. 数据库允许空值(null),往往是悲剧的开始

    原文: 58沈剑   架构师之路   https://mp.weixin.qq.com/s/XRSPITgWWK-2Ee-cSIqw1w 数据库字段允许空值,会遇到一些问题,此处包含的一些知识点,和大 ...

  5. IDEA插件配置推荐

    一.配置 [自动编译]如下图配置:推荐指数[***] [忽略大小写]说明:IDEA默认是匹配大小写,此开关如果未关,你输入字符一定要符合大小写.比如敲string是不会出现代码提示或只能补充.但是如果 ...

  6. Mybitis根据工具类反射数据库生成映射+整合springboot

    一 反向生成数据库mapper的工具类: 添加依赖 <dependency> <groupId>org.mybatis.generator</groupId> &l ...

  7. Android布局的一些属性和开关、创建log图片

    文本的一些属性 android:id="@+id/editText" 给文本的id重命名 android:layout_width="wrap_content" ...

  8. Python制作AI贪吃蛇,很多很多细节、思路都写下来了!

    前提:本文实现AI贪吃蛇自行对战,加上人机对战,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都一样) 实现效果: 很多人学习python,不知道从何学 ...

  9. 学会这些Python美图技巧,就等着女朋友夸你吧

    一.前言 Python中有许多用于图像处理的库,像是Pillow,或者是OpenCV.而很多时候感觉学完了这些图像处理模块没有什么用,其实只是你不知道怎么用罢了.今天就给大家带了一些美图技巧,让你的图 ...

  10. 《RabbitMQ》如何保证消息不被重复消费

    一 重复消息 为什么会出现消息重复?消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复. 1.1 生产时消息重复 由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认 ...