Kubernetes v1.7新增了初始化器,它可以用来方便地扩展准入控制,今天的文章来自Google Kubernetes现役工程师Ahmet Alp Balkan,让他带领我们详解Initializer。上期将带大家做一个简单的了解,明白初始化器到底能为我们带来什么。
Kubernetes如今能大展拳脚的原因有二:一,因为他社区的无限优势;二是,源于Kubernetes API的灵活性,以及能轻而易举地在其上编写自定义扩展或者插件。而在本文中,我将深入剖析一个新的概念:Initalizers,它能在实际创建之前修改Kubernetes动态资源和可插拔方式。
初始化器已经在Kubernetes 1.7中作为Alpha功能。举个例子来说,我们可以在Google Container Engine中使用Intializers来扩展Kubernetes的基础功能,也可以根据需求实现新的initializers设置。
到目前为止,Kubernetes只有在插件创建之前用准入控制插件来拦截资源。例如,你可以使用一个准入插件来强制让所有容器镜像来自特定的注册表,并组织其他镜像被部署在pod中,有相当多的准入控制器提供的功能,如执行限制,应用创建检查,并为缺少的字段设置默认值。
但准入控制器也存在如下问题:
- 他们被编译在Kubernetes:如果你寻找的目标缺失,你需要fork Kubernetes,并且写一个准入插件,并自己保持fork。
- 您需要通过将其名称传递给kube-apiserver的 – 入场控制标志来启用每个准入插件。在很多情况下,这意味着重新部署集群。
- 某些托管集群的供应商可能不允许自定义API服务器标志,因此可能无法启用源代码中可用的所有准入控制器。
目前有两种类型的插件:初始化器和网钩子。初始化器类似于准入控制器插件,你可以在创建资源之前截取它。它们也与准入控制器插件不同,因为它们不是Kubernetes源代码的一部分,也不是编译而成的。你需要自己写一个控制器。
你能用初始化器做什么?
当你在创建Kubernetes对象之前截取它们时,存在着无穷的变数:你可以以任何方式来变换对象,或防止对象被创建。
以下是对初始化者的一些想法,每个都在你的集群中实施一个特定的策略:
- 如果该容器开放80端口或具有特定的注释,则向该pod注入一个代理sidecar容器。
- 将带有测试证书的卷自动插入测试命名空间中的所有pod。
- 如果一个隐藏密码少于20个字符(有可能是密码),则阻止其创建。
如果你不打算修改对象并且拦截只读对象,web hook子可能会是一个更快和更精简的选择来获取有关对象的通知。
上面列出的一些功能,例如注入sidecar容器或卷,也可以使用Pod Presets以牺牲灵活性来进行实现。
下期导读:将作为你具体解析初始化器,并指出其优势和缺陷,同时手把手教你开发你自己的初始化器。
原文链接:HTTPS://ahmet.im/blog/initializers/
作者简介
Ahmet Alp巴尔干
Kubernetes和Google容器引擎现役工程师,负责开发开源软件,精益开发经验并传播相应技术细节。
未经允许不得转载:DaoCloud道客博客 » Kubernetes 新概念 “Initializers”解析(上):能让你为集群编写插件的新模型