如何使用Kubernetes Cluster Autoscaler对EKS实例组进行自动升级

478 阅读6分钟

各位读者大家好!在这篇文章中,我们将学习如何使用Kubernetes Cluster Autoscaler对EKS实例组进行自动升级。我们将同时使用管理和非管理的EKS节点组。

亚马逊Elastic Kubernetes服务(Amazon EKS)

它是一个简单的命令行工具,用于在亚马逊EKS上生成和维护Kubernetes集群。在本教程结束时,你将拥有一个可以工作的亚马逊EKS集群,你可以部署应用程序。

亚马逊EKS集群

一个 Amazon 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集群和版本。

EKS clusterEKS cluster

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

Auto Scaler and EKSAuto Scaler and EKS

例如,如果我们点击它并一路向下滚动。在你使用自动缩放器之前,有两个标签必须出现。

所以,第二个要求是创建开放ID连接,要做到这一点,让我们回到EKS集群。我们需要复制open id connect的网址。我们将进入配置选项卡,这就是open id connect提供商的网址。让我们复制这个,然后导航到IAM,进入身份提供者。

EKS ClusterEKS Cluster

单击 "添加提供商"。

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

IAMIAM

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

Auto Scaler and EKSAuto Scaler and EKS

现在,让我们创建我们将用于自动缩放器的政策。让我们到政策中去,点击创建政策json。然后粘贴政策,你可以找到以下链接:github.com/antonputra/…

因此,这是允许我们的自动缩放器调整节点数量的策略。让我们点击下一步,然后再下一步,让我们给它命名为EKSClusterAutoscalerPolicy并点击创建策略。

Policies in eksPolicies in eks

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

AutoscalingAutoscaling

edit trust policyedit trust policy

现在让我们部署自动缩放器,让我们创建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"

现在我们将部署它,现在它将创建所有资源。

auto scaler logsauto scaler logs

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

auto scaling outputsauto scaling outputs

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

 watch kubectl get pods 

eks auto scalereks auto scaler

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

watch kubectl get nodes

auto scalerauto scaler

现在我们有两个实例出现,一个用于管理组,第二个用于非管理组。

所以Autoscaler能够为每个实例组设置适当的期望状态和期望容量,你可以看到这里的最小和最大=10,期望容量=1。因此,自动缩放器不能只增加实例的数量,也可以减少实例的数量。

最后,如果你想删除你的集群,可以使用下面这个命令

eksctl delete cluster -f eks.yaml 

Auto Scaler and EKSAuto Scaler and EKS

总结

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