基于容器服务的自定义应用调度策略
前提条件
此次示例基于阿里云专有云3.14及以上版本,最佳实践涉及阿里云容器服务ACK产品。
背景信息
容器服务(Container Service)是一种高性能可伸缩的容器管理服务,支持企业级Kubernetes容器化应用的生命周期管理。
容器服务简化集群的搭建和扩容等运维工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的Kubernetes容器化应用运行环境。容器服务是Kubernetes认证服务供应商,全球首批通过Kubernetes一致性认证的平台服务,为您提供专业的支持和服务。
产品架构
阿里云容器服务完全兼容Kubernetes yaml编排语法,兼容Kubernetes集群管理,并在此基础上做了大量的扩展和针对阿里云的深度优化;支持通过图形化界面和Open API管理集群和容器应用。
在底层架构上,您拥有并独占云服务器或物理机,保证底层环境安全可控,支持定制安全组和专有网络 VPC安全规则。
为了使您的应用低成本上云,容器服务实现了兼容标准Docker API的程序接口,兼容所有的Docker镜像,提供Kubernetes yaml编排示例模板,支持应用无缝迁云,同时也为第三方提供了灵活可定制的扩展机制。
容器服务的系统架构如下所示。
容器服务基于原生Kubernetes进行适配和增强,简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。
容器服务的能力栈如下图所示。容器服务构建在云基础设施之上,和阿里云能力深度整合并支持第三方扩展,可以支持不同的应用类型。
基于自定义应用的调度策略
大小合理的基于微服务的系统由数十个甚至数百个隔离的进程组成。容器和Pod为打包和部署提供了很好的抽象,但是不能解决将这些进程放置在合适的节点上的问题。 随着大量且不断增长的微服务,将它们单独分配和放置到节点上将要变成一件很困难的事。
容器的调度策略受容器之间的依赖性,对节点的依赖性以及资源需求的影响,并且所有这些都随时间而变化。K8S集群上可用资源也会随着时间的推移而变化,有可能是集群规模的缩小或扩容,或者由已调度的容器消耗资源变化而导致。我们放置容器的方式也会影响分布式系统的可用性,性能和容量。所有这些使调度容器到节点像是在射击一个移动的目标。
正确的使用调度策略可以提升可用性、性能、资源利用率等。
策略一:资源需求、运行依赖
进入对应的集群详情页面,在无状态Deployment页面,单击使用镜像创建;
在创建基本信息页面,添加应用名称、副本数量、类型和标签,单击下一步;
在容器配置中,完成资源限制及所需资源的配置;
资源限制:可指定该应用所能使用的资源上限,包括CPU和内存两种资源,防止占用过多资源。其中,CPU资源的单位为Core;内存的单位为MiB。
所需资源:即为该应用预留资源额度,包括CPU和内存两种资源,即容器独占该资源,防止因资源不足而被其他服务或进程争抢资源,导致应用不可用。
完成端口及环境变量的配置;
环境变量:支持通过键值对的形式为Pod配置环境变量。用于给Pod添加环境标志或传递配置等;
端口设置:设置容器的端口。名称:设置容器端口名称。容器端口:设置暴露的容器访问端口或端口名,端口号必须介于1~65535。协议:支持TCP和UDP。
完成数据卷及日志配置;
数据卷:支持增加本地存储和云存储声明(PVC)。
增加本地存储:支持主机目录(hostpath)、配置项(configmap)、保密字典(secret)和临时目录,将对应的挂载源挂载到容器路径中。
增加云存储声明(PVC):支持云存储。
日志配置:配置日志服务,可进行采集配置和自定义Tag设置。
策略二:节点亲和性
在创建Deployments过程中,选择高级配置模块。
单击节点亲和性>添加,配置需亲和的节点标签;完成配置后,应用会默认创建在对应的节点上;
设置节点亲和性,通过Worker节点的Label标签进行设置。
节点调度支持硬约束和软约束(Required/Preferred),以及丰富的匹配表达式(In, NotIn,Exists, DoesNotExist. Gt, and Lt):
必须满足,即硬约束,一定要满足,对应requiredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充),效果与 NodeSelector 相同。本例中Pod只能调度到具有对应标签的Worker节点。可以定义多条硬约束规则,但只需满足其中一条。
尽量满足,即软约束,不一定满足,对应preferredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充)。本调度会尽量不调度Pod到具有对应标签的Node节点。还可为软约束规则设定权重,具体调度时,若存在多个符合条件的节点,权重最大的节点会被优先调度。您可定义多条软约束规则,但必须满足全部约束,才会进行调度。
策略三:应用亲和性
在创建Deployments过程中,选择高级配置模块。
单击应用亲和性>添加,配置需亲和的应用标签(标签在Deployments页面标签模块);完成配置后,应用会默认创建在亲和的应用使用的节点上;
应用亲和性,决定应用的Pod可以和哪些Pod部署在同一拓扑域。例如,对于相互通信的服务,可通过应用亲和性调度,将其部署到同一拓扑域(如同一个主机)中,减少它们之间的网络延迟。
根据节点上运行的Pod的标签(Label)来进行调度,支持硬约束和软约束,匹配的表达式有 :In, NotIn, Exists, DoesNotExist 。
必须满足,即硬约束,一定要满足,对应requiredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充),Pod的亲和性调度必须要满足后续定义的约束条件。
命名空间:该策略是依据Pod的Label进行调度,所以会受到命名空间的约束。
拓扑域:即topologyKey,指定调度时作用域,这是通过Node节点的标签来实现的,例如指定为,那就是以Node节点为区分范围;如果指定为,则以Node节点的操作系统类型来区分。
选择器:单击选择器右侧的加号按钮,您可添加多条硬约束规则。
查看应用列表:单击应用列表,弹出对话框,可在此查看各命名空间下的应用,并可将应用的标签导入到亲和性配置页面。
硬约束条件:设置已有应用的标签、操作符和标签值。本例中,表示将待创建的应用调度到该主机上,该主机运行的已有应用具有app:nginx 标签。
尽量满足,即软约束,不一定满足,对应preferredDuringSchedulingIgnoredDuringExecution(node 亲和性概念,见本文档结束补充)。Pod的亲和性调度会尽量满足后续定义的约束条件。对于软约束规则,可配置每条规则的权重,其他配置规则与硬约束规则相同。
策略四:应用非亲和
在创建Deployments过程中,选择高级配置模块。
单击应用非亲和>添加,配置需非亲和的应用标签;
应用非亲和决定应用的Pod不与哪些Pod部署在同一拓扑域。应用非亲和性调度的场景包括:
将一个服务的Pod分散部署到不同的拓扑域(如不同主机)中,提高服务本身的稳定性。
给予Pod一个节点的独占访问权限来保证资源隔离,保证不会有其它Pod来分享节点资源。
把可能会相互影响的服务的Pod分散在不同的主机上。
策略五:调度容忍
在创建Deployments过程中,选择高级配置模块。
单击调度容忍>添加,配置需调度容忍标签;
调度容忍是容忍被应用于Pod,允许这个Pod被调度到相对应的污点上。
基于以上的配置,即可完成自定义应用的调度策略。
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表示如果后面节点标签发生了变化,满足了条件,则重新调度到满足条件的节点。
- 本页导读