K8S集群调度原理及调度策略[转]

本文深入探讨了Kubernetes(K8S)集群的调度原理,包括Scheduler的工作流程,从节点预选、节点优先级排序到节点选定。介绍了各种调度策略,如节点亲和性和反亲和性,以及硬亲和性和软亲和性的区别。同时,详细阐述了污点和容忍度的概念,以及它们在节点资源管理和Pod调度中的作用。此外,还讨论了Pod的优先级和抢占式调度机制,为优化集群资源分配提供了关键理解。
k8s调度器Scheduler

Scheduler工作原理

请求及Scheduler调度步骤:

  • 节点预选(Predicate):排除完全不满足条件的节点,如内存大小,端口等条件不满足。
  • 节点优先级排序(Priority):根据优先级选出最佳节点
  • 节点择优(Select):根据优先级选定节点
  1. 首先用户通过 Kubernetes 客户端 Kubectl 提交创建 Pod 的 Yaml 的文件,向Kubernetes 系统发起资源请求,该资源请求被提交到

  2. Kubernetes 系统中,用户通过命令行工具 Kubectl 向 Kubernetes 集群即 APIServer 用 的方式发送“POST”请求,即创建 Pod 的请求。

  3. APIServer 接收到请求后把创建 Pod 的信息存储到 Etcd 中,从集群运行那一刻起,资源调度系统 Scheduler 就会定时去监控 APIServer

  4. 通过 APIServer 得到创建 Pod 的信息,Scheduler 采用 watch 机制,一旦 Etcd 存储 Pod 信息成功便会立即通知APIServer,

  5. APIServer会立即把Pod创建的消息通知Scheduler,Scheduler发现 Pod 的属性中 Dest Node 为空时(Dest Node=””)便会立即触发调度流程进行调度。

  6. 而这一个创建Pod对象,在调度的过程当中有3个阶段:节点预选、节点优选、节点选定,从而筛选出最佳的节点

    • 节点预选:基于一系列的预选规则对每个节点进行检查,将那些不符合条件的节点过滤,从而完成节点的预选
    • 节点优选:对预选出的节点进行优先级排序,以便选出最合适运行Pod对象的节点
    • 节点选定:从优先级排序结果中挑选出优先级最高的节点运行Pod,当这类节点多于1个时,则进行随机选择

k8s的调用工作方式

Kubernetes调度器作为集群的大脑,在如何提高集群的资源利用率、保证集群中服务的稳定运行中也会变得越来越重要Kubernetes的资源分为两种属性。

  1. 可压缩资源(例如CPU循环,Disk I/O带宽)都是可以被限制和被回收的,对于一个Pod来说可以降低这些资源的使用量而不去杀掉Pod。
  2. 不可压缩资源(例如内存、硬盘空间)一般来说不杀掉Pod就没法回收。未来Kubernetes会加入更多资源,如网络带宽,存储IOPS的支持。

常用预选策略

预选策略 作用
CheckNodeCondition 检查是否可以在节点报告磁盘、网络不可用或未准备好时将Pod调度其上
HostName 如果Pod对象拥有spec.hostname属性,则检查节点名称字符串是否和该属性值匹配。
PodFitsHostPorts Pod的spec.hostPort属性时,检查端口是否被占用
MatchNodeSelector Pod的spec.nodeSelector属性时,检查节点标签
NoDiskConflict Pod依赖的存储卷在此节点是否可用,默认没有启用
PodFitsResources 检查节点上的资源(CPU、内存)可用性是否满足Pod对象的运行需求。
PodToleratesNodeTaints Pod的spec.tolerations属性,仅关注NoSchedule和NoExecute两个效用标识的污点
PodToleratesNodeNoExecuteTaints Pod的spec.tolerations属性,是否能接纳节点的NoExecute类型污点,默认没有启用
CheckNodeLabelPresence 仅检查节点上指定的所有标签的存在性,默认没有启用
CheckServiceAffinity 将相同Service的Pod对象放置在同一个或同一类节点上以提高效率,默认没有启用
MaxEBSVolumeCount 检查节点已挂载的EBS(亚马逊弹性块存储)存储卷数量是否超过设置的最大值,默认为39
MaxGCEPDVolumeCount 检查节点上已挂载的GCE PD(谷歌云存储) 存储卷数量是否超过最大值,默认为16
MaxAzureDiskVolumeCount 检查节点上已挂载的Azure Disk存储卷数量是否超过最大值,默认为16
CheckVolumeBinding 检查节点上已绑定和未绑定的PVC是否满足需求
NoVolumeZoneConflict 在给定区域zone限制下,检查此节点部署的Pod对象是否存在存储卷冲突
CheckNodeMemoryPressure 检查节点内存压力,如果压力过大,那就不会讲pod调度至此
CheckPodePIDPressure 检查节点PID资源压力
CheckNodeDiskPressure 检查节点磁盘资源压力
MatchInterPodAffinity 检查节点是否满足Pod对象亲和性或反亲和性条件

