跳至主要内容

Rancher Webhook

Rancher-Webhook 是 Rancher 的重要元件,與 Kubernetes 協同工作以增強安全性並為 Rancher 管理的叢集啟用關鍵功能。

它與 Kubernetes 的可擴展准入控制器整合,如 Kubernetes 文件所述,這使得 Rancher-Webhook 能夠檢查發送到 Kubernetes API 伺服器的特定請求,並對 Rancher 特定的請求添加自訂驗證和變更。Rancher-Webhook 使用 rancher.cattle.io ValidatingWebhookConfiguration 和 rancher.cattle.io MutatingWebhookConfiguration 物件來管理要驗證的資源,並將覆蓋任何手動編輯。

Rancher 在本地和下游叢集中將 Rancher-Webhook 部署為單獨的部署和服務。Rancher 使用 Helm 管理 Rancher-Webhook。需要注意的是,Rancher 可能會覆蓋使用者對 Helm 版本所做的修改。要安全地修改這些值,請參閱自訂 Rancher-Webhook 配置。

每個 Rancher 版本都設計為與單一版本的 webhook 相容。為方便起見,以下提供了相容版本。

**注意:**Rancher 管理 webhook 的部署和升級。在大多數情況下,不需要使用者介入即可確保 webhook 版本與你執行的 Rancher 版本相容。

Rancher VersionWebhook VersionAvailability in PrimeAvailability in Community
v2.13.0v0.9.0✗✓

為什麼我們需要它?​

Rancher-Webhook 對於 Rancher 保護叢集免受惡意攻擊並啟用各種功能至關重要。 Rancher 依賴 Rancher-Webhook 作為其功能的組成部分。沒有 webhook,Rancher 將不是一個完整的產品。 它為 Rancher 管理的叢集提供必要的保護,防止安全漏洞並確保叢集的一致性和穩定性。

Webhook 驗證哪些資源?​

你可以在 webhook 的儲存庫中找到 webhook 驗證的資源進度清單。這些文件按組/版本和資源組織(頂層標題是組/版本,次級標題是資源)。可以透過查看與特定標籤關聯的 docs.md 檔案來找到特定於一個版本的檢查(請注意,v0.3.6 之前的 webhook 版本不會有此檔案)。

繞過 Webhook​

有時,你必須繞過 Rancher 的 webhook 驗證以執行緊急還原操作或修復其他關鍵問題。繞過操作是徹底的,這意味著當你使用它時,不會應用任何 webhook 驗證或變更。無法繞過某些驗證或變更而讓其他驗證或變更仍然生效——它們要麼全部繞過,要麼全部啟用。

危險

Rancher 的 webhook 提供關鍵的安全保護。繞過 webhook 應僅由管理員在特定場景中執行,並且在所有其他選項都已用盡之後。此外,繞過 webhook 的權限應受到嚴格控制,並且永遠不應授予非管理員使用者。

要繞過 webhook,請模擬 rancher-webhook-sudo 服務帳戶和 system:masters 群組(兩者都是必需的):

kubectl create -f example.yaml --as=system:serviceaccount:cattle-system:rancher-webhook-sudo --as-group=system:masters

自訂 Rancher-Webhook 配置​

你可以在透過 Helm 安裝 Rancher-Webhook 時添加自訂 Helm 值。在 Helm 安裝 Rancher-Webhook Chart 期間,Rancher 會檢查自訂 Helm 值。這些自訂值必須在 cattle-system 命名空間中名為 rancher-config 的 ConfigMap 中的資料鍵 rancher-webhook 下定義。此鍵的值必須是有效的 YAML。

apiVersion: v1
kind: ConfigMap
metadata:
name: rancher-config
namespace: cattle-system
labels:
app.kubernetes.io/part-of: "rancher"
data:
rancher-webhook: '{"port": 9553, "priorityClassName": "system-node-critical"}'

當檢測到 ConfigMap 值的變更時,Rancher 會重新部署 Rancher-Webhook Chart。

在 Rancher 安裝期間自訂 Rancher-Webhook​

當你使用 Helm 安裝 Rancher Chart 時,可以將自訂 Helm 值添加到本地叢集的 Rancher-Webhook。Rancher-Webhook Chart 中的所有值都可以作為 webhook 名稱下的巢狀變數存取。

這些值在安裝期間會同步到 rancher-config ConfigMap。

