強化指南 - 排程器配置
本文件涵蓋了如何提高排程器的安全態勢。
配置錯誤的排程器可能會帶來安全隱患。這樣的排程器可以針對特定節點,並驅逐共享該節點及其工作負載的應用程式。這可能有助於攻擊者發動 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
將工作負載排程到不應存在這些工作負載的節點上。