常用优先函数

函数名称 详细说明
LeastRequestedPriority 节点的优先级就由节点空闲资源与节点总容量的比值,即由(总容量-节点上Pod的容量总和-新Pod的容量)/总容量)来决定。 CPU和内存具有相同权重,资源空闲比越高的节点得分越高。 cpu((capacity – sum(requested)) * 10 / capacity) + memory((capacity – sum(requested)) * 10 / capacity) / 2
BalancedResourceAllocation CPU和内存使用率越接近的节点权重越高,该策略不能单独使用,必须和LeastRequestedPriority组合
<think>我们正在讨论的是DolphinScheduler(海豚调度)中如何配置Kubernetes(K8S集群。根据用户需求,需要提供添加K8S集群的配置方法或教程。由于引用中并没有直接关于K8S集群配置的详细步骤,但我们可以结合DolphinScheduler的一般配置逻辑和K8S集成的常见方法,给出指导性步骤。注意:DolphinScheduler从3.0版本开始支持Kubernetes,因此我们假设使用的是3.x版本。主要步骤:1.确保DolphinScheduler已安装并运行,且版本支持Kubernetes(3.x及以上)。2.准备Kubernetes集群,并获取访问配置(kubeconfig文件)。3.在DolphinScheduler的管理界面中配置K8S集群。详细步骤:步骤1:准备Kubernetes集群-确保有一个可用的Kubernetes集群,并记录其APIServer地址。-获取访问该集群的kubeconfig文件(通常位于`~/.kube/config`),或者创建一个具有适当权限的ServiceAccount。步骤2:在DolphinScheduler中配置K8S集群-登录DolphinScheduler的Web界面(通常为http://<master-server>:12345/dolphinscheduler)。-使用管理员账号登录。-进入“安全中心”->“集群管理”页面。-点击“创建集群”按钮。-选择集群类型为“Kubernetes”。-填写集群配置信息,包括:*集群名称:自定义,如“k8s-cluster”*k8s配置:将kubeconfig文件的内容粘贴到文本框中(或者使用上传方式,如果界面支持)*命名空间:指定在K8S中创建任务的命名空间(可选)*其他高级配置(如资源限制等)根据需求填写。-点击“测试连接”以验证配置是否正确。-验证通过后,点击“提交”保存。步骤3:在任务中使用K8S集群-创建或编辑工作流时,选择任务类型(例如Spark、Flink或Shell等)。-在任务配置中,选择“集群”为刚才配置的K8S集群(如“k8s-cluster”)。-根据任务类型配置其他参数(例如镜像、资源要求等)。注意事项:-确保DolphinScheduler的Worker节点能够访问KubernetesAPIServer(网络连通性)。-如果使用自签名证书的K8S集群,可能需要配置跳过证书验证或添加CA证书。-权限问题:确保DolphinScheduler使用的kubeconfig中的用户或ServiceAccount有足够的权限在指定的命名空间中创建Pod。如果上述步骤在界面操作中遇到问题,还可以考虑通过修改DolphinScheduler的配置文件来添加集群(但通常推荐通过界面操作)。由于引用中没有直接提供K8S配置的教程,以上步骤是基于对DolphinScheduler和Kubernetes集成的通用知识。具体操作可能因版本而异,请参考官方文档。根据提供的引用[3]中,我们可以看到DolphinScheduler的Docker部署方式,但并没有具体说明K8S集群配置。因此,我们主要依据通用方法。相关问题:1.如何验证DolphinScheduler与Kubernetes集群的连接是否成功?2.在DolphinScheduler中使用Kubernetes集群运行任务时,如何配置资源限制(如CPU和内存)?3.DolphinScheduler支持哪些类型的任务在Kubernetes上运行?注:如果用户需要更详细的步骤,建议查阅官方文档或社区教程。</think>### DolphinScheduler 添加 Kubernetes 集群配置教程 在 DolphinScheduler 中配置 Kubernetes 集群主要涉及以下步骤,适用于 3.x 版本(以 3.2.2 为例): #### 一、准备工作 1. **环境要求**: - 已安装 DolphinScheduler(参考[部署文档](引用[3])) - 可访问的 Kubernetes 集群(需获取 `kubeconfig` 文件) - 确保 DolphinScheduler 服务与 K8S API Server 网络互通 2. **权限准备**: ```bash # 在 K8S 集群创建 ServiceAccount kubectl create serviceaccount dolphinscheduler-sa -n <命名空间> kubectl create clusterrolebinding dolphinscheduler-crb \ --clusterrole=cluster-admin \ --serviceaccount=<命名空间>:dolphinscheduler-sa ``` #### 二、配置步骤 1. **修改 `common.properties` 配置** 在 DolphinScheduler 安装目录的 `conf/common.properties` 中添加: ```properties # 启用 K8S 支持 resource.storage.type=kubernetes # K8S 配置文件路径(需将 kubeconfig 放在此路径) resource.kubernetes.kubeconfig.path=/opt/dolphinscheduler/conf/kubeconfig # 命名空间(与 ServiceAccount 一致) resource.kubernetes.namespace=ds-namespace # 任务执行镜像(默认使用官方镜像) resource.kubernetes.container.image=dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-all:3.2.2 ``` 2. **上传 kubeconfig 文件** 将 K8S 集群的 `kubeconfig` 文件复制到配置路径: ```bash cp ~/.kube/config /opt/dolphinscheduler/conf/kubeconfig chown dolphinscheduler:dolphinscheduler /opt/dolphinscheduler/conf/kubeconfig ``` 3. **重启服务** ```bash # 重启所有服务(standalone 模式) bin/dolphinscheduler-daemon.sh stop standalone-server bin/dolphinscheduler-daemon.sh start standalone-server ``` #### 三、界面配置验证 1. 登录 Web UI(默认 `http://<IP>:12345/dolphinscheduler`) 2. 进入 **安全中心 → 集群管理** 3. 点击 **创建集群**: - **集群类型**:选择 `Kubernetes` - **集群配置**:粘贴 `kubeconfig` 内容(或保留自动加载) - **命名空间**:填写 `ds-namespace` - 点击 **测试连接** 验证连通性 ![集群配置示例](https://dolphinscheduler.apache.org/img/new_ui/dev/configuration/k8s_cluster.png) #### 四、使用 K8S 集群运行任务 创建任务时选择 Kubernetes 集群: ```yaml # 示例 Shell 任务配置 apiVersion: v1 kind: Pod spec: containers: - name: task image: busybox command: ["echo", "Hello K8S from DolphinScheduler"] ``` #### 注意事项 1. **镜像兼容性**:任务镜像需包含所需运行环境(如 Java/Python) 2. **资源限制**:在 `common.properties` 配置默认资源限制: ```properties resource.kubernetes.container.request.cpu=0.5 resource.kubernetes.container.request.memory=512Mi ``` 3. **网络策略**:若使用网络插件(如 Calico),需开放 DS 到 K8S API 的访问 4. **高可用建议**:生产环境建议通过 `values.yaml` 配置 Helm Chart 部署[^3] > 配置验证提示:在任务日志中看到 `Successfully assigned ds-namespace/ds-task to <k8s-node>` 表示集成成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值