節點和控制平面之間的通訊

本文件列出了 API 伺服器 與 Kubernetes 叢集 之間的通訊路徑。目的是允許使用者自定義其安裝,以加強網路配置,從而使叢集可以在不受信任的網路(或雲提供商的完全公共 IP 上)上執行。

節點到控制平面

Kubernetes 採用“中心輻射型”API 模式。所有來自節點(或其執行的 Pod)的 API 使用都終止於 API 伺服器。其他控制平面元件均未設計用於暴露遠端服務。API 伺服器配置為在安全的 HTTPS 埠(通常為 443)上監聽遠端連線,並啟用了多重客戶端 認證 形式。應啟用多重 授權 形式,特別是當允許 匿名請求服務賬號令牌 時。

節點應配置叢集的公共根 證書,以便它們能夠安全地連線到 API 伺服器,並附帶有效的客戶端憑據。一種好的方法是,提供給 kubelet 的客戶端憑據採用客戶端證書的形式。請參閱 kubelet TLS 引導 以實現 kubelet 客戶端證書的自動化供應。

希望連線到 API 伺服器的 Pod 可以透過利用服務賬號安全地進行連線,這樣 Kubernetes 在例項化 Pod 時會自動將公共根證書和有效的持有者令牌注入到 Pod 中。`kubernetes` 服務(在 `default` 名稱空間中)配置了一個虛擬 IP 地址,該地址透過 `kube-proxy` 重定向到 API 伺服器上的 HTTPS 端點。

控制平面元件也透過安全埠與 API 伺服器通訊。

因此,從節點和節點上執行的 Pod 到控制平面的連線的預設操作模式是預設安全的,並且可以在不受信任和/或公共網路上執行。

控制平面到節點

從控制平面(API 伺服器)到節點有兩條主要的通訊路徑。第一條是從 API 伺服器到叢集中每個節點上執行的 kubelet 程序。第二條是透過 API 伺服器的 **代理** 功能從 API 伺服器到任何節點、Pod 或服務。

API 伺服器到 kubelet

API 伺服器到 kubelet 的連線用於:

  • 獲取 Pod 的日誌。
  • 附加(通常透過 `kubectl`)到正在執行的 Pod。
  • 提供 kubelet 的埠轉發功能。

這些連線在 kubelet 的 HTTPS 端點終止。預設情況下,API 伺服器不驗證 kubelet 的服務證書,這使得連線容易受到中間人攻擊,並且在不受信任和/或公共網路上執行是**不安全的**。

要驗證此連線,請使用 `--kubelet-certificate-authority` 標誌向 API 伺服器提供一個根證書包,用於驗證 kubelet 的服務證書。

如果無法做到,如果需要避免透過不受信任或公共網路連線,請使用 API 伺服器和 kubelet 之間的 SSH 隧道

最後,應啟用 Kubelet 認證和/或授權 以保護 kubelet API。

API 伺服器到節點、Pod 和服務

從 API 伺服器到節點、Pod 或服務的連線預設為純 HTTP 連線,因此既未認證也未加密。它們可以透過在 API URL 中的節點、Pod 或服務名稱前加上 `https:` 來透過安全的 HTTPS 連線執行,但它們不會驗證 HTTPS 端點提供的證書,也不會提供客戶端憑據。因此,雖然連線會加密,但它不提供任何完整性保證。這些連線目前**不安全**,不能在不受信任或公共網路上執行。

SSH 隧道

Kubernetes 支援 SSH 隧道 來保護控制平面到節點的通訊路徑。在此配置中,API 伺服器會向叢集中的每個節點發起一個 SSH 隧道(連線到監聽 22 埠的 SSH 伺服器),並透過該隧道傳輸所有指向 kubelet、節點、Pod 或服務的流量。此隧道確保流量不會暴露在節點執行的網路之外。

Konnectivity 服務

特性狀態: Kubernetes v1.18 [beta]

作為 SSH 隧道的替代方案,Konnectivity 服務為控制平面到叢集的通訊提供 TCP 級代理。Konnectivity 服務由兩部分組成:控制平面網路中的 Konnectivity 伺服器和節點網路中的 Konnectivity 代理。Konnectivity 代理發起與 Konnectivity 伺服器的連線並維護網路連線。啟用 Konnectivity 服務後,所有控制平面到節點的流量都將透過這些連線。

按照 Konnectivity 服務任務 在您的叢集中設定 Konnectivity 服務。

下一步

上次修改於太平洋標準時間 2024 年 9 月 1 日凌晨 1:54:修復“overview/components/#...”到“architecture/#...”的斷開連結 (#47724) (7e64c2db82)