helm install rancher rancher-<CHART_REPO>/rancher \
--namespace cattle-system \
...
--set webhook.port=9553 \
--set webhook.priorityClassName="system-node-critical"

常見問題​

使用 Calico CNI 的 EKS 叢集​

執行使用 Calico CNI 的 EKS 叢集的使用者在 Kubernetes API 伺服器嘗試聯繫 Rancher-Webhook 時可能會遇到錯誤。 此問題的一個解決方法,如 Calico 文件所述,涉及為 webhook 部署設定 hostNetwork=true。你可以透過將 Helm 值 global.hostNetwork=true 添加到 rancher-config ConfigMap 來更改此值。更多資訊請參閱自訂 Rancher-Webhook 配置。

apiVersion: v1
kind: ConfigMap
metadata:
name: rancher-config
namespace: cattle-system
labels:
app.kubernetes.io/part-of: "rancher"
data:
rancher-webhook: '{"global": {"hostNetwork": true}}'

**注意:**此臨時解決方法可能違反環境的安全策略。此解決方法還要求主機網路上未使用連接埠 9443。

**注意:**預設情況下,Helm 將資訊儲存為 Secret。Secret 是某些 webhook 版本驗證的資源。在這些情況下,請使用 kubectl 直接更新部署的 hostNetwork=true 值,然後按照上述規定更新 webhook 配置。

私有 GKE 叢集​

使用私有 GKE 叢集時,可能會發生阻止 Kubernetes API 伺服器與 webhook 通訊的錯誤。可能會出現以下錯誤訊息:

Internal error occurred: failed calling webhook "rancher.cattle.io.namespaces.create-non-kubesystem": failed to call webhook: Post "https://rancher-webhook.cattle-system.svc:443/v1/webhook/validation/namespaces?timeout=10s": context deadline exceeded

發生此問題是因為防火牆規則限制了 API 伺服器與私有叢集之間的通訊。要解決此通訊問題,使用者必須添加防火牆規則以允許 GKE 控制平面在連接埠 9443 上與 Rancher-Webhook 通訊。有關更新防火牆規則的詳細資訊和步驟,請參閱 GKE 文件。

應用程式因 rancher-webhook 阻止存取而無法部署​

webhook 對命名空間提供額外的驗證。其中一項驗證確保使用者只有在擁有適當權限(management.cattle.io 中 projects 的 updatepsa)時才能更新 PSA 相關標籤。這可能導致特定操作員(例如 Tigera 或 Trident)在嘗試部署帶有 PSA 標籤的命名空間時失敗。有幾種方法可以解決此問題:

  • 配置應用程式以建立沒有 PSA 標籤的命名空間。如果使用者希望將 PSA 應用於這些命名空間,可以在配置後將它們添加到具有所需 PSA 的專案中。有關操作方法的說明,請參閱 PSS 和 PSA 資源文件。
    • 這是首選選項,儘管並非所有應用程式都可以以這種方式配置。
  • 手動授予操作員管理命名空間 PSA 的權限。
    • 此選項會帶來安全風險,因為操作員現在將能夠為其有權存取的命名空間設定 PSA。這可能允許操作員部署特權 Pod,或透過其他方式實現叢集接管。
  • 具有適當權限的使用者帳戶可以預先建立具有適當配置的命名空間。
    • 此選項取決於應用程式處理現有資源的能力。

另一項驗證確保使用者具有更新命名空間上的 field.cattle.io/projectId 註解的適當權限。這是 management.cattle.io 中 projects 的 manage-namespaces 權限。

特定版本的問題​

**注意:**以下是影響特定 Rancher/webhook 版本的高嚴重性問題的不完整清單。在大多數情況下,這些問題可以透過升級到較新的 Rancher 版本來解決。

回滾時 Webhook 版本不相容​

**注意:**這會影響回滾到 Rancher v2.7.5 或更早版本。

如果你回滾到 Rancher v2.7.5 或更早版本,你可能會看到 webhook 版本太新而無法與執行 v2.7.5 之前版本 Rancher 的下游叢集相容。這可能會導致各種不相容問題。例如,專案成員可能無法建立命名空間。此外,當你回滾到在下游叢集中安裝 webhook 之前的版本時,webhook 可能仍然安裝,這可能會導致類似的不相容問題。

為了幫助緩解這些問題,你可以在回滾後執行 adjust-downstream-webhook shell 腳本。此腳本會為相應的 Rancher 版本選擇並安裝適當的 webhook 版本(或完全刪除 webhook)。