强化指南 - 调度器配置
本文档涵盖了如何提高调度器的安全态势。
配置错误的调度器可能会带来安全隐患。这样的调度器可以针对特定节点,并驱逐共享该节点及其工作负载的应用程序。这可能有助于攻击者发动 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 调度代码的自定义调度器时,集群管理员需要小心使用使用 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-custom-scheduler
的调度器配置文件。每当 Pod 的 .spec
中没有 .spec.schedulerName
的值时,kube-scheduler 将使用其主配置和默认插件为该 Pod 运行。如果你定义一个 .spec.schedulerName
设置为 my-custom-scheduler
的 Pod,kube-scheduler 将使用自定义配置运行;在该自定义配置中,queueSort
、filter
和 permit
扩展点被禁用。如果你使用此 KubeSchedulerConfiguration,并且不运行任何自定义调度器,然后你定义一个 .spec.schedulerName
设置为 nonexistent-scheduler
(或集群中不存在的任何其他调度器名称)的 Pod,则不会为该 Pod 生成任何事件。
禁止为节点打标签
集群管理员应确保集群用户无法为节点打标签。恶意行为者可以使用 nodeSelector
将工作负载调度到不应存在这些工作负载的节点上。