强化指南 - 调度器配置

有关如何使 Kubernetes 调度器更安全的信息。

Kubernetes 调度器控制平面的关键组件之一。

本文档涵盖了如何提高调度器的安全态势。

配置错误的调度器可能会带来安全隐患。这样的调度器可以针对特定节点,并驱逐共享该节点及其工作负载的应用程序。这可能有助于攻击者发动 Yo-Yo 攻击:一种针对易受攻击的自动扩缩器的攻击。

kube-scheduler 配置

调度器认证和授权命令行选项

设置认证配置时,应确保 kube-scheduler 的认证与 kube-api-server 的认证保持一致。如果任何请求缺少认证头部,则应通过 kube-api-server 进行认证,从而使集群中的所有认证保持一致

  • authentication-kubeconfig:确保提供正确的 kubeconfig,以便调度器可以从 API 服务器检索认证配置选项。此 kubeconfig 文件应受到严格的文件权限保护。
  • authentication-tolerate-lookup-failure:将其设置为 false,以确保调度器**始终**从 API 服务器查找其认证配置。
  • authentication-skip-lookup:将其设置为 false,以确保调度器**始终**从 API 服务器查找其认证配置。
  • authorization-always-allow-paths:这些路径应该响应适合匿名授权的数据。默认为 /healthz,/readyz,/livez
  • profiling:设置为 false 以禁用 profiling 端点,这些端点提供调试信息,但不应在生产集群上启用,因为它们存在拒绝服务或信息泄露的风险。--profiling 参数已弃用,现在可以通过 KubeScheduler DebuggingConfiguration 提供。通过将 enableProfiling 设置为 false,可以在 kube-scheduler 配置中禁用 profiling。
  • requestheader-client-ca-file:避免传递此参数。

调度器网络命令行选项

  • bind-address:在大多数情况下,kube-scheduler 不需要外部可访问。将绑定地址设置为 localhost 是一种安全做法。
  • permit-address-sharing:将其设置为 false 以禁用通过 SO_REUSEADDR 进行的连接共享。SO_REUSEADDR 可能导致重用处于 TIME_WAIT 状态的已终止连接。
  • permit-port-sharing:默认为 false。除非你确信自己了解其安全影响,否则请使用默认值。

调度器 TLS 命令行选项

  • tls-cipher-suites:始终提供首选密码套件列表。这确保了永远不会使用不安全的密码套件进行加密。

自定义调度器的调度配置

当使用基于 Kubernetes 调度代码的自定义调度器时,集群管理员需要小心使用使用 queueSortprefilterfilterpermit 扩展点的插件。这些扩展点控制调度过程的各个阶段,错误的配置可能会影响集群中 kube-scheduler 的行为。

主要注意事项

  • 一次只能启用一个使用 queueSort 扩展点的插件。任何使用 queueSort 的插件都应仔细审查。
  • 实现 prefilterfilter 扩展点的插件可能会将所有节点标记为不可调度。这可能导致新 Pod 的调度停止。
  • 实现 permit 扩展点的插件可以阻止或延迟 Pod 的绑定。此类插件应由集群管理员彻底审查。

当使用非默认插件的插件时,考虑按如下方式禁用 queueSortfilterpermit 扩展点:

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: my-scheduler
    plugins:
      # Disable specific plugins for different extension points
      # You can disable all plugins for an extension point using "*"
      queueSort:
        disabled:
        - name: "*"             # Disable all queueSort plugins
      # - name: "PrioritySort"  # Disable specific queueSort plugin
      filter:
        disabled:
        - name: "*"                 # Disable all filter plugins
      # - name: "NodeResourcesFit"  # Disable specific filter plugin
      permit:
        disabled:
        - name: "*"               # Disables all permit plugins
      # - name: "TaintToleration" # Disable specific permit plugin

这将创建一个名为 my-custom-scheduler 的调度器配置文件。每当 Pod 的 .spec 中没有 .spec.schedulerName 的值时,kube-scheduler 将使用其主配置和默认插件为该 Pod 运行。如果你定义一个 .spec.schedulerName 设置为 my-custom-scheduler 的 Pod,kube-scheduler 将使用自定义配置运行;在该自定义配置中,queueSortfilterpermit 扩展点被禁用。如果你使用此 KubeSchedulerConfiguration,并且不运行任何自定义调度器,然后你定义一个 .spec.schedulerName 设置为 nonexistent-scheduler(或集群中不存在的任何其他调度器名称)的 Pod,则不会为该 Pod 生成任何事件。

禁止为节点打标签

集群管理员应确保集群用户无法为节点打标签。恶意行为者可以使用 nodeSelector 将工作负载调度到不应存在这些工作负载的节点上。

最后修改于 2024 年 2 月 9 日太平洋标准时间晚上 11:57:调度器配置的安全强化指南 (b0d8a8c027)