Kubernetes自动化了许多大规模管理容器的工作。但是容器化的应用程序通常共享池化的资源,因此您需要正确地分配和管理它们。
容器编排为IT团队提供了强大的承诺:它可以自动处理大量管理容器所需的大量工作。
想想Kubernetes (K8s)在项目官方网站上自我描述的强大功能:“Kubernetes (K8s)是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。”
这非常重要——特别是当您谈论的团队正在运行许多容器化应用程序时。虽然像Kubernetes这样的编配器本身的自动化,被广泛认为是在生产环境中运行容器的必要条件,但这并不意味着IT专业人员可以放松下来。
还有很多工作要做,包括设置和优化集群上运行的应用程序的资源管理方式。
为什么需要管理Kubernetes资源
Altran的技术、研究和创新总监Raghu Kishore Vempati说:“Kubernetes为计划在其上运行的pods提供了管理所有关键资源的选项——比如计算、内存和存储。”集群没有无限的资源,通常情况下,每个应用程序/解决方案都有自己的Kubernetes集群并不常见,除非它们非常特殊并且应该以这种方式运行。
这意味着应用程序通常共享集合的资源。分配这些资源的“正确”方式会因组织和应用程序的不同而不同,但好消息是Kubernetes包含了许多用于资源管理的特性。
Kasten的工程主管Tom Manville说:“Kubernetes可以部署在任何地方,但这意味着所需的基础设施将是您的环境所特有的。”“重要的是要了解你的环境中需要的资源,并适当地分配它们。随着集群的扩展,基础设施也必须扩展。幸运的是,扩展集群的规模很容易,而且在很多情况下,这可以自动发生。”
管理Kubernetes资源: 要知道的5个关键事情
Vempati指出,Kubernetes环境中的计算或存储等资源的管理可以大致分为两类:Kubernetes在系统级提供的资源,以及需要在应用程序和体系结构级进行规划的资源。这篇文章将主要关注前一类的功能。
让我们深入了解五件重要的事情。
1.使用命名空间和资源配额
Vempati指出,团队通常在同一个集群上运行多个应用程序。对于这种类型的使用,Vempati和其他专家通常建议在多租户环境中使用命名空间作为隔离和其他目的的最佳实践。类似地,当多个团队或多个用户访问同一个集群时(有时会同时运行多个应用程序),也建议使用命名空间。命名空间也是Kubernetes安全性的一部分。
当您在这些多应用程序、多用户环境中使用名称空间时,Vempati还建议使用Kubernetes的本地资源配额特性,以确保在分配给这些名称空间的应用程序和团队之间正确地分配内容。
“资源配额允许集群管理员控制每个命名空间的总体资源消耗,”Vempati说。这可以包括每个命名空间可以创建的对象的总数——计算、内存和存储。例如,我们可以在非终端状态下对所有pods设置CPU限制或内存限制,不超过某个值。”
来自Kasten的Manville指出,CPU和内存通常是管理员使用资源配额进行约束的最常见资源,但是您也可以限制名称空间中的pod数量。可以这样说,资源配额是一个重要的管理工具。
Vempati说:“基于配额的管理允许集群管理员有效地管理整体资源,以最合适的方式将它们分配给所有的应用程序。”
2.使用限制范围
资源配额用于在名称空间级别管理资源消耗。换句话说,一旦设置,它们将应用于整个命名空间。限制范围具有类似目的,但会限制单个容器或容器级别的资源消耗。
“Kubernetes为管理员提供了强大的原语,以控制应用程序消耗的资源”Manville说。“管理员可以配置限制范围,以限制开发人员的资源请求,并创建资源配额以限制命名空间中消耗的资源总数。”
考虑这些相关功能之间的区别的另一种方式是:可以使用名称空间和资源配额来确保应用程序或团队不会占用集群的总体池资源的必要份额。限制范围有助于防止单个pod或容器占用分配给特定名称空间的大部分资源的情况。
3.设置网络策略
Kubernetes还具有有关网络的本地特性,包括pods如何相互通信(或被阻止通信)。Vempati建议使用网络策略。
Vempati说:“对于网络,Kubernetes允许一个选项来设置网络策略,该策略可以帮助指定集群上调度的各个pods如何与其他节点以及同一集群上的其他端点通信。”“例如,我们可以为pods设定进出交通规则。” 这也是整体的、分层的容器安全方法的一部分。
4.如果适用,请不要忘记存储
存储值得自己深入研究。就像管理员可以对CPU和内存有非常特定的控制一样,相同的原理也适用于存储。
“Kubernetes帮助设定了非常细粒度的限制,”Vempati说。因此,在一个给定的名称空间中,您可以设置一个可以存在于该名称空间中的PersistentVolumeClaims的数量限制。
Red Hat的技术专员Gordon Haff将持久卷(PV)描述为有效 管理的最重要的Kubernetes资源之一。
Haff说:“配置不绑定到临时容器映像的存储的能力是Kubernetes的关键创新之一,它将Kubernetes与一些早期的基于容器的平台即服务(PaaS)产品区分开来。”“如果没有持久存储,你的应用架构就会局限于特定的样式。
Haff指出,Kubernetes中的PV是作为插件实现的,其生命周期与使用PV的任何单个Pod无关。PersistentVolumeClaim本质上是用户的存储请求,Haff补充说,它进一步抽象了PV的细节。
“ Kubernetes是按这种方式设计的,因为用户通常需要具有不同属性(例如性能)的PV来解决不同的问题和工作负载,” Haff解释说。“不同类型的PV也具有不同类型的访问模式。”
因此,这涉及到Vempati上面描述的第二类资源管理:应用程序和体系结构级别的资源规划。Haff指出,存储是一开始就需要评估的东西。
Haff说:“管理Kubernetes资源的一个重要部分是预先计划是否首先需要持久性存储(比如数据库),如果需要,那么哪个卷插件最适合您的工作负载和计算环境。”
谈到数据库,Crunchy Data的平台工程副总裁Jonathan Katz说,有状态应用程序为资源管理引入了一些额外的细微差别。“例如,内存是一个重要的PostgreSQL可调资源,”Katz说。在Kubernetes操作符的PostreqSQL背后隐藏着复杂的数据。
Katz解释说:“将你的内存请求设置为你想要长期使用的实际内存值是很重要的,而不是设置一个较低的请求和较高的限制。”“这将确保你的PostgreSQL实例被调度到一个有足够资源的节点,因为更多的数据被缓存在内存中,并且限制了事件的风险,比如驱逐或者被OOM杀手访问。”
5.保持整洁:API对象和监控
“如果您的任何应用程序直接使用Kubernetes API,请确保自动清理API对象,”Manville说。大量未使用的API对象会降低集群的性能。更糟糕的是,这些对象有时会映射到闲置的基础设施,这可能会增加不必要的成本。”
通常,有效的资源管理要求团队和管理员能够看到正在发生的事情。因此,不要忘记监视并确保密切关注集群之间的资源使用情况。
“这将帮助您更好地了解集群正在使用的资源,在集群接近容量时提醒您,并且在某些情况下,让Kubernetes自动伸缩,”Manville说。
*原文链接:https://enterprisersproject.com/article/2020/8/managing-kubernetes-resources-5-things-remember