各位读者大家好!在这篇文章中,我们将学习如何使用Kubernetes Cluster Autoscaler对EKS实例组进行自动升级。我们将同时使用管理和非管理的EKS节点组。
亚马逊Elastic Kubernetes服务(Amazon EKS)
它是一个简单的命令行工具,用于在亚马逊EKS上生成和维护Kubernetes集群。在本教程结束时,你将拥有一个可以工作的亚马逊EKS集群,你可以部署应用程序。
亚马逊EKS集群
- 亚马逊EKS控制平面。
- 与控制平面注册的亚马逊EKS节点。
在开始之前,你必须为Amazon EKS集群安装和配置以下材料。
- kubectl- 一个用于处理Kubernetes集群的命令行工具。
- eksctl- 一个用于与EKS集群工作的命令行工具,可以自动完成许多单独的任务。
亚马逊EKS - 集群自动调节器
Kubernetes Cluster Autoscaler会自动提高集群中的节点数量。当pod断裂或被重新洗到其他节点上时。Cluster Autoscaler通常在你的集群中作为一个部署建立。
它使用领导者来保证高可用性,但扩展是由每次只有一个副本完成的。
前提条件
在部署Cluster Autoscaler之前,你必须满足以下先决条件。
- 有一个现有的亚马逊EKS集群 - 如果你没有一个集群。
- 一个现有的IAM OIDC提供商,用于你的集群。要断定你是否持有一个或需要创建一个。
- 具有自动缩放组标签的节点组 - 集群自动缩放器需要在你的自动缩放组上有以下标签,以便它们能够被自动发现。
让我们开始吧 !
首先,我们需要创建EKS集群,我将使用eksctl。但是你也可以使用terraform或者你可以使用aws控制台来创建集群。首先,我们将创建一个目录,之后将创建YAML文件。所以我将给它一个名字eks.yaml。
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-name
region: us-east-1
version: "1.20"
availabilityZones:
- us-east-1a
- us-east-1b
managedNodeGroups:
- name: managed-nodes
labels:
role: managed-nodes
instanceType: t3.medium
minSize: 1
maxSize: 10
desiredCapacity: 1
volumeSize: 20
nodeGroups:
- name: unmanaged-nodes
labels:
role: unmanaged-nodes
instanceType: t3.medium
minSize: 1
maxSize: 10
desiredCapacity: 1
volumeSize: 20
我们将使用管理节点组和非管理节点组,自动伸缩器可以在这两个节点组中工作。但AWS建议你使用管理节点组。它可以优雅地耗尽节点,并重新安排这些pods不同的节点。如果是未管理的节点组,它将简单地终止该节点。
让我们用这个命令创建集群,通常需要15-20分钟来创建集群。
eksctl create cluster -f eks.yaml
所以,集群已经准备好了,所以为了验证连接,我们可以使用这个命令。
kubectl get svc
所以,在你使用和部署自动缩放器之前,有一些如上所述的要求。例如,当你创建kubernetes集群和实例组时,它们会在AWS中创建自动缩放组。
让我们首先进入AWS管理控制台 ,点击EKS。选择集群,你可以看到这是我们的集群名称eks-name集群和版本。


我们将进入EC2控制面板 ,搜索自动扩展组,你会发现两个自动扩展组,第一个是管理节点,第二个是非管理节点。


例如,如果我们点击它并一路向下滚动。在你使用自动缩放器之前,有两个标签必须出现。
所以,第二个要求是创建开放ID连接,要做到这一点,让我们回到EKS集群。我们需要复制open id connect的网址。我们将进入配置选项卡,这就是open id connect提供商的网址。让我们复制这个,然后导航到IAM,进入身份提供者。


单击 "添加提供商"。
点击添加提供商,然后它将是开放的ID连接,让我们粘贴我们的网址并获得拇指印。


对于受众,让我们粘贴默认值sts.amazonaws.com,让我们创建这个提供者。


现在,让我们创建我们将用于自动缩放器的政策。让我们到政策中去,点击创建政策json。然后粘贴政策,你可以找到以下链接:github.com/antonputra/…
因此,这是允许我们的自动缩放器调整节点数量的策略。让我们点击下一步,然后再下一步,让我们给它命名为EKSClusterAutoscalerPolicy并点击创建策略。


第二项是创建角色。让我们进入角色,点击创建角色,它将是网络身份。让我们选择我们刚刚创建的提供商,打开ID连接提供商。现在观众只需选择默认的,点击下一个权限。让我们附上我们刚刚创建的策略--自动扩展器策略,点击下一步,下一步。给它一个名字EKSClusterAutoscalerPolicy,然后点击创建角色。




现在让我们部署自动缩放器,让我们创建K8s文件夹。我们将为自动缩放器创建第一个文件,名称为0-cluster-autoscaler.yaml。首先,我们要创建一个服务账户。我们将添加这个注释,并用这个角色的ARN替换。
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-addon: cluster-autoscaler.addons.k8s.io
k8s-app: cluster-autoscaler
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::940583193868:role/EKSClusterAutoScalerPolicy
name: cluster-autoscaler
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cluster-autoscaler
namespace: kube-system
labels:
app: cluster-autoscaler
spec:
replicas: 1
selector:
matchLabels:
app: cluster-autoscaler
template:
metadata:
labels:
app: cluster-autoscaler
annotations:
cluster-autoscaler.kubernetes.io/safe-to-evict: 'false'
spec:
serviceAccountName: cluster-autoscaler
containers:
- image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.20.0
name: cluster-autoscaler
resources:
limits:
cpu: 100m
memory: 300Mi
requests:
cpu: 100m
memory: 300Mi
# https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md
command:
- ./cluster-autoscaler
- --v=4
- --stderrthreshold=info
- --cloud-provider=aws
- --skip-nodes-with-local-storage=false
- --expander=least-waste
- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/eks-name
# Update cluster
- --balance-similar-node-groups
- --skip-nodes-with-system-pods=false
volumeMounts:
- name: ssl-certs
mountPath: /etc/ssl/certs/ca-certificates.crt #/etc/ssl/certs/ca-bundle.crt for Amazon Linux Worker Nodes
readOnly: true
imagePullPolicy: "Always"
volumes:
- name: ssl-certs
hostPath:
path: "/etc/ssl/certs/ca-bundle.crt"
现在我们将部署它,现在它将创建所有资源。


你可以使用这个命令来检查日志


你可以找到很多有用的日志,如果你想调试到有用的阅读所有的输出。而下一步是观察将只是重复这个命令,每两秒一次。
watch kubectl get pods


所以,现在我们有四个,以及预期的现在我们有两个pods处于运行状态。还有两个豆荚处于待定状态,因为我们没有足够的节点,然后是自动扩展器。你可以在自动扩展器的输出中找到所有这些信息。如果你想扩大你的集群,你可以这样做,但现在我不打算增加节点的数量。
watch kubectl get nodes


现在我们有两个实例出现,一个用于管理组,第二个用于非管理组。
所以Autoscaler能够为每个实例组设置适当的期望状态和期望容量,你可以看到这里的最小和最大=10,期望容量=1。因此,自动缩放器不能只增加实例的数量,也可以减少实例的数量。
最后,如果你想删除你的集群,可以使用下面这个命令
eksctl delete cluster -f eks.yaml


总结
在这篇文章中,我们通过几个简单的步骤看到了如何使用Kubernetes集群自动缩放器自动缩放EKS实例组。我们将同时使用管理的和非管理的EKS节点组。你也可以根据你的要求来改变配置。