乐趣区

关于kubernetes:应对突发流量如何快速为自建-K8s-添加云上弹性能力

以 Kubernetes 为代表的容器技术带来的是一种利用交付模式的改革,其正迅速成为全世界数据中心的对立 API。

为了保障业务继续稳固、用户拜访不中断,高可用、高弹性等能力是利用架构设计不变的谋求,多集群架构人造具备这样的能力。而只有在 Kubernetes 这层对立且规范的 API 之下,多集群和混合云的能力才开始真正体现价值。

在前一篇文章《选对办法,K8s 多集群治理没那么难》中,咱们着重介绍了阿里云分布式云容器平台 ACK One 注册集群的利用场景、架构实现、平安加固,以及在他云 K8s 集群和 IDC 自建 K8s 集群中应用阿里云容器服务 ACK 的弱小可观测性能力,实现云上云下 K8s 集群的对立运维治理。

本文中,咱们重点介绍 ACK One 注册集群的另一个重要应用场景 – 云上弹性。

云上弹性能力典型利用场景和劣势

ACK One 注册集群的云上弹性能力针对的场景:

  1. 业务快速增长:在本地 IDC 中部署的 K8s 集群,往往受到 IDC 计算资源的限度无奈及时扩容,计算资源的洽购部署上线往往周期较长,无奈承当业务流量的快速增长。
  2. 业务周期性增长或突发增长:本地 IDC 中的计算资源数量绝对固定,无奈应答业务周期性顶峰,或者突发业务流量的增长。

解决以上场景的基本是计算资源弹性能力,能够追随业务流量的变动,弹性扩充或者放大计算资源,满足业务需要的同时也保障了老本的均衡。

ACK One 注册集群云上弹性架构如下图所示:

通过 ACK One 注册集群,本地 IDC 中的 K8s 集群能够弹性扩容阿里云 ECS 节点池,利用阿里云容器服务的极致弹性能力,扩容应答业务流量增长,缩容实现老本节约。尤其针对 AI 场景,通过 ACK One 注册集群,能够将云上 GPU 机器接入 IDC 中的 K8s 集群。

为本地 IDC K8s 集群增加阿里云 GPU 算力的最佳实际

1. 创立 ACK One 注册集群

拜访 ACK One 控制台注册集群用页面,咱们曾经创立了注册集群“ACKOneRegisterCluster1”并接入了本地 IDC 中的 K8s 集群。参见:《选对办法,K8s 多集群治理没那么难》

ACK One 控制台注册集群用页面:
https://account.aliyun.com/login/login.htm?oauth_callback=htt…

接入后,能够通过 ACK One 控制台查看本地 IDC K8s 集群,目前只有一个 master 节点。

2. 创立 GPU 节点池并手动扩容创立 1 个 GPU 节点

在注册集群中创立节点池 GPU-P100,将云上 GPU 机器退出 IDC 中 K8s 集群。

在 IDC K8s 集群中执行 kubectl 查看节点信息。

kubectl get node
NAME                           STATUS   ROLES    AGE     VERSION
cn-zhangjiakou.172.16.217.xx   Ready    <none>   5m35s   v1.20.9    // 云上 GPU 机器
iz8vb1xtnuu0ne6b58hvx0z        Ready    master   20h     v1.20.9    // IDC 机器

k describe node cn-zhangjiakou.172.16.217.xx
Name:               cn-zhangjiakou.172.16.217.xx
Roles:              <none>
Labels:             aliyun.accelerator/nvidia_count=1             //nvidia labels
                    aliyun.accelerator/nvidia_mem=16280MiB        //nvidia labels 
                    aliyun.accelerator/nvidia_name=Tesla-P100-PCIE-16GB  //nvidia labels
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=cn-zhangjiakou.172.16.217.xx
                    kubernetes.io/os=linux
Capacity:
  cpu:                4
  ephemeral-storage:  123722704Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             30568556Ki
  nvidia.com/gpu:     1              //nvidia gpu
  pods:               110
Allocatable:
  cpu:                4
  ephemeral-storage:  114022843818
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             30466156Ki
  nvidia.com/gpu:     1              //nvidia gpu
  pods:               110
System Info:
  OS Image:                   Alibaba Cloud Linux (Aliyun Linux) 2.1903 LTS (Hunting Beagle)
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  docker://19.3.13
  Kubelet Version:            v1.20.9
  Kube-Proxy Version:         v1.20.9
......

3. 运行 GPU 工作测试

