很多好处之一的容器和Kubernetes扩展更大的潜在的计算基础设施的使用效率。然而,错误的假设关于CPU和内存可以产生更大的云基础设施浪费(和成本)microservices比任何失误和独立应用程序。
为了避免这种效率低下,实际上监控k8集群的资源消耗,加上一种自动使达到最佳状况舱要求,雷竞技rabet官网对提高效率至关重要,并确保应用程序规模的一小部分成本。
在这篇文章中,我们描述了使用的美丽动态承认控制器自动实现海洋现货的分级的建议,没有用户需要改变他们的生成k8 yaml。
从Kubernetes可观测性可控诉的情形
著名的管理顾问,彼得•德鲁克曾指出,“如果你不能度量它,你就不能改进它。”
这是真的Kubernetes。
有几种方法观察Kubernetes应用程序资源的数量需要如cAdvisor Metrics-Serv雷竞技rabet官网er,普罗米修斯和更多。海洋提供了内置,pod资源利用率持续的监控,分析和所需的资源调整的建议。
然而,即使这些指标可用,我们仍然需要一种方法来确保正确的雷竞技rabet官网需要定义在一个无痛、自动方式。
幸运的是,自动化的过程将这些指标纳入舱/容器资源完成”可以很容易地定义在两个不同的方面:雷竞技rabet官网
- 改变我们的应用程序k8 yaml中CI / CD管道,这样资源请求将匹配上述系统的观测值(见详细的步骤与詹金斯例子)。
- 更新pod资源请求“动态”就在它持续到k8数据存储(例如ETCD)。
在下面几节中,我们将重点放在第二个选项。
承认控制器
的Kubernetes网站定义了一个入学控制器随着“段代码,拦截请求Kubernetes API服务器对象的持久性,但在请求身份验证和授权。“这意味着当一个API请求是k8 APISERVER,启用(不同的)承认控制器负责做“东西”的要求。
你问这是什么“东西”。嗯,这取决于“kube-apiserver”服务的配置。让我们列举一些他们的例子:
- 你试过删除名称空间,其中包含不同的k8对象(部署/豆荚/ ConfigMaps /机密/等等…)?你注意到这些对象被删除名称空间删除过程的一部分吗?这是由于NamespaceLifecycle承认控制器。如果你的文档,你会发现这个招生负责拒绝创建对象在一个名称空间中,不存在。
- 你熟悉的ResourceQuota对象可以限制一个名称空间的分配的CPU,内存,存储和更多?这种“机制”工作的感谢ResourceQuota承认控制器。
- 创建一个PVC (PersistentVolumeClaim)导致光伏(PersistentVolume)即使你没有指定任何StorageClass ?这是由于DefaultStorageClass承认控制器手表没有创建任何新的PVC StorageClass定义规范和自动添加默认StorageClass PVC。
所有可用的入学控制器记录在这里。另外两个重要的录取控制器(特别是对于这个博客):ValidatingAdmissionWebhook和MutatingAdmissionWebhook。
现在我们知道什么入学控制器,我们描述“动态承认控制器”是什么
动态承认控制器
的Kubernetes网站说,“承认插件可以开发扩展和运行如人在运行时配置”。换句话说,承认插件是“代码”,可以开发的k8用户/管理员,和之前拦截API请求持久化到数据库。的主要优势是不同于“普通”入学控制器(其功能设定的k8维护者),这些动态控制器可以包含任何逻辑,用户需求(只要是尊重webhook API方案)。
一小段历史:这种机制允许用户添加自己的功能(通过编写自己的代码)系统并不新鲜。对于那些一直在大型机行业工作(像我一样),你可能会发现入学控制器非常相似z / OS退出程序。这些出口有能力操作流程(转换编码,重复的数据流,等. .),同时保持了os进程。足够的历史(尽管主机仍然是启动和运行:-)。
有两个类型的录取人:验证和变异。
变异录取人
MutatingAdmissionWebhook是第一个被称为。这个webhook的目的是改变k8对象由APISERVER在保存前。举个例子,如果你想确保每个部署带有一个antiAffinity定义为了传播的不同豆荚部署在不同的工人节点(见我的博客k8调度),您可以使用变异webhook为了注入antiAffinity定义的部署是没有它。要考虑的一件事是,尽管对象可以/将突变,不确保它将持续APISERVER,作为以后控制器(如以下我们将讨论)可能会拒绝请求。
确认录取人
ValidatingAdmissionWebhook被称为最后的处理链,它不能改变对象,只有验证它。它是一个很好的机制,可用于否认任何请求不符合组织的政策。举个例子,如果你想确认没有人在使用hostPath体积的部署,您可以使用这些API验证Webhook拒绝请求。
使用动态承认人与现货的调整建议
在现场,我们提供我们的用户裁员的建议在圆荚体资源请求作为我们的k8基础设施管理解决方案。这意味着这些建议,用户可以更好的操作定义所需的资源舱,和消除不必要的能力最初由用户定义。雷竞技rabet官网
实现这些建议没有任何额外的改变用户管道将应用程序部署到集群k8,我们开发了一个webhook服务器,ocean-right-sizing-mutator听变异人的请求,与之交互海洋裁员API和变异资源定义如果是,百分比涨幅,低或高于海洋API所给予的建议。的自述项目的文件记录了如何安装webhook服务器集群,以及如何注释您的部署webhook会变异。
这是一个图描述的过程在使用Ocean-Resource-Mutator k8集群:
我们需要开发自己的Webhook-Server
我已经按照下面的例子:
- https://medium.com/ovni/writing - -非常基本kubernetes变异webhook - 398 dbbcb63ec——承认
- https://medium.com/ibm-cloud/diving-into-kubernetes-mutatingadmissionwebhook-6ef3c5695f74
- 在他们Kubernetes E2E测试Github库
在下面的文章中,我将介绍一些重要的配置需要考虑。
TLS
由于webhook服务器能够针对APISERVER变异/否认任何请求,需要担保,从而提供一个TLS证书来操作。使用以下DNS服务器必须使用证书替代名称:“webhook-service-name.webhook-service-namespace.svc”。
这个备用DNS名称用于webhook服务器的身份验证。此外,MutatingWebhook / ValidationWebhook配置的字段“caBundle”需要设置为“base64编码PEM包包含CA签署webhook的服务证书”。APISERVER这样做的原因是,根据webhook服务器执行客户机身份验证,提供包含CA的PEM包。
你可以找到这样的配置脚本生成的证书存储库。
幂等性
自从webhook可能引发几次为单个API请求(由k8 APISERVER本身),这是非常重要的,你的服务器将幂等。意义,任何额外的请求已经变异的对象,必须用相同的突变结果输出的第一个初始请求。文档给我们的例子非幂等性操作,如:
- 注射侧车容器一个吊舱自动生成后缀——这可能导致多个sidecar容器在同一仓。例如:“sidecar-a2c23d”、“sidecar-f9ej3”和“sidecar-p3mm34”webhook的3种不同的调用。
- 处理k8对象(例如豆荚)基于他们的标签,在更改这些标签的突变。这可能导致情况第二个调用处理对象不同然后第一次调用。
请求失败
处理突变请求的时候,我们应该考虑如何处理错误(任何类型的)。如果我们不能在错误发生时webhook(如果我们得到空值作为我们处理)的一部分,这将导致一个对象,从集群将被拒绝。可能会有一些情况下,我们希望这样的事情发生(拒绝创建集群中的一个对象),但我们需要注意的。因此在设计webhook服务器逻辑时,我们应该决定我们想要总是允许请求(即使有一个失败的业务逻辑webhook服务器)。在我们的海洋裁员Mutator webhook服务器,我们总是允许创建部署,即使我们的API的反应是无效/返回一个错误。
随时尽变异webhook当然我很乐意听到你的反馈。
Twitter: @tsahiduek
