【转载】据说这是k8s历史上的第一个operator

2024-05-09 05:32

本文主要是介绍【转载】据说这是k8s历史上的第一个operator,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原贴地址:

据说这是k8s历史上的第一个operator_理工男Happy大叔的博客-CSDN博客_k8s operatorhttps://www.cnblogs.com/zhaowei121/p/10255540.html根据这个文章的描述,我们可以看出,k8s历史上第一个opertaor雏形应该是etcd-operator。为了了解operator的原理,我找到了etcd-operator的代码仓库,然后根据commit时间,找到了一个简单易懂的operator-demo。看完代码让我惊叹,原来operator居然几百行代码就可以完成。https://github.com/coreos/etcd-operator/.https://blog.csdn.net/LIUHUAN0520/article/details/113647187?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.nonecase

https://www.cnblogs.com/zhaowei121/p/10255540.html 根据这个文章的描述,我们可以看出,k8s历史上第一个opertaor雏形应该是etcd-operator。

为了了解operator的原理,我找到了etcd-operator的代码仓库,然后根据commit时间,找到了一个简单易懂的operator-demo。看完代码让我惊叹,原来operator居然几百行代码就可以完成。

https://github.com/coreos/etcd-operator/tree/0f998e0f17a810c8f1a549c76ddc69fe8711eac0。

附上代码膜拜一下,只是由于依赖的版本、仓库地址变化,现在不能直接运行起来。

package mainimport ("encoding/json""errors""flag""fmt""log""net/http""strings""github.com/pborman/uuid""k8s.io/kubernetes/pkg/api""k8s.io/kubernetes/pkg/client/restclient""k8s.io/kubernetes/pkg/client/unversioned""k8s.io/kubernetes/pkg/util/intstr"
)var masterHost stringfunc init() {flag.StringVar(&masterHost, "master", "http://127.0.0.1:8080", "usage")flag.Parse()
}type etcdClusterController struct {kclient *unversioned.Client
}func (c *etcdClusterController) Run() {eventCh, errCh := monitorNewCluster()for {select {case event := <-eventCh:c.createCluster(event)case err := <-errCh:panic(err)}}
}func (c *etcdClusterController) createCluster(event newCluster) {size := event.Sizeuuid := generateUUID()initialCluster := []string{}for i := 0; i < size; i++ {initialCluster = append(initialCluster, fmt.Sprintf("etcd%d-%s=http://etcd%d-%s:2380", i, uuid, i, uuid))}for i := 0; i < size; i++ {etcdName := fmt.Sprintf("etcd%d-%s", i, uuid)svc := makeEtcdService(etcdName, uuid)_, err := c.kclient.Services("default").Create(svc)if err != nil {panic(err)}// TODO: add and expose client portpod := makeEtcdPod(etcdName, uuid, initialCluster)_, err = c.kclient.Pods("default").Create(pod)if err != nil {panic(err)}}
}type newCluster struct {Kind       string            `json:"kind"`ApiVersion string            `json:"apiVersion"`Metadata   map[string]string `json:"metadata"`Size       int               `json:"size"`
}type Event struct {Type   stringObject newCluster
}func monitorNewCluster() (<-chan newCluster, <-chan error) {events := make(chan newCluster)errc := make(chan error, 1)go func() {resp, err := http.Get(masterHost + "/apis/coreos.com/v1/namespaces/default/etcdclusters?watch=true")if err != nil {errc <- errreturn}if resp.StatusCode != 200 {errc <- errors.New("Invalid status code: " + resp.Status)return}log.Println("start watching...")for {decoder := json.NewDecoder(resp.Body)var ev Eventerr = decoder.Decode(&ev)if err != nil {errc <- err}event := ev.Objectlog.Println("new cluster size:", event.Size)events <- event}}()return events, errc
}func main() {c := &etcdClusterController{kclient: mustCreateClient(masterHost),}log.Println("etcd cluster controller starts running...")c.Run()
}func mustCreateClient(host string) *unversioned.Client {cfg := &restclient.Config{Host:  host,QPS:   100,Burst: 100,}c, err := unversioned.New(cfg)if err != nil {panic(err)}return c
}func generateUUID() string {return uuid.New()
}func makeEtcdService(etcdName, uuid string) *api.Service {labels := map[string]string{"etcd_node": etcdName,"etcd_uuid": uuid,}svc := &api.Service{ObjectMeta: api.ObjectMeta{Name:   etcdName,Labels: labels,},Spec: api.ServiceSpec{Ports: []api.ServicePort{{Name:       "server",Port:       2380,TargetPort: intstr.FromInt(2380),Protocol:   api.ProtocolTCP,}},Selector: labels,},}return svc
}func makeEtcdPod(etcdName, uuid string, initialCluster []string) *api.Pod {pod := &api.Pod{ObjectMeta: api.ObjectMeta{Name: etcdName,Labels: map[string]string{"app":       "etcd","etcd_node": etcdName,"etcd_uuid": uuid,},},Spec: api.PodSpec{Containers: []api.Container{{Command: []string{"/usr/local/bin/etcd","--name",etcdName,"--initial-advertise-peer-urls",fmt.Sprintf("http://%s:2380", etcdName),"--listen-peer-urls","http://0.0.0.0:2380","--listen-client-urls","http://0.0.0.0:2379","--advertise-client-urls",fmt.Sprintf("http://%s:2379", etcdName),"--initial-cluster",strings.Join(initialCluster, ","),"--initial-cluster-state","new",},Name:  etcdName,Image: "gcr.io/coreos-k8s-scale-testing/etcd-amd64:3.0.4",Ports: []api.ContainerPort{{Name:          "server",ContainerPort: int32(2380),Protocol:      api.ProtocolTCP,},},},},RestartPolicy: api.RestartPolicyNever,},}return pod
}


 

这篇关于【转载】据说这是k8s历史上的第一个operator的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972515

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

从希腊神话到好莱坞大片,人工智能的七大历史时期值得铭记

本文选自historyextra,机器之心编译出品,参与成员:Angulia、小樱、柒柒、孟婷 你可能听过「技术奇点」,即本世纪某个阶段将出现超级智能,那时,技术将会以人类难以想象的速度飞速发展。同样,黑洞也是一个奇点,在其上任何物理定律都不适用;因此,技术奇点也是超越未来理解范围的一点。 然而,在我们到达那个奇点之前(假设我们能到达),还存在另一个极大的不连续问题,我将它称之

云原生之高性能web服务器学习(持续更新中)

高性能web服务器 1 Web服务器的基础介绍1.1 Web服务介绍1.1.1 Apache介绍1.1.2 Nginx-高性能的 Web 服务端 2 Nginx架构与安装2.1 Nginx概述2.1.1 Nginx 功能介绍2.1.2 基础特性2.1.3 Web 服务相关的功能 2.2 Nginx 架构和进程2.2.1 架构2.2.2 Ngnix进程结构 2.3 Nginx 模块介绍2.4

使用gradle做第一个java项目

涉及到的任务如下: assemble任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。 Total time: 5.581 secs E:\workspace\Test>gradle assemble :compileJava :processResources UP-TO-DATE :classes :findMainClass :jar :b