節點和控制平面之間的通訊
本文件列出了 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 或服務的流量。此隧道確保流量不會暴露在節點執行的網路之外。
注意
SSH 隧道目前已被棄用,因此您不應選擇使用它們,除非您清楚自己在做什麼。Konnectivity 服務 是此通訊通道的替代方案。Konnectivity 服務
Kubernetes v1.18 [beta]
作為 SSH 隧道的替代方案,Konnectivity 服務為控制平面到叢集的通訊提供 TCP 級代理。Konnectivity 服務由兩部分組成:控制平面網路中的 Konnectivity 伺服器和節點網路中的 Konnectivity 代理。Konnectivity 代理發起與 Konnectivity 伺服器的連線並維護網路連線。啟用 Konnectivity 服務後,所有控制平面到節點的流量都將透過這些連線。
按照 Konnectivity 服務任務 在您的叢集中設定 Konnectivity 服務。
下一步
- 閱讀有關 Kubernetes 控制平面元件 的內容
- 瞭解更多關於 Hubs and Spoke 模型
- 瞭解如何 保護叢集
- 瞭解更多關於 Kubernetes API 的內容
- 設定 Konnectivity 服務
- 使用埠轉發訪問叢集中的應用程式
- 瞭解如何 獲取 Pod 日誌,使用 kubectl port-forward