elastic 集群
在本文中,我们将考虑在EKS集群中自动缩放的两种最常见方法:
水平荚自动缩放器(HPA)集群自动缩放器(CA)
Horizontal Pod Autoscaler或HPA是Kubernetes组件,可根据通过Kubernetes指标服务器定义的CPU利用率等指标自动扩展服务。 HPA可在部署或副本集中缩放Pod,并被实现为Kubernetes API资源和控制器。 Controller Manager根据每个水平容器自动缩放器定义中指定的指标查询资源利用率。 它从资源指标API中的每个pod指标或自定义指标API中的任何其他指标中获取指标。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2FkaGFDumlYXRgWiJ4IylKb6uaYLs1-tpg3u9e.webp?alt=media&token=ee48067f-12ec-400c-b7ab-e6591a3fcaf9)
为了了解这一点,我们将配置HPA,然后对系统施加一些负载以使其运行。
首先,让我们开始安装Helm作为Kubernetes的软件包管理器。
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > helm.sh
chmod +x helm.sh
./helm.sh
现在,我们将建立称为Tiller的Helm的服务器基础部分。 这需要一个服务帐户:
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
上面定义了一个我们分配了集群管理员角色的Tiller服务帐户。 现在,让我们继续进行配置:
kubectl apply -f tiller.yml
使用我们刚刚创建的Tiller服务帐户运行helm init
:
helm init --service-account tiller
这样,我们就将Tiller安装到了集群上,从而可以管理集群中的那些资源。
安装了Helm后,我们现在可以部署度量服务器。 指标服务器是资源使用情况数据的群集范围内的聚合器,其中指标由kubelet
在每个工作节点上收集,并用于指示部署的扩展行为。
因此,让我们继续并立即安装它:
helm install stable/metrics-server --name metrics-server --version 2.0.4 --namespace metrics
一旦所有检查都通过,我们就可以扩展应用程序了。
出于本文的目的,我们将部署一种特殊的Apache和PHP版本,旨在产生CPU利用率:
kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80
** requests = cpu = 200m-请求将200毫厘分配给pod
现在,让我们自动调整部署范围:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
上面指定HPA将增加或减少副本数,以将所有Pod的平均CPU利用率维持50%。 由于每个Pod要求200毫微升(如先前命令中所指定),因此可以维持100毫微升的平均CPU使用率。
让我们检查一下状态:
kubectl get hpa
查看Targets
列,如果它表示unknown/50%
则表明当前CPU消耗为0%,因为我们当前未向服务器发送任何请求。 这将需要几分钟的时间才能显示正确的值,因此让我们拿起一杯咖啡,然后在这里获得一些数据后再回来。
重新运行最后一个命令,并确认Targets
列现在为0%/50%
。 现在,让我们运行以下命令来生成一些负载以触发缩放:
kubectl run -i --tty load-generator --image=busybox /bin/sh
在此容器内,我们将向我们的服务发送无限数量的请求。 如果我们回到另一个终端,我们可以观察自动缩放器的运行情况:
kubectl get hpa -w
我们可以看到HPA缩放器容器从1增大到我们配置的最大值10,直到平均CPU利用率低于我们的目标50%。 运行大约需要10分钟,您可以看到我们现在有10个副本。 如果我们回到另一个终端以终止负载测试,然后回到缩放器终端,我们可以看到HPA将副本数减少到最小。
集群自动缩放器
集群自动缩放器是默认的Kubernetes组件,可以缩放集群中的Pod或节点。 它会自动增加自动缩放组的大小,以便吊舱可以继续成功放置。 它还尝试从自动扩展组(未运行Pod的节点)中删除未使用的工作程序节点。
![](https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2FkaGFDumlYXRgWiJ4IylKb6uaYLs1-6y403u85.webp?alt=media&token=507ffc07-8bbc-4536-a6e0-9bdcf5b67905)
以下AWS CLI命令将创建一个自动伸缩组,其最小数量为1,最大数量为10:
eksctl create nodegroup --cluster <CLUSTER_NAME> --node-zones <REGION_CODE> --name <REGION_CODE> --asg-access --nodes-min 1 --nodes 5 --nodes-max 10 --managed
现在,我们需要向工作节点应用内联IAM策略:
{"Version" : "2012-10-17" ,
"Statement" : [
{
"Action" : [
"autoscaling:DescribeAutoScalingGroups" ,
"autoscaling:DescribeAutoScalingInstances" ,
"autoscaling:DescribeLaunchConfigurations" ,
"autoscaling:DescribeTags" ,
"autoscaling:SetDesiredCapacity" ,
"autoscaling:TerminateInstanceInAutoScalingGroup" ,
"ec2:DescribeLaunchTemplateVersions"
],
"Resource" : "*" ,
"Effect" : "Allow"
}
]
}
基本上,这使发布群集自动缩放器的EC2工作节点可以操纵自动缩放功能。 复制它并添加到您的EC2 IAM角色。
接下来,下载以下文件:
wget https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
并使用您的集群名称更新以下行:
- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/<YOUR CLUSTER NAME>
最后,我们可以部署Autoscaler:
kubectl apply -f cluster-autoscaler-autodiscover.yaml
当然,我们应该等待豆荚完成创建。 完成后,我们可以扩展集群。 我们将考虑一个带有以下yaml
文件的简单nginx
应用程序:
apiVersion: extensions/v1beta2
kind: Deployment
metadata:
name: nginx-scale
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 500m
memory: 512Mi
让我们继续部署应用程序:
kubectl apply -f nginx.yaml
并检查部署:
kubectl get deployment/nginx-scale
现在,让我们将副本最多扩展到10个:
kubectl scale --replicas=10 deployment/nginx-scale
我们可以看到一些吊舱处于挂起状态,这是集群自动伸缩器用来扩展EC2实例群的触发器。
kubectl get pods -o wide --watch
结论
在本文中,我们考虑了两种类型的EKS群集自动缩放。 我们了解了集群自动缩放器每当检测到未充分利用的实例或挂起的Pod时如何启动横向扩展和横向扩展操作。 在扩展微服务应用程序时,卧式Pod自动缩放器和集群自动缩放器是Kubernetes的基本功能。 希望您发现本文有用,但还有更多内容。 到那时,快乐缩放!
关于作者-Sudip是一位具有15年以上工作经验的解决方案架构师,并且是Javelynn的创始人。 他喜欢通过写作分享自己的知识,当他不这样做时,他一定是在钓鱼或下棋。
先前发布在 https://appfleet.com/上 。
翻译自: https://hackernoon.com/how-to-autoscale-an-amazon-elastic-kubernetes-service-cluster-5wv3ybs
elastic 集群