文档

基于容器服务的自定义应用调度策略

更新时间:
一键部署

前提条件

此次示例基于阿里云专有云3.14及以上版本,最佳实践涉及阿里云容器服务ACK产品。

背景信息

容器服务(Container Service)是一种高性能可伸缩的容器管理服务,支持企业级Kubernetes容器化应用的生命周期管理。

容器服务简化集群的搭建和扩容等运维工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的Kubernetes容器化应用运行环境。容器服务是Kubernetes认证服务供应商,全球首批通过Kubernetes一致性认证的平台服务,为您提供专业的支持和服务。

产品架构

阿里云容器服务完全兼容Kubernetes yaml编排语法,兼容Kubernetes集群管理,并在此基础上做了大量的扩展和针对阿里云的深度优化;支持通过图形化界面和Open API管理集群和容器应用。

在底层架构上,您拥有并独占云服务器或物理机,保证底层环境安全可控,支持定制安全组和专有网络 VPC安全规则。

为了使您的应用低成本上云,容器服务实现了兼容标准Docker API的程序接口,兼容所有的Docker镜像,提供Kubernetes yaml编排示例模板,支持应用无缝迁云,同时也为第三方提供了灵活可定制的扩展机制。

容器服务的系统架构如下所示。1

容器服务基于原生Kubernetes进行适配和增强,简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。

容器服务的能力栈如下图所示。容器服务构建在云基础设施之上,和阿里云能力深度整合并支持第三方扩展,可以支持不同的应用类型。2

基于自定义应用的调度策略

大小合理的基于微服务的系统由数十个甚至数百个隔离的进程组成。容器和Pod为打包和部署提供了很好的抽象,但是不能解决将这些进程放置在合适的节点上的问题。 随着大量且不断增长的微服务,将它们单独分配和放置到节点上将要变成一件很困难的事。

容器的调度策略受容器之间的依赖性,对节点的依赖性以及资源需求的影响,并且所有这些都随时间而变化。K8S集群上可用资源也会随着时间的推移而变化,有可能是集群规模的缩小或扩容,或者由已调度的容器消耗资源变化而导致。我们放置容器的方式也会影响分布式系统的可用性,性能和容量。所有这些使调度容器到节点像是在射击一个移动的目标。

正确的使用调度策略可以提升可用性、性能、资源利用率等。3

策略一:资源需求、运行依赖

  1. 进入对应的集群详情页面,在无状态Deployment页面,单击使用镜像创建4

  2. 在创建基本信息页面,添加应用名称、副本数量、类型和标签,单击下一步5

    1. 在容器配置中,完成资源限制及所需资源的配置;

      • 资源限制:可指定该应用所能使用的资源上限,包括CPU和内存两种资源,防止占用过多资源。其中,CPU资源的单位为Core;内存的单位为MiB。

      • 所需资源:即为该应用预留资源额度,包括CPU和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争抢资源,导致应用不可用。6

    2. 完成端口及环境变量的配置;

      • 环境变量:支持通过键值对的形式为Pod配置环境变量。用于给Pod添加环境标志或传递配置等;

      • 端口设置:设置容器的端口。名称:设置容器端口名称。容器端口:设置暴露的容器访问端口或端口名,端口号必须介于1~65535。协议:支持TCP和UDP。7

    3. 完成数据卷及日志配置;

      • 数据卷:支持增加本地存储和云存储声明(PVC)。

        • 增加本地存储:支持主机目录(hostpath)、配置项(configmap)、保密字典(secret)和临时目录,将对应的挂载源挂载到容器路径中。

        • 增加云存储声明(PVC):支持云存储。

      • 日志配置:配置日志服务,可进行采集配置和自定义Tag设置。8

策略二:节点亲和性

  1. 在创建Deployments过程中,选择高级配置模块。

  2. 单击节点亲和性>添加,配置需亲和的节点标签;完成配置后,应用会默认创建在对应的节点上;

    设置节点亲和性,通过Worker节点的Label标签进行设置。

    节点调度支持硬约束和软约束(Required/Preferred),以及丰富的匹配表达式(In, NotIn,Exists, DoesNotExist. Gt, and Lt):

    • 必须满足,即硬约束,一定要满足,对应requiredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充),效果与 NodeSelector 相同。本例中Pod只能调度到具有对应标签的Worker节点。可以定义多条硬约束规则,但只需满足其中一条。

    • 尽量满足,即软约束,不一定满足,对应preferredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充)。本调度会尽量不调度Pod到具有对应标签的Node节点。还可为软约束规则设定权重,具体调度时,若存在多个符合条件的节点,权重最大的节点会被优先调度。您可定义多条软约束规则,但必须满足全部约束,才会进行调度。910

