当前位置: 首页 > news >正文

网站建设网站维护网站外包为什么做游戏网站被封

网站建设网站维护网站外包,为什么做游戏网站被封,站长百科 wordpress,wordpress本地音乐播放器简介 在此之前我们先来了解下kubernetes的两个概念声明式API和控制器模式。声明式API核心原理就是当用户向kubernetes提交了一个API对象的描述后#xff0c;Kubernetes会负责为你保证整个集群里各项资源的状态#xff0c;都与你的API对象… 简介 在此之前我们先来了解下kubernetes的两个概念声明式API和控制器模式。声明式API核心原理就是当用户向kubernetes提交了一个API对象的描述后Kubernetes会负责为你保证整个集群里各项资源的状态都与你的API对象描述的需求相一致。而对于每个保存在etcd里的API对象kubernetes都通过启动一种叫做控制器模式的无限循环不断检查然后调谐最后确保整个集群的状态与这个API对象的描述一致。在kubernetes中我们所熟悉的deployment\statefulset都是其自带的一些控制器。 k8s提供了强大了扩展能力来操作它里面的资源这些资源可以是内置资源比如pod、node等也可以自定义资源CRD。 对于自定义资源稍微麻烦些我们需要做如下几步 自定义CRD通过k8s提供的代码生成器自动生成基础代码编写自己的业务逻辑也就是自定义controller来操作CRD 对于内置资源我们就只需第三步就可以了。 注CRD自定义controller又被称作operatorhttps://github.com/operator-framework/awesome-operators hrefhttps://github.com/operator-framework/awesome-operators%2a%2a%2ahttps://github.com/operator-framework/awesome-operators* 自定义CRD 比如我们想模仿pod的yaml那样自定义一个资源 apiVersion: xxxx/v1beta1 kind: TsTest metadata:name: tstest-sample spec:# Add fields heredeploymentName: tstest-sample-deploymentreplicas: 2 如果我们直接kubectl create 这个yaml文件会报错因为k8s不认识这个资源那怎样才能让k8s识别我们的自定义资源呢需要像下面这样创建一个自定义资源描述文件标准格式如下 apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata:# 名字必需与下面的 spec 字段匹配并且格式为 名称的复数形式.组名name: tstests.stable.example.com spec:# 组名称用于 REST API: /apis/组/版本group: stable.example.com# 列举此 CustomResourceDefinition 所支持的版本versions:- name: v1# 每个版本都可以通过 served 标志来独立启用或禁止served: true# 其中一个且只有一个版本必需被标记为存储版本storage: trueschema:openAPIV3Schema:type: objectproperties:spec:type: objectproperties:cronSpec:type: stringimage:type: stringreplicas:type: integer# 可以是 Namespaced 或 Clusterscope: Namespacednames:# 名称的复数形式用于 URL/apis/组/版本/名称的复数形式plural: tstests# 名称的单数形式作为命令行使用时和显示时的别名singular: tstest# kind 通常是单数形式的驼峰编码CamelCased形式。你的资源清单会使用这一形式。kind: TsTest# shortNames 允许你在命令行使用较短的字符串来匹配资源shortNames:- ts 上面就定义了一个叫TsTest的crd然后通过kubectl命令创建它此时我们再次执行我们最开始定义的那个资源文件就不会报错了并且也可以像pod那样CRUD操作了但是上面的那些都只是让k8s能够识别我们自定义的这个资源当我们通过yaml文件创建这个资源的时候k8s也只是将这个资源记录在了etcd中了而已没有触发任何的业务逻辑。 自定义controller k8s提供了一个专门的client-go库来简化开发者扩展k8s的代码编写编写自定义controller也是基于client-go库因此实现自定义controller大致就是 第1步是listwatch的初始化主要是返回一个针对某类资源的ListFunc和WatchFunc。第2步是informer的初始化新建Indexer并将上述Listwatcher一同放入informer结构中第3步是给informer添加AddEventHandler通常包含add update delete并根据情况引入workqueue可是默认的也可以是限速、延时等队列第4步是启动informer.Run()然后等待同步完成第5步是worker的启动监听退出信号等待退出。 其实一个controller就是一个生产者和消费者模式上面的1-4对应的就是生产者操作5步对应的就是消费者操作。 下面以简单的示例代码来看 //Create the endpoints watcher,endpointsQueue,endpointController endpointsListWatcher : cache.NewListWatchFromClient(clientset.CoreV1().RESTClient(),endpoints, v1.NamespaceAll, fields.Everything()) endpointsQueue : workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) endpointsIndexer, endpointsInformer : cache.NewIndexerInformer(endpointsListWatcher, amp;v1.Endpoints{}, ReSyncPeriod,cache.ResourceEventHandlerFuncs{AddFunc: c.addEndpoints,DeleteFunc: c.deleteEndpoints,UpdateFunc: c.updateEndpoints,}, cache.Indexers{})//Create the configmap watcher,endpointsQueue,endpointController configmapListWatcher : cache.NewListWatchFromClient(clientset.CoreV1().RESTClient(),configmaps, v1.NamespaceAll, fields.Everything()) configmapQueue : workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) configmapIndexer, configmapInformer : cache.NewIndexerInformer(configmapListWatcher, amp;v1.ConfigMap{}, ReSyncPeriod,cache.ResourceEventHandlerFuncs{AddFunc: c.addConfigMap,DeleteFunc: c.deleteConfigMap,UpdateFunc: c.updateConfigMap,}, cache.Indexers{})c.endpointsQueue endpointsQueue c.endpointsIndexer endpointsIndexer c.endpointsInformer endpointsInformerc.configmapQueue configmapQueue c.configmapIndexer configmapIndexer c.configmapInformer configmapInformer 上面的代码就是对应1-2步 go c.endpointsInformer.Run(stopCh) go c.configmapInformer.Run(stopCh) go c.informerFactory.Start(stopCh) go c.stsplusInformerFactory.Start(stopCh)//Wait for all involved caches to be synced, before processing items from the endpointsQueue is started //if !cache.WaitForCacheSync(stopCh, c.endpointsInformer.HasSynced, c.configmapInformer.HasSynced) { if !cache.WaitForCacheSync(stopCh, c.endpointsInformer.HasSynced, c.configmapInformer.HasSynced, c.podListerSynced, c.stsplusListerSynced) {runtime.HandleError(fmt.Errorf(Timed out waiting for caches to sync))return } 上面这段代码对应的就是3-4步。 for i : 0; i threadiness; i {go wait.Until(c.runEndPointsProcessWorker, time.Second, stopCh)go wait.Until(c.runConfigmapProcessWorker, time.Second, stopCh) }-stopChfunc (c *Controller) processEndPointsEvents() bool {seelog.Infof([processEndPointsEvents]: start to processEndPointsEvents)endpointsKey, endpointsQuit : c.endpointsQueue.Get()//Wait until there is a new item in the working endpointsQueuefor ;!endpointsQuit; endpointsKey, endpointsQuit c.endpointsQueue.Get(){defer c.endpointsQueue.Done(endpointsKey)//Handle the error if something went wrong during the execution of the updateRoute methodgo c.handleRoute(endpointsKey.(string))//defer c.handleErr(endpointsErr, endpointsKey)//c.endpointsQueue.Done(endpointsKey)}return true } 上面这段代码对应的就是5步。 到目前为止一个自定义controller的模式化代码就完成了剩下的就是具体的业务代码了因此可以看出依靠k8s提供的这个client-go库真正的做到了开发者只需关注业务开发基础相关的代码都已经被封装了。 源码分析 代码太多后面有时间再分析吧先上个总结 Reflector使用ListAndWatch方法先从apiserver中list某类资源的所有实例拿到对象的最新版本然后用watch方法监听该resourceversion之后的所有变化若中途出现异常reflector则会从断开的resourceversion处重新监听所有变化一旦有Add、Del、Update动作Reflector会收到更新通知该事件及它所对应的API对象这个组合被称为增量Delta,它会被放进DeltaFIFO中Informer会不断从这个DeltaFIFO中读取增量每拿出一个对象Informer就会判断这个增量的事件类型然后创建或更新本地的缓存。DeltaFIFO再pop这个事件到controller中controller会调用事先注册到ResourceEventHandler回调函数进行处理。 【Kubebuilder】 因为对于k8s内置的资源来说client-go已经提供了对应的infomer、cache、listenAndWatch等操作但是对于自定义资源来说如果要编写自定义controller这些都得自己编写这些样板代码基于此社区针对k8s的api扩展提供了一个通用的工具来自动生成脚手架这个工具就是Kubebuilder Kubebuilder 是一个基于 CRD 来构建 Kubernetes API 的框架可以使用 CRD 来构建 API、Controller 和 Admission Webhook。Kubebuilder的工作流程如下 创建一个新的工程目录创建一个或多个资源 API CRD 然后将字段添加到资源在控制器中实现协调循环reconcile loopwatch 额外的资源在集群中运行测试自动安装 CRD 并自动启动控制器更新引导集成测试测试新字段和业务逻辑使用用户提供的 Dockerfile 构建和发布容器。
http://www.hkea.cn/news/14339553/

