Kube Scheduler 可观测性最佳实践

Kube Scheduler 介绍

Kube Scheduler 是 Kubernetes 集群中的核心组件之一,负责调度决策,即将 Pod 绑定到集群中的节点上。它确保 Pod 能够高效、公平地同时遵守各种调度约束和优化目标被调度到集群中的节点上。通过合理配置和优化 Kube Scheduler,可以提高集群的资源利用率和应用程序的性能。

容器调度本身是一件比较复杂的事,因为要确保以下几个目标:

  • 公平性:在调度 Pod 时需要公平的进行决策,每个节点都有被分配资源的机会,调度器需要对不同节点的使用作出平衡决策。
  • 资源高效利用:最大化群集所有资源的利用率,使有限的 CPU、内存等资源服务尽可能更多的 Pod。
  • 效率问题:能快速的完成对大批量 Pod 的调度工作,在集群规模扩增的情况下,依然保证调度过程的性能。
  • 灵活性:在实际运作中,往往希望 Pod 的调度策略是可控的,从而处理大量复杂的实际问题。因此平台要允许多个调度器并行工作,同时支持自定义调度器。

关键特性和功能

1、调度策略:

Kube Scheduler 根据预定义的调度策略来决定 Pod 应该在哪个节点上运行。这些策略包括资源需求、亲和性与反亲和性规则、数据局部性、工作负载间干扰等。

2、过滤(Filtering):

在过滤阶段,Kube Scheduler 会评估所有节点,根据 Pod 的要求(如资源需求、亲和性规则等)来筛选出合适的节点候选列表。

3、打分(Scoring):

对于过滤后的节点候选列表,Kube Scheduler 会为每个节点打分,根据一系列预定义的策略(如节点的资源剩余量、Pod 间亲和性等)来评估每个节点的适宜性。

4、绑定(Binding):

打分最高的节点将被选为 Pod 运行的位置。Kube Scheduler 然后会绑定 Pod 到该节点,这意味着它会在 Kubernetes API 中更新 Pod 的状态,指明它应该在哪个节点上运行。

5、调度扩展性:

Kube Scheduler 支持扩展性,允许开发者实现自定义的调度器插件。这些插件可以用于实现特定的调度逻辑,如特定的亲和性规则或资源分配策略。

6、多调度器支持:

Kubernetes 支持运行多个调度器实例,每个实例可以配置不同的调度策略。这允许在同一集群中运行不同的调度策略,以适应不同的工作负载需求。

7、领导者选举:

在多调度器配置中,Kube Scheduler 支持领导者选举机制,确保在任何给定时间只有一个调度器实例在进行调度决策。

9、监控和日志:

Kube Scheduler 提供监控端点和日志记录,以便集群管理员可以监控调度器的性能和调试问题。

9、配置:

Kube Scheduler 的行为可以通过一个配置文件来定制,该文件定义了调度器的策略、插件和其他参数。

10、与 Kubernetes API 服务器的交互:

Kube Scheduler 通过与 Kubernetes API 服务器通信来获取集群状态信息,如当前的 Pod 和节点列表,并在调度决策后更新这些信息。

观测云

观测云是一个统一实时监测平台,它提供全面的系统可观测性解决方案,帮助用户快速实现对云平台、云原生、应用及业务的监控需求。观测云的核心功能包括:基础设施监测,日志采集和分析,用户访问监测(RUM),应用性能监测(APM),服务可用性监测(拨测),安全巡检,智能监控等等。

DataKit 提供 Kube Scheduler 指标的采集,安装好 DataKit 之后,开通 kubernetesprometheus 采集器,挂载 Kube Scheduler 配置的 configMap,即可采集 Kube Scheduler指标到观测云。

部署 DataKit

登录观测云控制台,点击「集成」 -「DataKit」 - 「Kubernetes」,下载 datakit.yaml,拷贝第 ③ 步中的 token。

