Kubernetes 调度器 (scheduler) 是控制平面的关键组件之一。
本文档介绍了如何提升调度器的安全状态。
配置错误的调度器可能会带来安全隐患。此类调度器可能会针对特定节点,驱逐正在共享该节点及其资源的工作负载或应用程序。这可能为攻击者实施溜溜球攻击 (Yo-Yo attack) 提供便利:这是一种针对易受攻击的自动扩缩容器的攻击。
在设置认证配置时,应确保 kube-scheduler 的认证与 kube-api-server 的认证保持一致。如果任何请求缺少认证头,则认证应通过 kube-api-server 进行,从而确保集群中所有认证的一致性。
authentication-kubeconfig:确保提供正确的 kubeconfig,以便调度器能够从 API Server 获取认证配置选项。此 kubeconfig 文件应受到严格的文件权限保护。authentication-tolerate-lookup-failure:将其设置为 false,以确保调度器始终从 API Server 查找其认证配置。authentication-skip-lookup:将其设置为 false,以确保调度器始终从 API Server 查找其认证配置。authorization-always-allow-paths:这些路径应响应适用于匿名授权的数据。默认值为 /healthz,/readyz,/livez。profiling:设置为 false 以禁用分析(profiling)端点。这些端点提供调试信息,但在生产集群中不应启用,因为它们存在拒绝服务或信息泄露的风险。--profiling 参数已被弃用,现在可以通过 KubeScheduler DebuggingConfiguration 提供。通过在 kube-scheduler 配置中将 enableProfiling 设置为 false,可以禁用分析功能。requestheader-client-ca-file:避免传递此参数。bind-address:在大多数情况下,kube-scheduler 不需要从外部访问。将绑定地址设置为 localhost 是一种安全的做法。permit-address-sharing:将其设置为 false 以禁用通过 SO_REUSEADDR 进行的连接共享。SO_REUSEADDR 可能会导致重用处于 TIME_WAIT 状态的已终止连接。permit-port-sharing:默认值为 false。除非您确信自己了解其安全影响,否则请使用默认值。tls-cipher-suites:始终提供一份首选密码套件列表。这可以确保加密过程绝不使用不安全的密码套件。当使用基于 Kubernetes 调度代码的自定义调度器时,集群管理员需要格外小心使用 queueSort、prefilter、filter 或 permit 扩展点 的插件。这些扩展点控制调度过程的各个阶段,错误的配置可能会影响集群中 kube-scheduler 的行为。
queueSort 扩展点的插件。任何使用 queueSort 的插件都应受到严密审查。prefilter 或 filter 扩展点的插件可能会将所有节点标记为不可调度。这可能会导致新 Pod 的调度陷入停滞。permit 扩展点的插件可能会阻止或延迟 Pod 的绑定。此类插件应由集群管理员进行彻底审查。当使用非默认插件的插件时,请考虑禁用 queueSort、filter 和 permit 扩展点,具体如下:
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-scheduler 的调度器配置文件。每当 Pod 的 .spec 中没有 .spec.schedulerName 的值时,kube-scheduler 就会使用其主配置和默认插件为该 Pod 运行。如果您定义了一个 .spec.schedulerName 设置为 my-scheduler 的 Pod,kube-scheduler 仍会运行,但会使用自定义配置;在该自定义配置中,queueSort、filter 和 permit 扩展点被禁用。如果您使用此 KubeSchedulerConfiguration 且未运行任何自定义调度器,然后定义了一个 .spec.schedulerName 设置为 nonexistent-scheduler(或集群中不存在的任何其他调度器名称)的 Pod,则不会为该 Pod 生成任何事件。
集群管理员应确保集群用户无法标记节点。恶意行为者可以使用 nodeSelector 将工作负载调度到不应出现此类工作负载的节点上。