扩缩用户集群

如需在 GKE on AWS 上扩缩工作负载,您可以将 AWSNodePool 配置为自动横向扩容,或手动创建或删除 AWSNodePool 以纵向扩容或纵向缩容。

集群自动调节程序

GKE on AWS 会实现 Kubernetes 集群自动扩缩器。当系统对节点的需求较高时,集群自动扩缩器会向节点池添加节点。当需求较低时,集群自动扩缩器会将节点池缩减到您指定的最小大小。这样可以在您需要时提高工作负载的可用性,同时控制费用。

概览

集群自动扩缩器会根据工作负载的需求自动调整给定节点池中的节点数量。您不需要手动添加或移除节点,也不需要过度预配节点池。相反,您需要为节点池指定最小和最大大小,然后集群会自动进行扩缩。

在系统自动扩缩集群时,如果删除或移动资源,则工作负载可能会暂时中断。例如,如果工作负载包含单个副本,则在删除该副本的 Pod 的当前节点时,系统可能会将此副本 Pod 重新调度到其他节点上。在 AWSNodePool 中启用集群自动扩缩器之前,请设计好工作负载以容忍潜在的中断或确保关键的 Pod 不会中断。

集群自动扩缩器的工作原理

集群自动扩缩器以每个节点池为单位进行扩缩。创建节点池时,您可以在 AWSNodePool Kubernetes 资源中指定节点池的最小大小和最大大小。

您可以停用集群自动扩缩器,只需在 AWSNodePool 上将 spec.minNodeCount 设置为等于 spec.maxNodeCount 即可。

根据在该节点池的节点上运行的 Pod 的资源请求(而不是实际资源利用率),集群自动扩缩器会自动增大或减小节点池的大小。它会定期检查 Pod 和节点的状态,并执行相应的操作:

如果由于节点池中的节点不足而无法调度 Pod,则集群自动扩缩器会添加节点(最多添加到节点池的最大大小)。如果节点利用率过低,并且在节点池中的节点减少的条件下系统仍可以调度所有 Pod,则集群自动扩缩器会移除节点(最多移除到节点池的最小大小)。如果该节点无法在超时期限(10 分钟)后正常排空,则会被强制终止。不可配置宽限期。

如果您的 Pod 请求的资源太少(例如,如果默认数量不足),则集群自动扩缩器不会纠正这种情况。您可以通过为所有工作负载创建足够的资源请求,帮助确保集群自动扩缩器尽可能准确地工作。

操作条件

集群自动扩缩器在调整节点池的大小时会做出以下假设:

  • 所有复制的 Pod 都可以在其他节点上重启,可能会导致短暂的中断。如果您的服务无法容忍中断,则我们不建议使用集群自动扩缩器。

  • 单个节点池中的所有节点都具有一组相同的标签。

  • 如果您的 AWSNodePool 具有不同的实例类型,则集群自动扩缩器会考虑启动新节点的相对费用,并尝试扩展最便宜的节点池。

  • 未跟踪初始集群或节点池创建后手动添加的标签。集群自动扩缩器创建的节点在创建节点池时分配有使用 --node-labels 指定的标签。

调整节点池的大小

AWSNodePool 包含 minNodeCountmaxNodeCount 字段。这些字段用于声明池中工作器节点的最小数量和最大数量。您可以在创建 AWSNodePool 之前或之后修改这些值。

准备工作

按照创建用户集群中的说明预配集群。提供用于创建集群的 YAML 文件(例如 cluster-0.yaml)。

启用节点池自动扩缩功能

  1. anthos-aws 目录中,使用 anthos-gke 将上下文切换到管理服务。

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 要启用集群自动扩缩器,请修改 AWSNodePool 的清单。修改 cluster-0.yaml 文件并找到 AWSNodePool 部分。更改 spec.minNodeCountspec.maxNodeCount 的值。

    以下示例将此节点池的最小大小保持为 3 个节点,但允许集群自动扩缩器将其大小增加到 10 个节点。

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: cluster-0-pool-0
    spec:
      clusterName: cluster-0
      version: 1.25.5-gke.2100
      minNodeCount: 3
      maxNodeCount: 10
      ...
    
  3. 接下来,应用 YAML 以调整节点池的大小。

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl apply -f cluster-0.yaml
    
  4. AWSNodePool 资源将转换为 Resizing 状态。AWSNodePool 完成扩缩后,会转换为 Provisioned 状态。

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl get AWSNodePools
    

    输出显示 AWSNodePool 的状态为 Resizing。调整大小的操作需要几分钟时间才能完成。

    NAME               CLUSTER     STATE     AGE   VERSION
    cluster-0-pool-0   cluster-0   Resizing  3h    1.25.5-gke.2100
    

手动创建新的 AWSNodePool

您还可以通过创建新的 AWSNodePool 来扩缩集群。在创建新的 AWSNodePool 时,您还可以扩大或缩减实例大小

  1. 您可以使用 kubectl get 检索现有 AWSNodePool 的配置清单。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
    
  2. 修改 new_nodepool.yaml 并移除以下示例中不存在的部分。保存文件。

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.25.5-gke.2100
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional 
    
  3. 如需创建新的 AWSNodePool,请将清单应用到管理集群。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f new_nodepool.yaml
    

后续步骤

部署由 Ingress 支持的服务。

如需查看其他选项,请参阅有关 AWSNodePool 的参考文档。