相关文章:

  • 美橙智能网站行业网站建设教程
  • 网站制作品牌公司做网站须知
  • 做响应式网站的微博号如何做网站首页的psd图
  • 佛山专业建设网站郴州做网站的
  • 河北农业建设信息网站wordpress判断使用模版
  • php可以做网站布局吗昆山规划与建设局网站
  • 做公司的网站有哪些东西吗阿克苏交通建设局网站
  • 温州外贸网站建设资阳公司短视频优化服务
  • 江淮网站开发中信建设有限责任公司重庆沿江高速公路总承包部
  • 中英文网站多少钱策略网页游戏大全
  • 网站做推广需要营业执照一个服务器上建立多个网站吗
  • cnzz站长统计工具网站用什么构建
  • 宠物网站开发文档加氢站个公司好
  • 原创文章对网站的好处fireworks个人网站模板
  • 做个外贸网站泰国一家做男模的网站
  • 网站宣传费用手机端开发
  • 棕色网站设计深圳市住房建设局网站
  • 金鹏建设集团网站今天特大军事新闻
  • 中小企业的网站建设论文徐州关键词优化如何
  • 做流量的网站应该注意什么网站建设制作模板
  • 上海网站建设报价方案网站只收录主页
  • 荆州大气网站建设价格怎么做免费推广网站
  • 最新备案的网站餐饮业网站建设
  • 网站建设方案及报价单最新seo课程
  • 建筑工程网站定制帮建网站
  • 搜狗站长平台验证不了贵阳企业网站建设制作
  • 手机友好型网站聊天软件开发教程
  • 江阴响应式网站开发wordpress 描述
  • 电视剧男女直接做视频网站湘潭今天最新通知
  • 入驻京东需要自己做网站吗tp5企业网站开发