在 IDC 中 K8s 集群中提交 GPU 测试工作,运行后果胜利。

> cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
 name: gpu-pod
spec:
  restartPolicy: Never
  containers:
    - name: cuda-container
      image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/cuda10.2-vectoradd
      resources:
        limits:
          nvidia.com/gpu: 1 # requesting 1 GPU
EOF

> kubectl logs gpu-pod
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

多级弹性调度策略,自定义弹性资源优先级

自定义弹性资源优先级调度是阿里云提供的弹性调度策略。您能够在利用公布或扩容过程中,自定义资源策略(ResourcePolicy),设置利用实例 Pod 被调度到不同类型节点资源的程序。同时在缩容过程中依照原调度程序逆序缩容。

通过下面的演示,咱们能够通过 ACK One 注册集群,应用云上 ECS 资源创立节点池,并增加到 IDC 集群中。您能够为节点池或者节点打标(label),并通过设置 Pod 的节点亲 “affinity” 或者“nodeSelector” 的形式,为 Pod 抉择是在 IDC 本地节点中运行,还是在云上 ECS 节点用运行。这种形式须要批改利用 pod 的配置,如果生产零碎有较多的利用须要解决,则须要编写调度规定,适宜自定义调度的场景,例如:特定 CUDA 版本的 GPU 训练任务调度到云上特定的 GPU ECS 实例上。

为了简化 IDC 中 K8s 集群应用云上 ECS 资源,ACK One 注册集群提供多级弹性调度性能,通过装置 ack-co-scheduler 组件,您能够定义 ResourcePolicy CR 对象,应用多级弹性调度性能。

ResourcePolicy CR 是命名空间资源,重要参数解析:

  • selector:申明 ResourcePolicy 作用于同一命名空间下 label 上打了 key1=value1 的 Pod。
  • strategy:调度策略抉择,目前只反对 prefer。
  • units:用户自定义的调度单元。利用扩容时,将依照 units 下资源的程序抉择资源运行;利用缩容时,将依照逆序进行缩容。
  • resource:弹性资源的类型,目前反对 idc、ecs 和 eci 三种类型。
  • nodeSelector:用 node 的 label 标识该调度单元下的节点,只对 ecs 资源失效。
  • max:在该组资源最多部署多少个实例。

ResourcePolicy 反对以下场景:

场景 1:优先应用 IDC 中集群资源,再应用云上 ECS 资源

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
 name: cost-balance-policy
spec:
  selector:
    app: nginx           // 抉择利用 Pod
  strategy: prefer
  units:
  - resource: idc        // 优先应用 idc 指定应用 IDC 中节点资源
  - resource: ecs        // 当 idc 节点资源有余时,应用云上 ECS,能够通过 nodeSelector 抉择节点
    nodeSelector:
      alibabacloud.com/nodepool-id=np7b30xxx

场景 2:混合应用 IDC 资源和云上 ECS 资源

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
 name: load-balance-policy
spec:
  selector:
    app: nginx
  strategy: prefer
  units:
  - resource: idc
    max: 2             // 在 idc 节点中最多启动 2 个利用实例
  - resource: ecs
    nodeSelector:
      alibabacloud.com/nodepool-id=np7b30xxx
    max: 4             // 在 ecs 节点池中最多启动 4 个利用实例 

总结

演示中,咱们将阿里云 GPU P100 机器增加到 IDC 中的 K8s 集群,扩大了 IDC 的 GPU 算力。

通过 ACK One 注册集群:

  1. 您能够抉择阿里云上的各种 ECS 实例类型和规格,包含:X86,ARM,GPU 等。
  2. 您能够手动扩容和缩容 ECS 实例数量。
  3. 您能够配置 ECS 实例数量的主动弹性伸缩。
  4. 您能够应用多级弹性调度,优先应用 IDC 中资源,IDC 资源有余的状况下,主动扩容云上 ECS 节点池解决突发业务流量。

参考文档:

[1] 注册集群概述

https://help.aliyun.com/document_detail/155208.html

[2] 创立 ECS 节点池

https://help.aliyun.com/document_detail/208054.html

[3] 配置 ECS 节点主动弹性伸缩

https://help.aliyun.com/document_detail/208055.html

[4] 多级弹性调度

https://help.aliyun.com/document_detail/446694.html

作者:庄宇

点击立刻收费试用云产品 开启云上实际之旅!

原文链接

本文为阿里云原创内容,未经容许不得转载。

退出移动版