使用許可控制器和 Webhook 存取叢集主節點

在要求到達 Red Hat OpenShift on IBM Cloud 叢集主節點中執行的 API 伺服器之前,許可控制器會截取來自各種 Kubernetes 資源的授權 API 要求。 轉換許可 Webhook 可能會修改要求,並驗證許可 Webhook 檢查要求。 如果任一 Webhook 拒絕要求,則整個要求都會失敗。 進階功能 (不論是內建或新增) 通常需要許可控制器作為安全預防措施,並控制傳送至 API 伺服器的要求。 如需相關資訊,請參閱 Kubernetes 文件中的 使用許可控制器動態許可控制

我可以建立自己的許可控制器嗎?

是,如需相關資訊,請參閱 KubernetesRed Hat OpenShift 文件。

如文件 Kubernetes 所述,您可使用准入控制器來處理原本由控制平面處理的操作。 因此,當您配置自訂許可控制器時,請特別小心。 由於自訂許可控制器而在叢集裡發生的任何變更,您都必須負責。

使用 Webhook 的最佳作法有哪些?

盡可能避免使用 webhooks。 請改用 ValidatingAdmissionPolicyMutatingAdmissionPolicy (預設啟用時)作為替代方案。

若您必須使用 webhook,請在設定 webhook 時留意以下最佳實務與注意事項。

  • 請勿使用變異 Webhook 來變異其他控制器或操作員擁有的資源。 這樣做可能會導致資源擁有者和 Webhook 之間出現無限協調循環。 Webhooks 可以透過檢查是否確定資源所有權 metadata.ownerReferences 在資源數據中設定。 例如,一個Kubernetes複製集資源由Kubernetes部署資源,且絕對不能被 Webhook 改變。

  • 為 Webhook 建立 抄本 Pod,以便在其中一個 Pod 關閉時,Webhook 仍然可以處理來自資源的要求。 可能的話,將抄本 Pod 分散到各區域。

  • 設定適當的 failurePolicy 選項,例如 Webhook 失敗還是忽略連線失敗或逾時。 如果您想要 Webhook 忽略逾時的連線錯誤,則可以將 failurePolicy 設為 Ignore。 請注意,這不會變更 apiserver 在 Webhook 拒絕要求時的行為方式。

  • 檢閱 timeoutSeconds 間隔。 使用 v1beta1.admissionregistration.k8s.io API 的較舊 Webhook 的預設逾時值為 30 秒。 v1 API 使用預設值 10 秒。 如果 Webhook 失敗原則是「忽略」,且現行 timeoutSeconds 是 30,請考量將逾時減少至 10 秒。 對於 OpenShift 叢集,控制平面元件通常具有自己的逾時值 13 秒。

    避免允許多個變異性 webhook 對同一組資源進行操作。 變異型 webhook 會依序執行。 單一變更型 webhook 在超時與失敗策略層面可能運作如預期,但當其與作用於相同資源的其他變更型 webhook 結合時,這些變更型 webhook 可能超出執行所有 webhook 所分配的總上下文超時限制。

  • 為 Webhook 設定適當的 CPU 及記憶體 資源要求及限制

  • 添加 有效性和就緒性探測,以協助確保您的 webhook 容器正在運行,並已準備好為請求提供服務。

  • 設定 Pod 反親緣性排程規則,以在可能時偏好您的 Webhook Pod 在不同的工作者節點及區域上執行。 您可以改用 Pod 拓蹼。 不過,請避免 污染 或強制親緣性,這可能會限制可以排定 Webhook Pod 的位置。

  • 針對 Webhook Pod 設定 Pod 優先順序system-cluster-critical,以便其他 Pod 無法從 Webhook Pod 取得資源。

  • 將 Webhook 限定為適當的專案。 避免處理在叢集中預設設定的系統關鍵專案中執行的資源的 Webhook,例如 kube-systemibm-systemibm-operatorscalico-apiservercalico-systemtigera-operatoropenshift-* 專案。

  • 檢閱 namespaceSelector 選項。 您可以將標籤新增至特定重要名稱空間 (例如 kube-system),以便在這些情況下不會呼叫 Webhook。 此設定稱為「拒絕」樣式配置。 或者,您可以配置 namespaceSelector 選項,以便僅針對具有特定標籤的名稱空間呼叫 Webhook。 此設定稱為「接受」配置。 視 Webhook 的用途而定,針對所有名稱空間呼叫 Webhook 可能很重要。 檢閱 Kubernetes 文件 中的 namespaceSelector 配置選項,並調整 Webhook 配置。

  • 請確定叢集裡的工作者節點 是用來執行 Webhook 應用程式的正確大小。 例如,如果 Pod 所要求的 CPU 或記憶體超過工作者節點所能提供的數量,則不會排定 Pod。

哪些其他類型的應用程式使用許可控制器?

許多叢集附加程式、外掛程式及其他協力廠商延伸使用許可控制器。 一些常見的包括:

設定許可控制器 Webhook

在叢集版本 4.14 及後續版本中,Konnectivity 已取代原有 OpenVPN 解決方案。 若您使用的是叢集版本 4.14 及後續版本,且您的 webhook 採用 ClusterIP,,則必須更新 webhook 以改用 服務 Kubernetes。

您可以將 Webhook 應用程式參照為 Kubernetes 服務,或將 Webhook 應用程式參照為 IP 位址或公開登錄的 DNS 名稱,來配置 Webhook。

將 Webhook 應用程式參照為 Kubernetes 服務的配置範例

clientConfig:
   caBundle: #CA_BUNDLE_BASE64#
   service:
      name: admission-webhook
      namespace: default
      path: /validate
      port: 443

參照 Webhook 應用程式作為 IP 位址或公開登錄 DNS 名稱的範例配置

clientConfig:
   caBundle: #CA_BUNDLE_BASE64#
   url: https://#WEBHOOK_URL#:443/validate

請注意下列將 Webhook 應用程式參照為 IP 位址或 DNS 名稱的限制:

  • 如果 URL 是 DNS,則此 DNS 必須是公開註冊的 DNS 名稱。 不支援專用 DNS 配置。
  • 如果 URL 是外部 IP 位址,也就是 webhook 服務位於群集之外,則會使用控制平面網路來連接服務。 控制平面必須能夠到達 IP 位址。 例如,如果 IP 位址來自內部部署網路,且控制平面無法到達 IP 位址,則 Webhook 服務無法運作。
  • 如果 URL 是群集 IP 位址,也就是 webhook 服務在群集內部,則 Kubernetes API 需要連線到群集網路。 如果您的群集版本是 1.21 及更新版本,而您的 webhook 使用群集 IP 位址,則必須更新您的 webhook,改為使用 Kubernetes 服務。

我需要幫助解決斷了的 Webhook。 我能執行哪些操作?

如需 Webhook 疑難排解說明,請參閱 除錯 Webhook由於 Webhook 中斷而無法更新叢集