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 的调度效率,及时响应和处理出现的各种问题,提高集群的稳定性。

相关推荐
木鱼时刻14 小时前
容器与 Kubernetes 基本概念与架构
容器·架构·kubernetes
chuanauc1 天前
Kubernets K8s 学习
java·学习·kubernetes
庸子2 天前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
李白你好2 天前
高级运维!Kubernetes(K8S)常用命令的整理集合
运维·容器·kubernetes
Connie14512 天前
k8s多集群管理中的联邦和舰队如何理解?
云原生·容器·kubernetes
伤不起bb2 天前
Kubernetes 服务发布基础
云原生·容器·kubernetes
别骂我h2 天前
Kubernetes服务发布基础
云原生·容器·kubernetes
weixin_399380692 天前
k8s一键部署tongweb企业版7049m6(by why+lqw)
java·linux·运维·服务器·云原生·容器·kubernetes
斯普信专业组3 天前
K8s环境下基于Nginx WebDAV与TLS/SSL的文件上传下载部署指南
nginx·kubernetes·ssl
&如歌的行板&3 天前
如何在postman中动态请求k8s中的pod ip(基于nacos)
云原生·容器·kubernetes