k8s中kube-scheduler具体的作用是什么?

1 个回答

  • 孙悟空
    活在别人的言论下,是对自己的不尊重。
    ### **kube-scheduler 在 Kubernetes 中的作用** `kube-scheduler` 是 Kubernetes 的核心组件之一,负责将新创建的 Pod 分配到合适的 Node 上。它决定 Pod 运行在哪台节点机器(Node)上,以确保资源利用率、负载均衡和调度策略的最优化。 ### **kube-scheduler 的调度流程** 当一个新的 Pod 被创建但没有绑定到任何 Node 时,`kube-scheduler` 负责选择合适的 Node 并执行调度。整个调度流程包括以下几个阶段: #### **1. 监听未调度的 Pod** - `kube-scheduler` 监听 API Server,获取 `Pending` 状态的 Pod(即未被调度的 Pod)。 - 只有 `spec.nodeName` 为空的 Pod 才会被调度。 #### **2. 预选(Pre-filter 和 Filter 阶段)** `kube-scheduler` 会筛选出可运行 Pod 的节点,移除不符合要求的 Node。常见的过滤条件包括: - Node 资源是否足够(CPU、内存、存储) - Node 是否满足调度约束(Taints & Tolerations、NodeSelector、NodeAffinity) - Pod 是否违反 PDB(PodDisruptionBudget) - 是否有足够的端口、GPU、拓扑亲和性等 - Node 是否处于 Ready 状态 #### **3. 评分(Scoring 阶段)** 对于满足条件的节点,`kube-scheduler` 赋予它们不同的评分(0-100),根据调度策略进行排序。常见的评分标准: - Least Requested Priority:优先选择资源利用率低的 Node - Balanced Resource Allocation:优先选择 CPU 和内存使用率均衡的 Node - Node Affinity:根据 Pod 亲和性(Affinity)打分 - Inter-Pod Affinity/Anti-Affinity:计算 Pod 之间的亲和/反亲和影响 - Spread Constraints:确保 Pod 均匀分布在不同 Node 或可用区(Zone)上 #### **4. 选出最佳节点(Select 最优 Node)** - 在评分最高的 Node 中,`kube-scheduler` 选择得分最高的一个。 - 如果多个 Node 得分相同,会随机选取一个。 #### **5. 绑定(Bind 阶段)** - `kube-scheduler` 通过 API Server 调用 `bind` 操作,把 Pod 绑定到选定的 Node: ```yaml kind: Binding apiVersion: v1 metadata: name: my-pod target: apiVersion: v1 kind: Node name: selected-node ``` - 绑定成功后,Pod 的 `spec.nodeName` 会被更新,`kubelet` 开始在目标 Node 上拉取容器镜像并启动 Pod。 ### **kube-scheduler 调度策略** `kube-scheduler` 提供多种调度策略,可以通过 `SchedulerConfiguration` 进行配置。 #### **1. 基于 Node 资源** - **资源充足优先(Least Requested Priority)** 选择 CPU 和内存资源最空闲的 Node,适用于高负载计算任务,防止某些 Node 资源耗尽。 - **均衡资源使用(Balanced Resource Allocation)** 选择 CPU 和内存占用均衡的 Node,避免 CPU 低但内存高的情况,适用于稳定负载场景。 #### **2. 基于 Node 亲和性** - **NodeSelector(节点选择器)** 只能严格匹配 Node 标签: ```yaml nodeSelector: disktype: ssd ``` - **NodeAffinity(节点亲和性)** 支持软约束: ```yaml affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 10 preference: matchExpressions: - key: zone operator: In values: ["us-west-1"] ``` 也支持硬约束。 #### **3. 基于 Pod 亲和性** - **PodAffinity(Pod 亲和性)** 适用于希望多个 Pod 运行在一起的情况(如微服务通信)。 - **PodAntiAffinity(Pod 反亲和性)** 适用于希望多个副本 Pod 分散到不同 Node,提升高可用性: ```yaml affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["backend"] topologyKey: "kubernetes.io/hostname" ``` #### **4. Pod 亲和性/反亲和性** - **InterPod Affinity**:控制 Pod 之间的亲和性。 - **InterPod Anti-Affinity**:控制 Pod 之间的反亲和性,防止多个 Pod 运行在同一 Node。 ### **kube-scheduler 相关命令** #### **1. 查看默认调度器状态** ```bash kubectl get pods -n kube-system | grep kube-scheduler ``` #### **2. 检查 kube-scheduler 日志** ```bash kubectl logs -n kube-system kube-scheduler-<pod-name> ``` #### **3. 手动调度 Pod** 如果 `kube-scheduler` 不能调度 Pod,可以手动指定 `Node`: ```yaml apiVersion: v1 kind: Pod metadata: name: my-manual-pod spec: nodeName: worker-node-1 containers: - name: nginx image: nginx ``` ### **自定义 kube-scheduler** 可以使用 `kube-scheduler` 组件的 `--config` 选项加载自定义调度策略。例如: ```yaml apiVersion: kubescheduler.config.k8s.io/v1beta3 kind: KubeSchedulerConfiguration profiles: - schedulerName: my-scheduler plugins: score: enabled: - name: "NodeResourcesBalancedAllocation" ``` 然后启动: ```bash kube-scheduler --config=my-scheduler-config.yaml ``` ### **kube-scheduler 故障排查** #### **1. Pod 处于 Pending 状态** ```bash kubectl get pods -A --field-selector=status.phase=Pending ``` 可能原因: - 没有合适的 Node(资源不足、亲和性限制)。 - `kube-scheduler` 进程异常。 #### **2. 检查调度事件** ```bash kubectl describe pod <pod-name> ``` 可以看到 `Events` 部分,查看调度失败的原因。 #### **3. 调试 kube-scheduler** ```bash kubectl logs -n kube-system kube-scheduler-<pod-name> ``` 日志会显示 `FailedScheduling` 相关错误信息。 ### **总结** - `kube-scheduler` 负责监听 `Pending` 的 Pod,并选择合适的 Node 进行调度。 - 通过 **预选(Filter)+ 评分(Scoring)+ 绑定(Bind)** 完成调度过程。 - 支持 **Node 亲和性、Pod 亲和性、资源分配策略** 等多种调度策略。 - 可以自定义调度器,或者手动指定 `nodeName` 进行 Pod 调度。 - 常见调度问题包括 **资源不足、亲和性限制、Node 不可用**,可以通过 `kubectl describe pod` 和 `kubectl logs` 排查。
    发布于 2025-03-02 17:04 •IP属地 山东
    举报
    评论
    收藏