Kubernetes 新概念 “Initializers”解析(中):能让你为集群编写插件的新模型
initialization 剖析
1.配置需要 initialization 的资源类型 :
InitializerConfiguration(https://kubernetes.io/docs/admin/extensible-admission-controllers/#configure-initializers-on-the-fly) 对象允许你配置被 initializers 分配到的资源类型。
举个例子来说,你可以进行创建,将“myproxy”initializer 添加到类型apps/v1beta1.Deployment 和 v1.DeamonSet 对象中。你可以尽可能多地创建 InitializerConfigurations,它们将适用于所有命名空间 。
2.API 服务器将为新资源分配 initializers:
当你向 apiserver 提交 Deployment 对象时,将更新 Deployment 的metadata.initalizers.pending 并在其中添加“myproxy”值。此字段显示当前分配给资源的initializers 。
准确的说,不是由 apiserver 添加 initializers。有一个名为“Initializer”的准入控制插件,这使整个 initialization 流程成为可能。它通过将 –admission-controller=Initializer 标志添加到 kube-apiserver 来进行启用 。
3.可以编写一个控制器来检测资源情况:
你开发并部署到集群的自定义控制器使用Watch API 来对新的资源进行监听,捕获并进行所需的修改。
4.等待修改资源的轮次:
一旦你的控制器通过 Watch API 拦截一个对象,它只能修改对象,如果它在初始化器列表(metadata.initializers.pending[0])的第一个元素上检查到它的名字的话。否则,这意味着它是一些其他 initializers 修改资源的轮次,而现在应该跳过修改。
5.完成修改, 生成下一个 initializer。
完成对资源的修改后, 控制器应从对象的 metadata.initializers.pending 列表中删除其名称, 并将该对象保存回 API 服务器。
6.不存在更多 initializers 时, 资源准备好进行实现:
当 Kubernetes API 服务器检测到该对象没有其他挂起的 initializers 时, 它会判定对象 “已initialized”。Kubernetes 调度程序和其他控制器可以检测到完全 initialized 的对象并加以利用。
您可以同时在群集上运行多个 initializers。这些自定义控制器中的每一个都将收到有关对资源 (如 Pods) 的修改的通知, 但他们会等待轮次来对对象进行修改,直到他们在列表中检测他们的名字。
Initializers:在 Kubernetes API 中进行实现
在不知道它们实际上是如何在 Kubernetes API 服务器之下实现的情况下,你可以对 initializers 进行开发和部署 。我们来详细讨论一下它是如何在 Kubernetes API 中进行实现的:
简而言之, 当一个 Pod 资源提交到 API 并被分配一个待定的 initializers 列表时, 直到 initialization 完成,它实际上都不会被安排。Kubernetes 调度程序, 这个所谓的调度程序其实是另一个控制器,检测在 API 服务器中显示的 pod,并分配给每个节点。
那么, 为什么调度程序和其他控制器在初始化之前无法看到该对象, 即使该对象保存在 API 服务器 (和预计数据库中), 并且对某些其他控制器 (即 initializers)可见?
答案是存在一个叫 includeUninitialized 的请求参数。此参数默认为 false, 因此, API 将未初始化的对象从默认客户端(如 kubectl)和控制器 (如调度程序) 隐藏在 “监视” 或 “列表” 之类的请求中。所以你开发的 initializers 必须设置 includeUninitialized = true 查询参数才能监测这些对象。
Initializers 阻止创建请求。当创建对象的请求提交到 API 服务器时, 它不会马上返回, 并且请求会一直被阻止, 直到 initialization 完成。如果使用的是 kubectl, 并且对象在 uninitialized 状态下被阻止, 你会在30秒后发现 kubectl 超时。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
k8s+Jenkins+GitLab-自动化部署asp.net core项目
0、目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 此文阅读目录: 1、闲聊 2、部署流程介绍 3、部署Harbor仓库 4、jenkins-slave镜像搭建 5、部署jenkins 6、jenkins+gitlab挂钩 7、k8s部署asp.net core项目 一、闲聊 现在基本上是隔几天写一篇文章,还是不够勤奋,努力把自己打造成勤奋的人,把工作上面所用到的技术点分享给大家。为了研究k8s自动化部署aspnet core项目,足足花费了我一个礼拜的时间,过程是痛苦的,但结果是美好的。 如果以下内容有不足的地方,请指出,我会第一时间更正。谢谢大家。 二、部署流程介绍 1、先上一下手绘导图,大致的流程图如下:(不喜勿喷呀) 大致的部署流程是这样的:开发人员把做好的asp.net core项目代码通过git推送到gitlab,然后Jenkins通过 gitlab webhook (前提是配置好),自动从拉取gitlab上面拉取代码下来,然后进行build,编译、生成...
- 下一篇
CentOS7环境安装Kubernetes四部曲之一:标准化机器准备
通过Rancher安装Kubernetes的文章前面已经写过,但那时是需要科学上网才能安装成功(下载gcr.io/google_containers/XXXXX的镜像),本次实战依旧是用Rancher来安装Kubernetes,但是会做一些设置,使得不用翻墙也能成功安装K8S环境,另外,在CentOS7环境下,有些设置如果处理不当也会导致安装失败或者加入节点失败,所以也会在本文中交代清楚; 章节列表 整个《CentOS7环境安装Kubernetes四部曲》由以下四篇文章组成: 1. 标准化机器准备,不论是master还是node节点,都要先做一些同样的设置,本章会将这些步骤列出,请参照本章对每一台机器做同样的设置; 2. 安装master,配置模板; 3. 在K8S环境加入机器,并快速部署一个应用作为体验; 4. 安装kubectl工具; 版本信息 本次涉及到的重要软件的版本信息如下: 1. 操作系统:CentOS Linux 7 (3.10.0) 2. Docker:1.12.3 3. Kubernetes:v1.8.3 机器信息 整个环境由两台CentOS7的机器组成,如下: ho...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7安装Docker,走上虚拟化容器引擎之路