使用Linode引擎实现Kubernetes自动缩放的优秀实践
众所周知,云服务架构可以随着应用的需求实时扩展,而无需人工进行配置的更改或逐行增加代码。其中,自动化缩放(Autoscaling)就保证了在无需人工干预的情况下,自动增加或减少应用负载的能力。显然,如果调整得当,自动化缩放可以降低我们维护应用的成本、以及项目实施的难度。
对于Kubernetes而言,其自动化缩放的过程通常是:首先确定一组何时需要为Kubernetes扩展应用容量的指标。接着,设定一组被用来判定应用是该扩展、还是缩容的规则。最后,使用各种kubernetes
API,对应用程序的可用资源进行扩缩容,以满足程序执行和服务所需。
自动化缩放虽然是一个看似复杂的过程,但是它能够比其他技术更好地服务于特殊类别的应用。例如,如果某个应用程序在容量需求上不会经常发生更改的话,那么我们最好为其调配至最大的流量资源。类似地,如果您能够可靠地预测到某个应用的负载,则可以通过手动、而非自动的方式来调整容量。
除了应对应用程序的负载变化,自动调整功能还能够有效地进行成本和容量管理。例如,集群的自动调整功能允许您通过调整集群中的节点数量,来节省在公共云上的租金。此外,如果您有一个静态的架构,那么自动化调整将使您能够动态地管理分配给流量负载的容量,以便您能够更好地利用自己的基础设施。
在实际应用中,自动化缩放主要分为如下两类:
1. 负载的自动调整:动态地管理单个负载的容量,并进行自动分配。
2. 群集的自动缩放:动态地管理群集的容量。
让我们首先了解一下在Kubernetes中扩展负载的细节。目前,在Kubernetes上可被用于自动调整工作负载的标准化工具包括:水平Pod自动化缩放(Horizontal
Pod Autoscaler,HPA)、垂直Pod自动化缩放(Vertical Pod Autoscaler,VPA)、以及集群比例自动化缩放(Cluster
Proportional Autoscaler,CPA)。下面,让我们通过一个群集和简单的测试应用程序,来模拟Kubernetes的自动化缩放功能。
创建Linode-Kubernetes引擎集群
由Linode提供的名为Linode
kubernetes引擎(LKE)的托管式Kubernetes产品,非常容易入门。您可以注册一个免费的Linode帐户,然后按照LKE入门指南创建一个集群。
如下图所示,我创建了一个由两个节点(称为Linodes)组成的集群,每个节点都有2个CPU内核和4 GB内存:
LKE集群
为了使用该集群,您需要从集群的概述部分下载kubeconfig文件。虽然有好几种策略可供我们合并kubeconfig文件,但是我更喜欢通过更新带有指向kubeconfig文件路径的KUBECONDIG环境变量的方式来实现。
下面,让我们来构建一个简单的应用程序,以用来测试各种自动化缩放。
Pressure API
Pressure API应用运行在两个端点上。它属于.NET REST API,允许您通过如下两种途径,将CPU和内存的压力施加到pod上:
1.
/memory/{numMegaBytes}/duration/{durationSec}:此端点将向内存添加指定数量的兆字节,并在指定的持续时间内保持压力。
2.
/cpu/{threads}/duration/{durationSec}:此端点将在CPU上运行指定数量的线程,并在指定的持续时间内保持压力。
以下是该应用的完整源代码:
C#
using System.Xml;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapPost("/memory/{numMegaBytes}/duration/{durationSec}", (long numMegaBytes, int durationSec) =