【转载】据说这是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

相关文章

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Python实现剪贴板历史管理器

《Python实现剪贴板历史管理器》在日常工作和编程中,剪贴板是我们使用最频繁的功能之一,本文将介绍如何使用Python和PyQt5开发一个功能强大的剪贴板历史管理器,感兴趣的可以了解下... 目录一、概述:为什么需要剪贴板历史管理二、功能特性全解析2.1 核心功能2.2 增强功能三、效果展示3.1 主界面

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

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

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