策略三:应用亲和性

  1. 在创建Deployments过程中,选择高级配置模块。

  2. 单击应用亲和性>添加,配置需亲和的应用标签(标签在Deployments页面标签模块);完成配置后,应用会默认创建在亲和的应用使用的节点上;

    应用亲和性,决定应用的Pod可以和哪些Pod部署在同一拓扑域。例如,对于相互通信的服务,可通过应用亲和性调度,将其部署到同一拓扑域(如同一个主机)中,减少它们之间的网络延迟。

    根据节点上运行的Pod的标签(Label)来进行调度,支持硬约束和软约束,匹配的表达式有 :In, NotIn, Exists, DoesNotExist 。

    • 必须满足,即硬约束,一定要满足,对应requiredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充),Pod的亲和性调度必须要满足后续定义的约束条件。

      • 命名空间:该策略是依据Pod的Label进行调度,所以会受到命名空间的约束。

      • 拓扑域:即topologyKey,指定调度时作用域,这是通过Node节点的标签来实现的,例如指定为,那就是以Node节点为区分范围;如果指定为,则以Node节点的操作系统类型来区分。

      • 选择器:单击选择器右侧的加号按钮,您可添加多条硬约束规则。

      • 查看应用列表:单击应用列表,弹出对话框,可在此查看各命名空间下的应用,并可将应用的标签导入到亲和性配置页面。

    • 硬约束条件:设置已有应用的标签、操作符和标签值。本例中,表示将待创建的应用调度到该主机上,该主机运行的已有应用具有app:nginx 标签。

    • 尽量满足,即软约束,不一定满足,对应preferredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充)。Pod的亲和性调度会尽量满足后续定义的约束条件。对于软约束规则,可配置每条规则的权重,其他配置规则与硬约束规则相同。111213

策略四:应用非亲和

  1. 在创建Deployments过程中,选择高级配置模块。

  2. 单击应用非亲和>添加,配置需非亲和的应用标签;

    应用非亲和决定应用的Pod不与哪些Pod部署在同一拓扑域。应用非亲和性调度的场景包括:

    • 将一个服务的Pod分散部署到不同的拓扑域(如不同主机)中,提高服务本身的稳定性。

    • 给予Pod一个节点的独占访问权限来保证资源隔离,保证不会有其它Pod来分享节点资源。

    • 把可能会相互影响的服务的Pod分散在不同的主机上。1415

策略五:调度容忍

  1. 在创建Deployments过程中,选择高级配置模块。

  2. 单击调度容忍>添加,配置需调度容忍标签;

    调度容忍是容忍被应用于Pod,允许这个Pod被调度到相对应的污点上。1617

基于以上的配置,即可完成自定义应用的调度策略。

说明

Node AffinityAffinity 翻译成中文是:亲和性,它对应的是 Anti-Affinity,我们翻译成:互斥。这两个词比较形象,可以把 pod 选择 node 的过程类比成磁铁的吸引和互斥,不同的是除了简单的正负极之外,pod 和 node 的吸引和互斥是可以灵活配置的。Affinity的优点:匹配有更多的逻辑组合,不只是字符串的完全相等调度分成软策略(soft)和硬策略(hard),在软策略下,如果没有满足调度条件的节点,pod会忽略这条规则,继续完成调度。目前主要的node affinity:requiredDuringSchedulingIgnoredDuringExecution表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中IgnoreDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行。requiredDuringSchedulingRequiredDuringExecution表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。其中RequiredDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,则重新选择符合要求的节点。preferredDuringSchedulingIgnoredDuringExecution表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。preferredDuringSchedulingRequiredDuringExecution表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。其中RequiredDuringExecution表示如果后面节点标签发生了变化,满足了条件,则重新调度到满足条件的节点。

  • 本页导读
文档反馈