编辑 datakit.yaml ,把 token 粘贴到 ENV_DATAWAY 环境变量值中"token="后面,把 datakit.yaml 上传到可以连接到 Kubernetes 集群的主机上,执行如下命令:

arduino 复制代码
kubectl apply -f datakit.yaml
kubectl get pod -n datakit

采集器配置

在 datakit.yaml 中配置 ConfigMap 资源来收集 Kube Scheduler 的指标数据。

ini 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: datakit-conf
  namespace: datakit
data:
   kubernetesprometheus.conf: |-  
   # 以下配置不是一成不变,请根据实际情况进行修改
        [[inputs.kubernetesprometheus.instances]]
          role       = "pod"
          namespaces = ["kube-system"]
          selector   = "component=kube_scheduler,tier=control-plane"      
          scrape   = "true"
          scheme   = "https"
          port     = "10259"
          path     = "/metrics"
          interval = "30s"
      
         [inputs.kubernetesprometheus.instances.custom]
           measurement        = "kube_scheduler"
           job_as_measurement = false
           [inputs.kubernetesprometheus.instances.custom.tags]
             cluster_name_k8s = "k8s-test"           
             node_name        = "__kubernetes_pod_node_name"
             instance         = "__kubernetes_mate_instance"
      
         [inputs.kubernetesprometheus.instances.auth]
           bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"
           [inputs.kubernetesprometheus.instances.auth.tls_config]
             insecure_skip_verify = true
             ca_certs = []
             cert     = ""
             cert_key = ""
bash 复制代码
# 重启dk,使cm配置生效
kubectl rollout restart ds  datakit -n datakit

登录观测云控制台,点击「指标」 -「指标管理」,通过 scheduler 检索指标集,指标采集如下:

关键指标

指标 描述 类型
scheduler_scheduler_cache_size 调度器缓存中节点、Pod和AssumedPod(假定要调度的Pod)的数量 Gauge
scheduler_pending_pods Pending Pod的数量。队列种类如下:unschedulable :不可调度的Pod数量。backoff :backoffQ的Pod数量,即因为某种原因暂时不能被调度的Pod数量。active:activeQ的Pod数量,即准备就绪并等待被调度的Pod数量。 Gauge
rest_client_request_duration_seconds_bucket 从方法(Verb)和URL维度分析HTTP请求时延。 Histogram
rest_client_requests_total 从状态值(Status Code)、方法(Method)和主机(Host)维度分析HTTP请求数。 Counter

视图

登录观测云控制台,点击「场景」 -「新建仪表板」,模板库系统视图中,输入 "Scheduler", 选择"Kube Scheduler",点击"确定"。

监控器(告警)

  • Scheduler pending pods 数量过多
  • Kube API 请求时延过高
  • Kube API 请求过多

总结

通过观测云监控 Kubernetes 集群中的核心组件之一 Kube Scheduler 的关键指标,可以更加清楚知道目前集群的运行情况,调整优化集群中 pod 的调度效率,及时响应和处理出现的各种问题,提高集群的稳定性。

相关推荐
无言听风雨丶12 小时前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
无言听风雨丶16 小时前
Kubernetes GitOps 持续交付实战:用 Argo CD 让 Git 成为集群事实源
git·elasticsearch·kubernetes
无言听风雨丶1 天前
Kubernetes 控制平面深度剖析:从 kubectl apply 到 etcd 写入的全链路
平面·kubernetes·etcd
openFuyao1 天前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉1 天前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
相思难忘成疾1 天前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
weirong1 天前
给 K8s 加一个自动值班员:分级故障自愈引擎
kubernetes
云和数据.ChenGuang1 天前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
weirong2 天前
为什么 HPA 会震荡?手写一个带冷却窗口的伸缩决策引擎
kubernetes
-星空下无敌2 天前
Windows Docker K8s 安装部署Naocs ,SpringBoot 3.x 4.x 整合Naocs 版本兼容 配置中心、服务注册与发现
windows·docker·nacos·kubernetes·springboot·alibaba